Let's LDAP

VMが動いたところで、LinuxのPAMでLDAPを使ってみる。ずらっと作業メモ。
@IT "LDAPによるパスワードの一元管理"を読みつつ。

インストール

最近はコマンド一発でインストールできる便利な時代。
さくっと openldap-serversパッケージをインストール。

自動的にldapユーザーとldapグループまで用意される。
/etc/ssl/openldap/にSSLのとりあえず用鍵まで用意されている。
至れり尽くせり。


サーバー起動

/etc/openldap/slapd.confをちらっと見てみると、インストールしただけで dc=example,dc=com なディレクトリが設定済み。
SSL用の鍵も設定してあるので、何も考えずに

/etc/init.d/ldap start

ldapもldapsも両方起動完了。なんだこりゃ。


これだと管理用パスワードとか全然わからないので、再度/etc/openldap/slapd.confをチェック。

rootdn    "cn=Manager,dc=example,dc=com"

らしいので、メモメモ。
rootpwがコメントアウトしてある。良くわからないが、とりあえず平分で適当に指定しておく。

rootpw    "HogePw"

openldapを再起動。


ログインパスワード連動

コマンド一発で nss_ldapパッケージと pam_ldapパッケージをインストール。
nsswitchとPAMが参照するLDAPの設定ファイルは/etc/ldap.confらしいので、見てみる。
これは検索ディレクトリがdc=example,dc=comでは無かったので、変更。

base dc=example,dc=com

hostはlocalhostになっているので、放っておく。


nsswitchの設定を変更して、LDAPを検索するようにする。
/etc/nsswitch.confを変更。

passwd:   files nisplus ldap
shadow:   files nisplus ldap
group:    files nisplus ldap

NIS+は使っていないけど、害はなさそうなので放っておいてみる。
ホスト名の名前解決などは、今回はとりあえずそのままにしておく。


続いてPAM認証の元締め、system-authがLDAPを参照するようにする。
/etc/pam.d/system-authは/etc/pam.d/sshやlogin、xdmなども参照しているので、これを設定するだけでsshなども同時に設定される。(参照している、と言っても、参照するようにディストリビューションがうまくやってくれているだけで…)
/etc/pam.d/system-authを編集。

...
auth sufficient  pam_ldap.so  use_first_pass
auth required    pam_deny.so

...
account [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore] pam_ldap.so
account required  pam_deny.so

...
password sufficient  pam_ldap  use_authtok
password required    pam_deny

...
session optional  pam_ldap.so

設定の意味は良くワカラナイが、とりあえずよしとする。


近ごろのデーモン方々は大方PAMを参照できるので、PAMでLDAPが使えれば、大方のサービスをLDAPで認証できる、と。


LDAPにユーザーを追加

ここからはOpenLDAP構築メモFreeBSD 5.1-RELEASEにおける新機能の概要と活用例 (2/6)を読みつつ。FreeBSDだろうとアカウントの記述方法は同じだと思う…posixとか書いてあるし。


さくっとldap-clientsパッケージをインストール。

とりあえず動作確認。

ldapsearch -h localhost -x -b '' -s base'(objectclass=*)' namingContexts

これで動作確認ができるらしいので、そうする。
namingContexts: dc=example,dc=com などなどと表示されているので、OKの模様。


最初のエントリ。ドメインのエントリ?要るので作れと。
init.ldifファイルを作成

dn: dc=example,dc=com
objectclass: dcObject
objectclass: organization
o: example.com Hoge
dc: example

そしてLDAP追加。

ldapadd -x -d 'cn=Manager,dc=example,dc=com' -W -f init.ldif

パスワードはHogePw



続いて、管理者のエントリ。コレも要るので作れと。
manager.ldif

dn: cn=Manager,dc=example,dc=com
objectClass: organizationalRole
cn: Manager

そしてLDAPに追加。

ldapadd -x -d 'cn=Manager,dc=example,dc=com' -W -f manager.ldif

ユーザーを格納するエントリ。だんだんわかってきた。
posix-user.ldif

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People
ldapadd -x -d 'cn=Manager,dc=example,dc=com' -W -f posix-user.ldif


グループを格納するエントリ。
posix-group.ldif

dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group
ldapadd -x -d 'cn=Manager,dc=example,dc=com' -W -f posix-group.ldif


そしてユーザーを登録。
user-hoge.nidl

dn: uid=hoge,ou=People,dc=example,dc=com
uid: hoge
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
uidNumber: 10000
gidNumber: 10000
gecos: Hoge Hoge Foo Bar
homeDirectory: /home/hoge
loginShell: /bin/bash
cn: Hoge
userPassword: {MD5}6nA+eqHv2gBk6qUH2eirfg==
shadowLastChange: 10000
shadowMin: 0
shadowMax: 99999
shadowWarning: 14
ShadowInactive: 99999
shadowExpire: -1

userPasswordは

slappassword -h '{MD5}'

で求める。このパスワードは安直に'hoge'
いざ登録。

ldapadd -x-D 'cn=Manager,dc=example,dc=com' -W -f user-hoge.ldif


忘れずにグループも登録。
group-hoge.ldif

dn: cn=hoge,ou=Group,dc=example,dc=com
cn: hoge
objectClass: posixGroup
gidNumber: 10000
memberuid: hoge
ldapadd -x-D 'cn=Manager,dc=example,dc=com' -W -f group-hoge.ldif


objectClass: posixAccountやposixGroup、shadowAccountの宣言はnis.schemaにあるらしい。objectClass: acountはcosine.schema。


使ってみる

hoge用のホームディレクトリを作っておく。

cp -R /etc/skel /home/hoge
chown -R hoge:hoge /home/hoge

…いや待て。chown hoge:hogeの時点でLDAPが稼働しているのではないか…。


確認のためSSHでログイン。

ssh hoge@localhost

…ログイン成功。問題なし。



…そんなもんですか…。最近のディストリビューションは凄いですね…。