玄箱X4/サーバー設定/slapd

出典: Fukudat.com

LDAP server

目次

1 インストール

apt-getでインストールする.

# apt-get install slapd ldap-utils nscd sasl2-bin

インストールの途中でなぜかadminのパスワードだけ聞かれて終わる.

dpkg-reconfigureを実行してみる.

# dpkg-reconfigure slapd

すると改めて以下のことを聞かれる.

  • DNS domain (fukudat.com)
  • organization name (fukudat.com)
  • adminのパスワード (内緒)
  • LDAPv2 protocolを使うか (yes)

適当に答える(括弧内は私の設定).もし聞かれなかったら,

これが完了すると,/etc/ldap の下に設定ファイルができていて,既に slapd が起動しているはず.

# ldapsearch -x

を実行して動いていることを確認する.

2 設定

2.1 SASL対応

/etc/default/saslauthd を編集して,以下の行を追加する.

START=yes
MECHANISMS="pam"

/etc/ldap/slapd.conf を編集して,以下の行を追加する.

# sasl
sasl-realm      fukudat.com
sasl-host       ldap1.fukudat.com
sasl-regexp     uid=admin,cn=fukudat.com,cn=.+ \
                cn=admin,dc=fukudat,dc=com
sasl-regexp     uid=(.*),cn=fukudat.com,cn=.+ \
                uid=$1,ou=People,dc=fukudat,dc=com
sasl-secprops   none
#password-hash  {CLEARTEXT}
#password-hash  {SHA}
password-hash   {MD5}

ldap1.fukudat.comはLDAPサーバーのホスト名.

/etc/ldap/ldap.conf を編集して,以下の行を追加する.

BASE    dc=fukudat,dc=com
host    ldap1.fukudat.com

ローカルに管理されるユーザ情報が入る /etc/sasldb2 というファイルのグループを一時的に変更して,slapdが認証情報を読むことができるようにする(後でこのファイルは削除する).

# ls -l /etc/sasldb2
-rw-r----- 1 root root 12288 Feb 15 11:29 /etc/sasldb2           <-- これだとopenldapユーザで動いているslapdには読めない
# chgrp openldap /etc/sasldb2
# ls -l /etc/sasldb2
-rw-r----- 1 root openldap 12288 Feb 15 11:29 /etc/sasldb2       <-- これでslapdが読めるようになった

次のコマンドで saslauthd を起動する

/etc/init.d/saslauthd start

管理者ユーザのパスワードを作成する

# saslpasswd2 -c admin@fukudat.com
Password: xxxx
Again (for verification): xxxx

SASLの認証でLDAPがサーチできるかテスト

# ldapsearch -U admin "(cn=admin)"
SASL/DIGEST-MD5 authentication started
Please enter your password: xxxx   <-- 上で設定したパスワード
SASL username: admin@fukudat.com
SASL SSF: 128
SASL data security layer installed.
# extended LDIF
#
# LDAPv3
# base <dc=fukudat,dc=com> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# fukudat.com
dn: dc=fukudat,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: fukudat
dc: fukudat

# admin, fukudat.com
dn: cn=admin,dc=fukudat,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 4
result: 0 Success

# numResponses: 3
# numEntries: 2

adminのパスワードをLDAPに登録するために,次の内容の/tmp/admin_password.ldif を作成.

dn: cn=admin,dc=fukudat,dc=com
changetype: modify
replace: userPassword
userPassword: xxxxxx           <-- パスワード

次のコマンドを実行

# saslpasswd2 -u fukudat.com -c admin
# ldapmodify -U admin -f /tmp/admin_password.ldif
# rm /etc/sasldb2                <-- ローカルのパスワードDBは削除
# rm /tmp/admin_password.ldif    <-- パスワードが入っているので削除

これで admin のパスワードがLDAPに入った.次のコマンドで確認できる.

# ldapsearch -U admin

2.2 PAMの設定

インストール

# apt-get install libpam-ldap libpam-cracklib

インストール中に色々聞かれるので適当に答える. 答えた結果は /etc/pam_ldap.conf, /etc/pam_ldap.secret に書き込まれる. やり直したければ,

# dpkg-reconfigure libpam-ldap

を実行する.

この後は失敗するとログインができなくなってしまう.万一失敗しても元に戻せるように,/etc/pam.dの中身をバックアップし,LDAP対応のpam.dを別ディレクトリ (/etc/pam.d.ldap) に作ってシンボリックリンクを張ることにする.

# cd /etc
# mv pam.d pam.d.orig
# mkdir pam.d.ldap
# cp -p pam.d.orig/* pam.d.ldap/
# cp -p /usr/share/doc/libpam-ldap/examples/pam.d/* pam.d.ldap/
# ln -s pam.d.ldap pam.d

/usr/share.../examples/pam.d/の例には pam_pwdb.so がたくさん使われているが Debian にはない. pam_unix.so と同じと思われるので,エラーメッセージを防ぐために,以下のようにして修正する.

# cd /etc/pam.d
# for i in *; do
>   echo $i
>   ed -s $i <<'EOF'
> 1,$s/pwdb/unix/g
> w
> EOF
> done

2.3 nsswitchの設定

インストール

# apt-get install libnss-ldap

インストール中,LDAPの管理者とそのパスワードを聞かれるので答える. 設定内容は,/etc/libnss-ldap.conf, /etc/libnss-ldap.secret に書き込まれる. やり直すなら

# dpkg-reconfigure libnss-ldap

/etc/nsswitch.confを編集.

passwd: files ldap
group:  files ldap
shadow: compat

ここまででとりあえずリブートしておいたほうがよいかも.

2.4 sambaのLDAP化

インストール

# apt-get install smbldap-tools

3 コマンドリファレンス

変更
$ ldapmodify -D cn=admin,dc=fukudat,dc=com -W -f input.ldif
-D ... distinguish name を指定
-W ... password 入力をプロンプト (-w だとコマンドライン引数でパスワードを指定)
-f ... ldif形式のファイルを指定
LDIFファイルの中身
dn: uid=fukudat,ou=People,dc=fukudat,dc=com   # 変更するエントリ
changetype: modify                            # 変更することを指示
replace: sambaPwdLastSet                      # アップデートは "replace". 他に "add", "delete"
sambaPwdLastSet: 1304787137                   # 新しい値

4 参考文献