DebianでLDAPサーバ

おおむね以下の記事通りに進めていきます。しかしいくつかハマったのでメモ。

インストール

sudo apt-get install slapd ldap-utils

ldap-utilsはldapaddとかldap***なコマンド群。

設定 (よびちしき)

ldap.confとslapd.confは違う。
ldap.confはldap***なコマンド(要するにクライアント)のための設定ファイル。
slapd.confはサーバプログラム(slapd)のための設定ファイル。
詳細はお近くのman ldap.conとman slapd.confをあたってください。

slapd.conf
openldapサーバの本体slapdが参照するファイルです。

ldap.conf
ldapコマンド(ldapadd, ldapmodifyなど)が参照するファイルです。

OpenLDAP 構築メモ
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
/etc/ldap/ldap.conf or ~/.ldaprc

/etc/ldap/ldap.conf開くのめんどいので~/.ldaprcに書く。

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

サーバ(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)」で検索してみるも、結構色んな原因があるらしく、ページを見つける度に設定ファイルやら何やらいじくりまわす事数十回.
これ↓が原因だった.

> 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

- Light Material -: OpenLDAP for Win32 - その1.

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
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

Notes.ini Entry - LDAPDebug

$ 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のインストール

wikiNSS/PAM 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://"!)
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

OpenLDAP installation on Debian


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でした。
作業工程がDebianUbuntuで同じだということを確認するためにサーバのDebianでも作業していました。
おかげで慣れたのでUbuntuでインストールする時作業が格段に早くなりました。
サーバで作業中だったことを忘れていた訳ではありません。

$ sudo apt-get install libpam-ldap

これいつのまにか入ってたのでsudo purge libpam-ldapしてからインストール実行した。
設定した覚えないのに...


libnss-ldapと同じように設定値をここから引用します。

Make local root Database admin. No
Does the LDAP database require login? No
Local crypt to use when changing passwords. crypt

OpenLDAP installation on Debian
nsswtich.confいじる

c. /etc/nsswitch.confに以下の設定を記述します。

passwd: compat ldap
group: compat ldap
shadow: compat ldap

LDAP認証(OpenLDAP)の構築 - オープンソースのアカウント管理ソフトウェア LISM
PAMの設定ファイルいじる

d. PAMの設定ファイルに以下の記述を行います。

/etc/pam.d/common-account

account sufficient pam_ldap.so
account required pam_unix.so

/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

session sufficient pam_ldap.so
session required pam_unix.so

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は/になってたりエラーでてるけど無事ログインできてる。
ちゃんと話を聞かない&集中力が持続せず途中から脱線するからこういうありえないミスをやらかす...まぁいいや。できたので。

*1:tailf した端末起動しといて sleep 1; sudo ldapadd ... とかやった

*2:ていうかnscdがこの段階で勝手にインストールされるのはなんでだ