Humanity

Edit the world by your favorite way

LDAPでユーザの一元管理 (2回目)

DebianでLDAPサーバ - Humanity
この記事が見にくすぎるのでもう一回書くことにする。
当時のエラー状況とかも書いてるので相当見にくいのと文章が酷い。
手順書がほしいならちゃんとした手順書書けって話ですが...


以下、項目ごとにサーバでの作業だったら「(サーバ)」、クライアントだったら「(クライアント)」と書いてます。

(サーバ) mv /etc/ldap/slapd.d{,.bak}

このディレクトリがあるとslapd.confが無視られるので。
slapd.dかslapd.confどっちかで書けってことらしい。

(サーバ) /etc/ldap/slapd.conf

以下の内容を/etc/ldap/slapd.confに保存。

modulepath      /usr/lib/ldap
moduleload      back_bdb.la

include         /etc/ldap/schema/core.schema
include         /etc/ldap/schema/cosine.schema
include         /etc/ldap/schema/inetorgperson.schema
include         /etc/ldap/schema/nis.schema
pidfile         /var/run/slapd/slapd.pid
argsfile        /var/run/slapd/slapd.args
database        bdb
suffix          "dc=example,dc=com"
rootdn          "cn=Manager,dc=example,dc=com"
rootpw          secret
directory       /var/lib/ldap

slaptestで内容が正しいかチェック。

$ sudo slaptest -f /etc/ldap/slapd.conf
config file testing succeeded

(サーバ) URI

URI     ldap://localhost/dc=example,dc=com

を/etc/ldap/ldap.confか~/.ldaprcに追記。
意味は...ldap系コマンド打つ時省略できるんだったような...

(サーバ) slapd起動

$ sudo /etc/init.d/slapd start
Starting OpenLDAP: slapd.

(サーバ) テスト用のユーザ追加

以下の~/user-ldapuser.ldifをldapaddで追加する。

dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
dc: example
o: example

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: uid=ldapuser,ou=People,dc=example,dc=com
objectClass: account
objectClass: posixAccount
uid: ldapuser
cn: ldapuser
userPassword: ldapuser
loginShell: /bin/bash
#uidNumber: 1000
#gidNumber: 1000
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/ldapuser
$ sudo ldapadd -x -D "cn=Manager,dc=example,dc=com" -f ~/user-ldapuser.ldif -W -c
Enter LDAP Password:
adding new entry "dc=example,dc=com"
ldap_add: Already exists (68)

adding new entry "ou=People,dc=example,dc=com"
ldap_add: Already exists (68)

adding new entry "uid=ldapuser,ou=People,dc=example,dc=com"

-cオプションつけないと最初の「ldap_add: Already exists (68)」のエラーの後終了しちゃうので必要。

(クライアント) クライアントの設定

クライアントをLDAPを参照するよう設定。

$ sudo apt-get install libnss-ldap libpam-ldap

どちらのパッケージもインストール時にいろいろ訊いてくるので、その際の答えはこちら参照。
というかクライアントの設定は自分で書くより
このページの説明がずっと分かりやすいと思うのでこのページ参照してくださいね。(にこっ
LDAP認証(OpenLDAP)の構築 - オープンソースのアカウント管理ソフトウェア LISM

DebianFedoraのauthconfig-tuiとかUbuntuのauth-client-configみたいなのないの...

追記:少なくともDebianならpam-auth-updateってスクリプトが、インストール時のdebconfの質問によって自動的にPAMの設定ファイルを書き換えてくれるので、この設定は必要なしという結論に。
pam-auth-updateでPAMの設定を変える - Humanity

(クライアント) クライアントからldapuserが見えることを確認

上記の設定で/etc/nsswitch.confとか/etc/pam.d/common-*とか書き換えたと思います。
そしたら再起動なしですぐに設定が反映されるので

$ id ldapuser
uid=1001(ldapuser) gid=1001 所属グループ=1001

このようにちゃんと見えてるようだったらOK。


自分は何回か追加と削除を繰り返して試しました。
その際、おそらくlibnss-ldapとかインストールする時にnscdという
LDAPの検索結果をキャッシュするデーモンがインストールされて起動している状態だと思うので、
サーバ側で削除してもしばらくユーザが見えてるとかいう場合があります。

その際は

$ sudo service nscd force-reload

して

$ id ldapuser

するとちゃんと「id: ldapuser: No such user」みたいに言われると思います。

ちなみに追加と削除のコマンドは以下の通りです。
削除の際はdnを指定する。
dnは絶対パスみたいなもの。
詳しくはおググりください。

追加

$ sudo ldapadd -x -D "cn=Manager,dc=example,dc=com" -f /home/takuya/user-ldapuser.ldif -W -c

削除

$ sudo ldapdelete -x -D 'cn=Manager,dc=example,dc=com' 'uid=ldapuser,ou=People,dc=example,dc=com' -W

(サーバ) セキュリティ

最後にちょっとだけ。(本当にちょっとだけ)
ユーザが無事他のホストから参照できることを確認したら
ちょっとだけセキュリティ的にベターな設定をslapd.confに書く。
書いたらslapd再起動。

access to *
       by dn="cn=Manager,dc=example,dc=com" write
       by self write
       by * read

全然ゆるいので厳しくする場合は自分で調べてください(目そらし)

あわせて読みたい

/etc/hostsのエントリの共有 - Humanity
これはまだ読める(自分的には)レベルだったのでもう一回手順書かずに済みそう。


今日はDHCPサーバ廃止とDNSサーバ廃止して、
それぞれ固定IP割り振ったり、LDAPで管理しようと作業してたのです。
というかこの作業も2回目なんだけど...