UbuntuにOpenLDAPを導入して、ldap-account-manager (LAM)で管理しています。
VirtualBOXを使った時のOSへのログインユーザーの管理や、ミドルウェアを稼働させるユーザーの管理をOpenLDAPに一元化したいと思ったので、VMとして使っている主なOSでのldap設定をまとめました。
- 前提知識
- CentOSなど(RedHat系)でのldapログイン設定
- Ubuntuでのldapログイン設定
- Debian 6.0.3でのldapログイン設定
- FreeBSD 9.1でのldapログイン設定
- さいごに
前提知識
LDAPの設定は様々なミドルウェアで行なえますが、微妙に設定できる名称や設定方法が異なります。
共通部分としてはサーバー名、ポート番号の他にバインドDN(とそのパスワード)、BaseDNなどがあります。
製品によってはユーザー名を構成するサブディレクトリ(ou=People等)の指定ができるものがあります。
また階層を辿るために、base,one,subなどのスコープを設定できるものもあります。 何も設定されていないOpenLDAPは自由に階層を辿る事ができるため、全部のディレクトリ情報を表示する事も可能な事が多く、サンプルもそのように構成されている場合があります。
しかし実際には、ディレクトリ全体を辿られてしまうと社員名とID,e-Mailアドレスとの紐付けなどをごっそり持っていかれる可能性があるため、自分自身のディレクトリ情報以外は編集ができず、それ以外の情報はDNで直に指定しないと閲覧できないように設定されている場合もあるでしょう。
LDAPについての設定方法は標準的な部分と、非標準的な暗黙知によって構成されています。 ActiveDirectoryを前提にしていると、Netscapeに由来するようなDirectory構成
ldapserverやldapbasednに指定するサーバー名やBaseDN名は適宜変更してください。
CentOSなど(RedHat系)でのldapログイン設定
以前のブログでも書いていますが、コマンドラインから設定する事が可能です。
$ sudo authconfig --enableldap --enableldapauth --ldapserver=openldap.example.org --ldapbasedn="ou=accounts,dc=example,dc=org" --updateall
これはCentOS 5.4で試した設定方法ですが、CentOS 6.3でも同様に使えます。
Ubuntuでのldapログイン設定
UbuntuではガイドのLDAPClientAuthenticationにあるように2つのコマンドを実行することでLDAPを設定する事になっています。
$ sudo apt-get install ldap-auth-client nscd $ sudo auth-client-config -t nss -p lac_ldap
Ubuntu 12.04 LTSで確認したところ次のようなログインできない問題が発生しました。
- ログインできず、/var/log/auth.logに次のようなメッセージが表示される pam_ldap: could not open secret file /etc/ldap.secret (No such file or directory)
- $ getent passwdではUserが表示されるのに、ログインできない
存在しない/etc/ldap.secretの問題
前者の/etc/ldap.secretを要求するのは、/etc/ldap.confでrootbinddnを有効にしているからです。
auth-client-configの設定画面で、クライアントからのパスワード変更を許していないので適当なrootbinddnと空のパスワードを入力したのが原因でした。
/etc/ldap.confからrootbinddn行の先頭に#をつけてコメントにする事で解決しました。
user名は認識されるのにログインできない
単純にnscdがリスタートされていないだけでした。
プロセスを再起動:$ sudo /etc/init.d/nscd restart して、無事にログイン($ ssh user1@example.org)する事ができました。
Debian 6.0.3でのldapログイン設定
DebianにはUbuntuにあったldap-auth-clientパッケージが存在しません。 そのためlibpam-ldap, libnss-ldapを手動で導入します。
$ sudo apt-get install libpam-ldap libnss-ldap
/etc/libnss-ldap.conf, /etc/pam_ldap.confファイルの確認
それぞれアンダースコア'_'やハイフン'-'が入っていてまぎらわしですが、この2つのファイルの内容を念のため確認します。
Ubuntuでの経験を活かして、rootbinddnやパスワードへは空文字列を入力してみましたが、libnss-ldap.confではrootbinddnが何も指定されないまま有効になっていました。
パスワード変更にはOSの機能を使わない事にしているので、今回もrootbinddn行はコメントアウトします。
面倒であれば、apt-getの実行時にadminのDNとパスワードを入力する事で、編集なしで良くなるはずです。
最後に/etc/nsswitch.confを有効にする
nsswitch.confなんて昔のBSD系やLinux OSにはなかったんですけどね…。Solaris 2.2か2.4ぐらいを触った時の衝撃といったらありませんでした…。
他のOSと同様にnsswitch.confのpasswd, group行のcompatをfiles ldapに変更すれば完了です。
nscdのリスタート
ここまでで、LDAPに登録したIDにsu -の実行やログインができない場合には、nscdをリスタートしてみてください。
$ sudo /etc/init.d/nscd restart
基本的にはこれで完了するはずです。
FreeBSD 9.1でのldapログイン設定
基本的な流れはガイドのLDAP Authenticationの中にあります。 導入が必要なPortsは以下の通りです。
- net/nss_ldap
- security/pam_ldap
自動的に両方のPortsが依存しているnet/openldap24-clientも導入されます。
Portsのインストール(# make install)が完了したら、以下のように3つのファイルを編集するとLDAP認証が有効になります。
/usr/local/etc/nss_ldap.confの設定
基本的にはurlかhost,それにbaseを設定すれば動きますが、使っているLDAPサーバーのディレクトリ構成やサーバー自体の設定によっては必要な追加設定があるかもしれません。
/etc/pam.d/loginの編集
sshd経由でのログインも行なうのであれば、/etc/pam.d/sshdの設定も変更する必要があるはずです。
サンプルはガイドにあるので詳細は省きますが、auth sufficient /usr/local/lib/pam_ldap.so no_warnの設定を入れれば完了です。
/etc/nsswitch.confの編集
ここまでの設定が完了していて、/etc/nsswitch.confファイルのgroup行とpasswd行をcompatからfiles ldapに変更すればログインにldapが使われるようになります。
さいごに
LDAP認証ではBindDNやらAdminDNやらRootBindDNやら、似たようなものや、実質同じものが名前をかえて登場します。
LDAPサーバーの動きをちゃんと捉えるのは面倒ですが、いまならLPI-Japanが無償で配布している高信頼システム構築標準教科書やLPIC Level 3の教本なんかが、良いとっかかりになるはずです。
動きから抑えるのが良いのですが、普段はシステムの裏側にいて、簡単にldapsearchが試せる本番環境というのもあまりありません。
ネットワーク屋さんがルーター管理にRADIUSを動かしても特権用の共有IDなんかをファイルベースで作って終りだったり、本来はLDAPを使うべき場面なのに、他の方法で代用されている場合もあるかもしれないですね。
会社や学校でLDAPサーバーがあっても、それがLDAPサーバーだと気がつかない場合があるかもしれませんし、アクセス制御が厳密でなかなか挙動をリバースエンジニアリングするのは難しい場合もあるかもしれません。
なんにしてもLDAPサーバーを試す環境はいまのところ自分で動かすしかないので、単純にサーバーと管理ツールを入れて終りにしないで、高可用性を保つために何が必要か、よりセキュアな環境にするためには何ができるのか、考えてみると良いでしょう。