Debian Sarge にて構築.
インストール時の設定(debconf)で大まかなところは設定される. 管理者ユーザ(admin)のパスワードがどうやって設定されているのか だけ,よくわからない. よくある本だと,slapd.conf 内に,rootdn, rootpw を 設定するようになっているが,それがなくてもできるみたい. (->DB に入ってしまっている?,ある意味,忘れてしまったら終わり?)
登録されたユーザのデータを見るためには
% ldapsearch -x -b 'dc=ldap,dc=example,dc=co,dc=jp' uid=hoge
などとすればいい.
ここで,userPassword 属性の表示は Base64 でエンコードされたもの となっている. が,デコードすれば CRYPT されたパスワードはだれにでも見えて しまい,それはあまり良くない.
なので,アクセス制限をかけて userPassword 属性は管理者と 自分だけに読み書きできるようにしておく. (厳密に言うと,認証時だけはだれにでも読めるようにする.)
slapd.conf に
access to attribute=userPassword by self write by dn="cn=admin,dc=ldap,dc=example,dc=co,dc=jp" write by anonymous auth by * none
access to * by dn="cn=admin,dc=ldap,dc=example,dc=co,dc=jp" write by self write by * read
という行を加えて slapd を再起動する.
ちなみに,Debian では,デフォルトでこの設定がなされている.
検索を高速にするため,インデックスを作成する.
slapd.conf の
# index objectClass,uid,uidNumber,gidNumber,memberUid eq # index cn,mail,surname,givenname
の行のコメントをはずして slapd を停止する.
そして,
# /usr/sbin/slapindex
を実行すればインデックスの作成ができる.
# mkdir /etc/ldap/private # cd /etc/ldap/private # openssl genrsa -out LDAPserver.key Generating RSA private key, 512 bit long modulus ......++++++++++++ ..........................++++++++++++ e is 65537 (0x10001)
CN にはサーバの FQDN を入力する.
# cd /etc/ldap/private # openssl req -out LDAPserver.csr -new \ -key LDAPserver.key -config /etc/ssl/openssl.cnf ... ----- Country Name (2 letter code) [JP]: State or Province Name (full name) [Osaka]: Locality Name (eg, city) [Osaka]: Organization Name (eg, company) [NullPyon]: Organizational Unit Name (eg, section) [NullPyon]: Common Name (eg, YOUR name) []:AAA.XXXX.jp Email Address []:tanaka@XXXX.jp Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []: #
# cd /etc/ldap/private # openssl ca -config /etc/ssl/openssl.cnf \ > -out LDAPserver.crt -infiles LDAPserver.csr Using configuration from /etc/ssl/openssl.cnf Enter pass phrase for /etc/ssl/demoCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Nov 16 05:00:16 2005 GMT Not After : Nov 16 05:00:16 2006 GMT Subject: countryName = JP stateOrProvinceName = Osaka organizationName = NullPyon organizationalUnitName = NullPyon commonName = mendocino.example.co.jp emailAddress = tanaka@XXXX.jp X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 4B:18:48:14:5F:F6:6F:CB:18:4C:B2:2E:A4:7F:2A:71:8F:6A:A1:FB X509v3 Authority Key Identifier: keyid:42:C1:D4:44:3C:3A:E1:EC:DE:50:1C:0C:11:78:79:1F:3E:4 DirName:/C=JP/ST=Osaka/L=Osaka/O=NullPyon/OU=NullPyon/CN=d serial:B6:F6:D2:B1:AF:FA:94:28 Certificate is to be certified until Nov 16 05:00:16 2006 GMT (365 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
$ openssl verify -CAfile /etc/ssl/demoCA/cacert.pem LDAPserver.crt LDAPserver.crt: OK
/etc/ldap/slapd.conf に以下の行を追加
## Configuration for SSL/TLS #TLSCipherSuite HIGH:MEDIUM:+SSLv2 #TLSCipherSuite HIGH <- TLSCipherSuite を指定するとうまく起動しなかった TLSCertificateFile /etc/ldap/private/LDAPserver.crt TLSCertificateKeyFile /etc/ldap/private/LDAPserver.key #TLSCAcerificatePath /etc/ssl/demoCA <- クライアント認証をするときのみ #TLSCACertificateFile /etc/ssl/demoCA/cacert.pem <- クライアント認証をするときのみ TLSVerifyClient never
/etc/default/slapd に以下の行を
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"
次のように変更することで,外部からの問い合わせを LDAPS のみに制限できる.
SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
クライアント側から ldaps で接続するには /etc/openldap/ldap.conf(RHEL 系,MacOS)や /etc/ldap/ldap.conf(Debian系) に以下の設定を追加する.
TLS_CACERT /etc/openldap/cacerts/cacert.pem
また,自己認証局の証明書(cacert.pem)を ldap.conf で指定した場所に置く. (ちなみに,LDAP サーバ証明書(Public Key)の入手方法は
openssl s_client -connect my.ldap.server.com:636
)
もしくは,上記の ldap.conf に以下の行を書く.
TLS_REQCERT never
http://elfhbt.blog33.fc2.com/blog-category-8.html
$ cat People.ldif dn: ou=People,dc=ldap,dc=example,dc=jp ou: People objectclass: organizationalUnit
$ ldapadd -x -W -D 'cn=admin,dc=ldap,dc=example,dc=jp' \ -f People.ldif Enter LDAP Password: adding new entry 'ou=People,dc=ldap,dc=example,dc=jp'
$ cat usersoka.ldif dn: uid=soka,ou=People,dc=ldap,dc=example,dc=jp uid: soka objectClass: inetOrgPerson objectclass: posixAccount objectclass: shadowAccount uidNumber: 8000 gidNumber: 8000 gecos: Soka gn: Non homeDirectory: /home/soka loginShell: /bin/bash cn: そか sn: Soka o: TEST userPassword: {CRYPT}Ar6lc7Ew9j62 shadowLastChange: 10963 shadowMin: 0 shadowMax: 99999 shadowWarning: 7 mail: soka@XXXX.jp
上記の LDIF ファイル(usersoka.ldif)で, 日本語文字になっているところは UCS-8 で書くこと. (というか,lv なんかでフィルタしたものを ldapadd コマンドに 渡せばいい)
また,userPassword の部分は,エンコード({CRYPT})したものを記述する. その文字列を求めるツールとして slappasswd というツールが提供されている.
% /usr/sbin/slappasswd -h '{CRYPT}' -s パスワード -c "%s"
$ ldapadd -x -W -D 'cn=admin,dc=ldap,dc=example,dc=jp' \ -f usersoka.ldif Enter LDAP Password: adding new entry 'uid=soka,ou=People,dc=ldap,dc=example,dc=jp'
$ cat Group.ldif dn: ou=Group,dc=ldap,dc=example,dc=jp ou: Group objectClass: organizationalUnit
$ ldapadd -x -W -D 'cn=admin,dc=ldap,dc=example,dc=jp' \ -f Group.ldif Enter LDAP Password: adding new entry 'ou=Group,dc=ldap,dc=example,dc=jp'
$ cat groupnonstop.ldif dn: cn=nonstop,ou=Group,dc=ldap,dc=example,dc=jp cn: nonstop objectclass: posixGroup gidNumber: 8000
$ ldapadd -x -W -D 'cn=admin,dc=ldap,dc=example,dc=jp' \ -f groupnonstop.ldif Enter LDAP Password: adding new entry 'cn=nonstop,ou=Group,dc=ldap,dc=example,dc=jp'
ユーザを一括で登録する場合は,上記のの usersoka.ldif のような LDIF データを空行で区切って 1つのファイル(adduser.ldif)として保存し, 同じコマンドで登録をすればよい.
visudo で編集している /etc/sudoers の情報を LDAP に持たせることができる.
CentOS5 の場合,
/usr/share/doc/sudo-1.7.2p1/schema.OpenLDAP
を
/etc/openldap/schema/sudo.schema
としてコピー.
/etc/openldap/slapd.conf で include
include /etc/openldap/schema/sudo.schema
# service ldap restart
ou=SUDOers コンテナを作る
次のような ldif ファイルで,/etc/sudoers の Defaults エントリを 登録する.
dn: ou=SUDOers,dc=ldap,dc=example,dc=jp ou: SUDOers objectclass: organizationalunit
次のような ldif ファイルで,/etc/sudoers の Defaults エントリを 登録する.
dn: cn=defaults,ou=SUDOers,dc=ldap,dc=example,dc=jp objectClass: top objectClass: sudoRole cn: defaults description: Default sudoOption's go here sudoOption: env_keep+=SSH_AUTH_SOCK
$ ldapadd -x -W -h localhost -D 'cn=admin,dc=ldap,dc=example,dc=jp' -f SUODers.ldif
また,
/usr/share/doc/sudo-1.7.2p1/sudoers2ldif
という変換スクリプトもある.
$ export SUDOERS_BASE=ou=SUDOers,dc=ldap,dc=example,dc=jp $ sudo cat /etc/sudoers |perl /usr/share/doc/sudo-1.7.2p1/sudoers2ldif > sudo.ldif
で,sudo.ldif の必要な所だけ切り取って LDAP サーバに登録
$ ldapadd -x -W -h localhost -D 'cn=admin,dc=ldap,dc=example,dc=jp' -f sudo.ldif
一覧の表示
ldapsearch -h localhost -x -b 'dc=ldap,dc=example,dc=jp' '*'
soka ユーザが自分の情報を検索(パスワードフィールドも見える)
ldapsearch -h localhost -x -W -b 'dc=ldap,dc=example,dc=jp' \ -D "uid=soka,ou=People,dc=ldap,dc=example,dc=jp" uid=soka
登録情報の変更には,ldapmodify コマンドを使う.
% echo 'dn: uid=soka,ou=People,dc=ldap,dc=example,dc=co,dc=jp >changetype: modify >replace: loginShell >loginShell: /bin/zsh >' | ldapmodify -x -W \ -D 'uid=soka,ou=People,dc=ldap,dc=example,dc=co,dc=jp' Enter LDAP Password: modifying entry "uid=soka,ou=People,dc=ldap,dc=example,dc=co,dc=jp"
上記の例は,ユーザが自分のログインシェルを変更している例である. (chfn や chsh は LDAP に使えないので, 直接 LDAP の情報を変更しないといけない.)
標準入力から ldapmodify にデータを渡しているが, LDIF ファイルにデータを書き込んでおいて,
また,一度に複数のデータを書き換える場合は, データを "-" で区切って以下のようにする.
dn: uid=soka,ou=People,dc=ldap,dc=example,dc=co,dc=jp changetype: modify replace: loginShell loginShell: /bin/zsh - replace: gecos gecos: hogehogera
ちなみに,changetype として指定できるのは以下のもの.
アカウントを削除するときは, ldapdelete を使って, LDAP の情報から対応するものを削除する.
% ldapdelete -x \ -W -D 'cn=admin,dc=ldap,dc=example,dc=co,dc=jp' \ 'uid=soka,ou=People,dc=ldap,dc=example,dc=co,dc=jp'
当然,このあと,ホームディレクトリや mail スプールなどを 削除する必要がある.
# apt-get install sasl2-bin libsasl2-modules
/etc/default/saslauthd を編集
以下の行がコメントアウトされているので,アンコメント.
START=yes
以下の行を編集(sasldb を追加する)
MECHANISMS="pam sasldb"
# cat > /usr/lib/sasl2/slapd.conf pwcheck_method: sasldb ^D # saslpasswd2 -c -a slapd -u ldap.example.co.jp soka Password: Again (for verification): # sasldblistusers2 soka@ldap.example.co.jp: userPassword
/etc/ldap/slapd.conf に以下を追加
sasl-realm ldap.example.co.jp sasl-regexp uid=(.*),cn=.* uid=$1,ou=People,dc=ldap,dc=example,dc=co,dc=jp
$ ldapsearch -x -b '' -s base '(objectclass=*)' supportedSASLMechanisms # extended LDIF # # LDAPv3 # base <> with scope base # filter: (objectclass=*) # requesting: supportedSASLMechanisms # # dn: supportedSASLMechanisms: NTLM supportedSASLMechanisms: DIGEST-MD5 supportedSASLMechanisms: CRAM-MD5 # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
# ldapsearch -U soka -b 'dc=ldap,dc=example,dc=co,dc=jp' \ '(objectclass=*)'
これがうまくいけば,Mac にてクリアテキストパスワードの使用を不可にしても 認証がうまくいく.
プレインテキストパスワードでの認証(Simple Bind)を抑制するためには /etc/ldap/slapd.conf の先頭辺りに
disallow bind_simple
と書いておく.
GQ を使えば,GUI にて LDAP のデータ操作ができる. (Debian にはパッケージがある.要 GTK+)
ユーザ認証,承認のために PAM を使用するので, LDAP 認証用の PAM モジュール pam_ldap の設定と, そのモジュールを各プログラムで使用するように設定を行う.
/etc/pam.d/common-account
account [success=1 default=ignore] pam_unix.so account required pam_ldap.so account required pam_permit.so
/etc/pam.d/common-auth
auth [success=1 default=ignore] pam_unix.so auth required pam_ldap.so use_first_pass auth required pam_permit.so
/etc/pam.d/common-password
password sufficient /lib/security/pam_ldap.so password required pam_unix.so nullok obscure min=4 max=8 md5
/etc/pam_ldap.conf
host 127.0.0.1 base dc=ldap,dc=example,dc=co,dc=jp ldap_version 3 rootbinddn cn=admin,dc=ldap,dc=example,dc=co,dc=jp pam_password crypt ssl on tls_checkpeer no
/etc/libnss-ldap.conf
host 127.0.0.1 base dc=ldap,dc=example,dc=co,dc=jp ldap_version 3 ssl on tls_checkpeer no
/etc/ldap.secret (<--chmod 600 しておく)
rootdn のパスワード
nsswitch.conf に
passwd: files ldap shadow: files ldap group: files ldap
といったエントリがあると,サーバ起動時のデーモン起動順によっては, ldap の名前解決待ちが延々と続くことがある.
その場合,/etc/ldap.conf(これは nss_ldap の設定.OpenLDAP サーバ側ではない)で,
bind_policy soft
を指定しておいてやるとよい.
現行ファイル(/etc/hosts など)から LDAP へのデータ移行には, PADL で提供されている PADL Migration Tools が使える.