DebianでLDAPサーバ
おおむね以下の記事通りに進めていきます。しかしいくつかハマったのでメモ。
設定 (よびちしき)
ldap.confとslapd.confは違う。
ldap.confはldap***なコマンド(要するにクライアント)のための設定ファイル。
slapd.confはサーバプログラム(slapd)のための設定ファイル。
詳細はお近くのman ldap.conとman slapd.confをあたってください。
slapd.conf
openldapサーバの本体slapdが参照するファイルです。ldap.conf
OpenLDAP 構築メモ
ldapコマンド(ldapadd, ldapmodifyなど)が参照するファイルです。
slapd.conf
ここの記事からDebianのディレクトリ構成に合わせるために改変しています。
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 Unrecognized database type (bdb) /etc/ldap/slapd.conf: line 18: <database> failed init (bdb) slaptest: bad configuration file!
エラー吐いた。ググる。
Is slapd built with its backends as modules? If so, you need to moduleload the BDB backend first.
Re: Starting OpenLDAP: slapd - failed: Unrecognized database type (bdb).
モジュールをロードしないといけないらしい。
ロード方法が上のURLの返信元に載ってたので見よう見まねでこんなのを/etc/ldap/slapd.confに追加。そしたらエラー出なくなった。
modulepath /usr/lib/ldap moduleload back_bdb.la
サーバ(slapd)起動
$ sudo /etc/init.d/slapd start Starting OpenLDAP: slapd. $ ps -ef | grep [s]lapd openldap 4376 1 0 19:54 ? 00:00:00 /usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d
テスト用のユーザ追加
ldapuserってユーザ追加する。
以下のpasswd.ldifを適当なディレクトリに保存する。
自分は~/ldap/passwd.ldifに置いた。
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
次にldapaddコマンドでLDIFファイルを登録。
$ sudo ldapadd -x -D "cn=Manager,dc=example,dc=com" -w secret -f ~/ldap/passwd.ldif ldap_bind: Invalid credentials (49)
ちょ
なんかエラー出た
「ldap_bind: Invalid credentials (49)」で検索してみるも、結構色んな原因があるらしく、ページを見つける度に設定ファイルやら何やらいじくりまわす事数十回.
これ↓が原因だった.- Light Material -: OpenLDAP for Win32 - その1.> OK, I think I see the problem... it looks like it's not possible to do a simple bind against the rootdn if your password is specified in cleartext. The workaround would be to use slappasswd like this:
>
> % slappasswd -s secret
> {SSHA}ioGadl0574KxRPecJ7Pb5q33j2x/Fi3w
rootpwに平文で指定してはダメということか。
ビルド時に--disable-cleartextとかいうオプションで無効になってる場合があるらしい。
ということでslappasswd -s secretで出力された文字列をrootpwに貼り付ける。
しかし直らない。
げんいんちょうさ
slapd.confファイルのrootpw行がスペースで始まっているだとか
DNが違ってるだとかでも全部同じエラーが出るらしく
うぜーとか思ってたらデバッグレベルが設定できるらしい。これ設定すればいろいろ情報出してくれるらしい。
指定する数字の意味は以下の通り。
Enables extra logging for the LDAP task in Domino, with a binary debug routine, Use in conjunction with Debug_Outfile.
1 = Show Query Information
Notes.ini Entry - LDAPDebug
2 = Show Result Information
3 = 1 & 2
4 = Authentification Information
5 = 1 & 4
6 = 2 & 4
7 = All of the above
8 = Even more verbose information (no details known)
9 - 15 = Summaries of the above
$ sudo ldapadd -x -D "cn=Manager,dc=example,dc=com" -f ldap/passwd.ldif -w secret -d 7
ldap_create
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP localhost:389
ldap_new_socket: 4
ldap_prepare_socket: 4
ldap_connect_to_host: Trying 127.0.0.1:389
ldap_pvt_connect: fd: 4 tm: -1 async: 0
ldap_open_defconn: successful
ldap_send_server_request
ber_scanf fmt ({it) ber:
ber_scanf fmt ({i) ber:...
意味不明すぎわろた
だれてきた
syslogとかも見たけどよくわからん。ldapaddしたタイミングでは何も書き込まれてないようだし*1。-vオプションとかつけてみてもやっぱりわからん。
で、「ldapadd ldap_bind invalid credentials 49」とかの検索結果を見てたら下の方にこんなページを発見。
hahaha.. my problem solved! I just need to do delete the directory using command "mv /etc/openldap/slapd.d". This will force the openldap look for my slapd.conf file while starting the service
installation - Installing OpenLDAP on Fedora 12: ldap_bind: Invalid credentials (49) - Server Fault
お?と思って/etc/init.d/slapd見てみる。すると
# Load the default location of the slapd config file if [ -z "$SLAPD_CONF" ]; then if [ -e /etc/ldap/slapd.d ]; then SLAPD_CONF=/etc/ldap/slapd.d else SLAPD_CONF=/etc/ldap/slapd.conf fi fi
/etc/ldap/slapd.dがあった場合にはslapd.confを読み込まないようになってる。
どっちも読み込むんじゃねーのかよ ちくしょう...
というわけで
$ sudo mv /etc/ldap/slapd.d{,.original}
したら無事ldapaddで登録できた。
$ sudo ldapadd -x -D "cn=Manager,dc=example,dc=com" -f ldap/passwd.ldif -w secret adding new entry "dc=example,dc=com" adding new entry "ou=People,dc=example,dc=com" adding new entry "uid=ldapuser,ou=People,dc=example,dc=com"
ktkr!!!
セキュリティ
Manager(?)のみ書き込み許可にする。slapd.confに次を書く。
access to *
by dn="cn=Manager,dc=example,dc=com" write
by self write
by * read
あとパスワードも乱数で作ったパスワードとかに変えましょう。
クライアント側の設定 (追記)
サーバ側の設定だけで満足してアップロードしてしまった...
なのでこのページを参考にクライアント側の設定をしていく。
まずは/etc/nsswtich.confとかPAMとかの設定をしてくれるauthconfigを実行する。
...がコマンドがない。ていうか冒頭で示したwikiにもDebianの場合は手動で設定するとか書いてある。
しょうがないので手動で設定。
Ubuntuはsudo apt-get install auth-client-configでクライアントの設定をしてくれるツールが入るらしい。未検証。
NSS LDAPのインストール
$ sudo apt-get install libnss-ldap
するといろいろ訊かれる。*2
あと設定ミスった、と思ってもsudo dpkg-reconfigure libnss-ldapでまた再設定できる。
それぞれの設定値はここ参考にした。
ていうかこのページにもっと早く辿り着ければよかった...orz
以下引用。
LDAP server Uniform Resource Identifier: ldap://192.168.7.12/ (Note the "ldap://", NOT "ldapi://"!)
OpenLDAP installation on Debian
Distinguished name of the search base: dc=spinlock,dc=hr
LDAP version to use: 3
Does the LDAP database require login? No
Special LDAP privileges for root? No
Make the configuration file readable/writeable by its owner only? No
Make local root Database admin. No
Does the LDAP database require login? No
Local crypt to use when changing passwords. crypt
LDAPサーバのホストアドレスはwikiには127.0.0.1って書いてあるけど
ldap://なURIで書けって言われてるような気がしたので「ldap://{サーバのIP}/」と設定。どっちでも同じかも。
「Make the configuration file readable/writeable by its owner only?」でNoを選んだらこんなん出た。
nsswitch.conf not managed automatically
For the libnss-ldap package to work, you need to modify your /etc/nsswitch.conf to use the "ldap" datasource. There is an
example file at /usr/share/doc/libnss-ldap/examples/nsswitch.ldap which can be used as an example for your nsswitch setup, or
it can be copied over your current setup.Also, before removing this package, it is wise to remove the "ldap" entries from nsswitch.conf to keep basic services
functioning.
自動で管理されてない(手動でいじった形跡がある?)ので、
/usr/share/doc/libnss-ldap/examples/nsswitch.ldap見て自分で設定してね、らしい。
あとLDAP消すときはnsswtich.confからも消すの忘れずにね、らしい。やさしいなー(インストールにてこずりすぎて感覚がマヒしている)
PAM LDAPのインストール
クライアントもDebianです。自分の場合はUbuntuでした。
作業工程がDebianとUbuntuで同じだということを確認するためにサーバのDebianでも作業していました。
おかげで慣れたのでUbuntuでインストールする時作業が格段に早くなりました。
サーバで作業中だったことを忘れていた訳ではありません。
$ sudo apt-get install libpam-ldap
これいつのまにか入ってたのでsudo purge libpam-ldapしてからインストール実行した。
設定した覚えないのに...
libnss-ldapと同じように設定値をここから引用します。
Make local root Database admin. No
OpenLDAP installation on Debian
Does the LDAP database require login? No
Local crypt to use when changing passwords. crypt
nsswtich.confいじる
c. /etc/nsswitch.confに以下の設定を記述します。
passwd: compat ldap
LDAP認証(OpenLDAP)の構築 - オープンソースのアカウント管理ソフトウェア LISM
group: compat ldap
shadow: compat ldap
PAMの設定ファイルいじる
d. PAMの設定ファイルに以下の記述を行います。
/etc/pam.d/common-account
/etc/pam.d/common-auth
auth sufficient pam_ldap.so
auth required pam_unix.so nullok_secure try_first_pass/etc/pam.d/common-password
password sufficient pam_ldap.so
password required pam_unix.so nullok obsecure min=4 max=8 md5/etc/pam.d/common-session
LDAP認証(OpenLDAP)の構築 - オープンソースのアカウント管理ソフトウェア LISM
これでPAM LDAPの設定終わり。
確認
ユーザがあることを確認すればいい。
第1回 まずは使ってみよう:そろそろLDAPにしてみないか?|gihyo.jp … 技術評論社
に則って(パクって)sshログインしてみる。
パスワードはpasswd.ldifに書いてたやつ(ldapuser)ね。
$ ssh ldapuser@{サーバのIP}
ログインできない。ぷんぷくりーん(怒) 現在調査中。
$ ldapsearch -x -D 'cn=Manager,dc=example,dc=com' -w secret -b 'dc=example,dc=com' 'uid=ldapuser' -H ldap://{サーバのIP}/
での結果はちゃんと返ってくる。ユーザとしての認識ができてない。と思ったら
$ id ldapuser uid=1001(ldapuser) gid=1001 所属グループ=1001
でちゃんと認識できている。パスワードが違うんだろうか。と思って
$ sudo passwd ldapuser
ってやったら下記のエラーが出た。
Enter login(LDAP) password:
passwd: Module is unknown
passwd: password unchanged
一応このページで示されてる通りにやったら直ったけど今度は
Enter login(LDAP) password:
passwd: Authentication token manipulation error
passwd: password unchanged
って出たのでそもそもクライアント側からパスワード変更できないのかな、と思って諦める。
ていうかldapsearchで出たpassword(base64エンコードされた値)デコードしたらちゃんとldapuserになってるしなぁ...と思いつつ。
...とふと思いだしてよく読んでみるとクライアント側にユーザ追加するのが目的なのでクライアント側にsshで接続する。
sshを起動して試してみた結果無事ログインできた。
$ ssh ldapuser@{クライアントのIP}
ldapuser@{クライアントのIP}'s password:
Welcome to Ubuntu 11.04 (GNU/Linux 2.6.38-10-generic-pae i686)* Documentation: https://help.ubuntu.com/
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.Could not chdir to home directory /home/ldapuser: No such file or directory
groups: グループID1100の名前が見つかりません。
ldapuser@laptop:/$
この記事と同じく/home/ldapuserはないのでcwdは/になってたりエラーでてるけど無事ログインできてる。
ちゃんと話を聞かない&集中力が持続せず途中から脱線するからこういうありえないミスをやらかす...まぁいいや。できたので。