ApacheのBasic認証でLDAPを使う

さて、「ユーザ」なる概念の情報がLDAPサーバに準備できたので、早速それを使ってみよう。
立ち上げているApacheのHTTP認証(Digest)をファイルベースからLDAPベースに替える。

http://www.9203.net/~takech/pukiwiki/index.php?LDAP%2FOpenLDAP%2FApache%A4%CE%C7%A7%BE%DA
http://www.kensuke.jp/~kensuke/pukiwiki/index.php?etch%2Fpark2%2F10_apache2

上記サイトなどを参考にやってみた。

authnz_ldapなるモジュールが最初からはいっていたみたいなので、それをa2enmodで有効化して、以下を参考に設定してみた。

http://httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html#examples

Digest認証にすることができるかわからないが、LDAPで登録したユーザでBasic認証できた。

(このauthnz_ldapモジュールはDigest認証には対応していないらしい。SSL併用が必要ですな。)

後日以下をやりたい

LDAP Account Managerのインストールと設定

さてLDAPの概要は分かったような気がしてきた。
しかし、当初の目的「認証連携、Posix/Apache/Redmineアカウント一元管理」のためにはどうしたらよいだろう。
アカウント管理に用途を限らないLDAPは自由度が高すぎて、色々学ぶことや決め事が必要そうだ。
アカウント管理のためには、どういうツリーをつくるべきなののか?
いわゆる設計というやつである。ベストプラクティス的なものが世の中にあるはずだが・・

というわけで、おそらくそういう人をターゲットにしたであろう、
フリーのPHP実装、アカウント管理特化型WebUI LDAPクライアントにたどりついた。その名もずばりldap-account-manager。
http://lam.sourceforge.net/

インストール

早速インストールしてみた。

apt-get install ldap-account-manager

なんだか、勝手にapache2がprefork MPMになったりしてビビッたが、なんだかインストールされてくれた。
既にapache2はインストール済みで色々使っている状態だったので、へんな設定上書きされるのが心配だったが、結論だけ言えばそれは杞憂に終わった。さすがUbuntu

ちょっとだけ整合性を取る調整をしたあと、ブラウザで、http://example.com/lam/ 的なURLを入れると、「PHPで使えるメモリが16Mしかなくて困る。php.iniをいじって64M以上にしてくれ」的なエラーメッセージが出てきた。最初「php.iniってどこにあるの?」と困ったが、調べたところintrepid (ubuntu8.10)では/etc/php5/apache2/php.ini なんてところにあることが分かった。該当部分を編集してapache再起動したところ、こんな感じのログイン画面が出てきた。

こういう画面が出たということは、インストール自体はOKということだろう。


LDAP Account Manager (LAM)の設定

「さて、早速使ってみよう。」と思った矢先、困った。「どうやってログインするんだ?」

先ほどのスクリーンショットは、インストール直後は、正確にはちょっと違っていて、実はUser Nameプロダウンのところに「admin」(slapdインストール時に作られたadminユーザ)なんていう風には出てこない。そうでていれば迷わなかったが、最初は「Manager」なんていうのが出ていて、「誰よこれ?」的理由でログインできずに少し混乱した。この部分は後で説明するが、正解は、「LAM設定をする」というプロセスが必要ということ。先ほどインストールしたslapdの初期設定とこのLAMとやらの初期設定は全然リンクしてません。ですので、そこをヒモ付けてやる作業が必要になる。

具体的には、以下のとおり

  • このLAMとやらには、「マスターパスワード」という概念があって、それは初期設定では「LAM」になっている。
  • 先ほどのログイン画面スクリーンショット右上のLAM configurationメニューを押すと以下がでてくる

 

  • ここで下のメニューを押すと、以下のようなのがでてくるので、




このスクリーンショットも設定後のものなので、インストール直後は設定値がちょっと違っていた。縦長の画面だが、上から見ていこう。

  • まず、Server-settingsのTreeSuffixの部分。ここには、マシンのFQDN名を入れた。これは、slapdのインストール時に初期値としてそう設定されるからである。(と思われる。)
  • つぎに、Unix> Password Hash TypeをPLAINに変更した。が、これは、意味がなかったようだ。初期値であるSSHAにしておくのが良さそうだ。
  • 最後に、Security settings> List of valid usersの項目だ。 最初、ここにManagerなんていうものが入っているので、最初のログイン画面で混乱させられたわけだ。ここには、自分のサーバのFQDNにあわせて、上記のような値を書いてやる。そうすると、slapdインストール時に設定したadminユーザとそのパスワードで、先ほどのLAMのログイン画面(LAMと入れたところではない)からログインできるようになる。
  • ログインすると、以下のようにLDAPの中身をいじる(ユーザ管理をする)メニューがでてくる。

  • あとは、UIにしたがって、ユーザなりグループなりを作ればよい。この部分は比較的分かりやすい。

LDAP Browserで、設定内容を確認してみる。

フリーのLDAP Browserというソフトがあって、それを使うとLDAPのツリーの中身をGUIで整理して見られるそうな。
取ってきてインストールしてみた。

こんな感じのWindowsアプリである。


上位版は有料だが、とりあえずLDAP学習・理解という意味ではまずはこのフリー版で十分だと思った。

先ほど立てたslapdの中身を見るには、こんな感じで、場所指定をすればよいようだ。

まずこんな風に、ホストのIPアドレスやポートを入れるのだが、そこは悩まずにいける。その次のBaseDNってところで、「なにそれ?」的になったが、ここで、cn=configとセットすると、slapdの設定情報を見ることができるという寸法らしい。たぶん、サーバ側で以下のようになっているのとこれは対応している。

root@thyme:~# ls -l /etc/ldap/slapd.d/
total 8
drwxr-x--- 3 openldap openldap 4096 Mar  7 02:21 cn=config
-rw-r----- 1 openldap openldap  407 Mar  7 01:50 cn=config.ldif

で、次のCredentialペイン。
ここで、slapdインストール時に入力したパスワードが必要になるようだ。

Ubuntu8.10 (intrepid) にOpenLDAPをインストールして設定

OpenLDAPのインストール

環境としては、Ubuntu server 8.10 である。ここにまずはOpenLDAPとやらをインストールすることからはじめた。インストール自体は非常に簡単で、以下で一発ではいる。

apt-get install slapd

なんだか、ほっぺたが痛くなるような名前だなぁ・・(slap = 平手打ち)
途中で、adminのパスワードなるものを設定させられたが、適当に入力したところ、すんなりインストール完了。(これは後で使う)
しかし、すぐに難関にぶつかった。

Ubuntu8.10でのOpenLDAPの設定

さて、どうやって動かすのだろう。。ていうか、もう動いてるね・・ 

root@hoge:~# ps -fe|grep slapd
openldap  6027     1  0 01:50 ?        00:00:00 /usr/sbin/slapd -g openldap -u openldap -F /etc/ldap/slapd.d/

いや、デーモンが動いてることはわかったけど、いったいこれは何?これをどう使うのだ??

まずは設定しないとな・・ということで、ググってみたのだが、いまいちよくわからない。
そこらじゅうのサイトに「/etc/ldap/slapd.conf なるファイルをいじってみよう」と書いてあるのだが、そんなファイルは見つからないのだ・・ 

調べてみると、こんなことが書いてあった→https://help.ubuntu.com/8.10/serverguide/C/openldap-server.html
要するに、「8.10からはLDAPサービスを止めずに設定を書き換えたり動機したりできるように、設定自体をLDAPの中に書いちゃうようになりましたよー。」的な話のようだ。

タナボタってこともあるんですね。「めんどくせーな」と思いながら、上記Ubuntu提供のチュートリアルをちょっと腰をすえて読んで、指示に従って色々動かしてみたところ、なんとなくLDAPなるものがどういう風に動くのかわかってきた。いわゆるひとつの「手を動かさないとよくわからない」「手を動かすと分かった気がしてくる」というヤツですな。

その後、あとになってから、以下のような分かりやすい記事を発見。
http://d.hatena.ne.jp/ehara_kw/20080122/1200972379

LDAPで認証統合をしてみよう!

会社で仮想マシンを5台ほど割り振ってもらって、色々することとなった。その上に、Redmineを立てたり、Subversionを立てたりもする。分散したプロジェクトで、管理するリポジトリが二つ、Redmineも二つ、それぞれ地球上の位置としては数千キロ以上離れた場所に立てる。

で、仮想マシンを一台立ち上げて、Redmineをインストールし、Redmineのアカウント作ろうとして、固まった。

えーと、何人分つくるんだ? っていうか、それはいいとして、何多重になる?? 無駄多すぎ・・;;

RedmineにはLDAP認証連携機能がついているように見えたので、これはLDAPをちょっとやってみるべきかなという風に考えた。

そのとき、金曜日の午後6時・・知識ほぼゼロから色々やってみたんだけど、さっぱりわからず、無常にも時はすぎ、10時をまわった。

久しぶりに「徹夜してもいっか」的気分になったが、ちょっと冷静になって家に帰ることにした。家に帰って、ごはんたべて、風呂入って、自宅サーバに戦場を移し、色々格闘して、今、翌日の朝4:51。やっとなんとか意味のあることができたので、その成果について記したい。

i-name をもう一個取っちゃったよ。

数ヶ月前にlinksafeってとこで =akioっていうi-nameを取ったけど、先ほど、勢いで、もう一個=shimonoってのも取っちゃったですよ。自分、i-nameってOpenIDとして使えるってことぐらいしか分かってないんだけど、ちょっといじってみて、今回気付いたことを書いてみる。

=shimono とかっていうi-nameをコミュニティi-nameにすることができた。

=shimonoをコミュニティi-nameにしたら、子供のi-name すなわち
=shimono*akio (私)だとか =shimono*keiko(妻)だとか、そういうものを発行することができた。

http://linksafe.name では、取ったi-nameをコミュニティi-nameにするのも、
コミュニティi-nameの子i-nameを作るのも無料だった。(1年だけかな?)

前項から導き出される結果として、=shimono*akio*hogeとか=shimono*akio*hoge*piyoとか
そういうのも無料でつくれるっぽい。

ただし、有効期限が1年で設定されて、延長には年間8ドルかかるような画面がでてきた。(うーむ。そういう商売か。マルチっぽいなw)

ということで、みなさん。「家族のために、苗字の=i-nameとるってのもよさそうですよ。」ってことで。

URI Templateを意識して波カッコ使おう

結構いまさら話題なのかもしれなく、少々恥ずかしいのですが、URLの例なんかを書くとき、

http://example.com/{user-id}/{object-id}

なんて書き方をよくしますよね。上記の例だと「パス第1階層にはuser-idを入れて、第2階層にobject-idを入れてね」とか、そういうことを伝えたいために。

で、自分はこれまで、上記なようなものを書くとき、中(波)括弧を使わず、鍵括弧あたりを使っちゃったり、そのときの気分でいろいろやっちゃってたんですけど、URI Templateという仕様が以下のように定められつつあるわけなので、今後は中(波)カッコをつかって書いた方がいいなと思いました。

http://tools.ietf.org/html/draft-gregorio-uritemplate-03

URI Template 自体は上記読めばわかる通り、「中括弧使いましょう」だけじゃなくて、変数や配列や簡単な演算までサポートしたTemplate Engine仕様として定められていて、自分はまだその詳細はまだ読めていませんが、*1まず波カッコを使うことで、「URI Templateを使うぞ」っていう気分が盛り上がっていいじゃんと思うわけです。

RESTful にWebをつくってゆくときって、URI設計が本質的な作業になるわけで、その点、このURI Templateの仕様理解はこれからのWeb技術者のMUST知識になりそうな予感。(っていうか、既にMUST知識だったりする?w、ごめんなさーい^^ 今まで認識甘かったッす)

そういうわけで、まずはノートに設計イメージ書くときとか、仲間との議論でホワイトボードにURI書くときなんかにも、波カッコ使うところからはじめてみようかなと思うわけです。

*1:以下の記事なんかもちゃんと読んで、キャッチアップしなきゃな〜 http://d.hatena.ne.jp/n_shuyo/20080614/uritemplates http://d.hatena.ne.jp/ZIGOROu/20081211/1229008879