RIGHT:[[フリーソフトウェアのコンパイル]] *LDAP サーバパッケージのインストール [#b1647d38] Debian Sarge にて構築. インストール時の設定(debconf)で大まかなところは設定される. 管理者ユーザ(admin)のパスワードがどうやって設定されているのか だけ,よくわからない. よくある本だと,slapd.conf 内に,rootdn, rootpw を 設定するようになっているが,それがなくてもできるみたい. (->DB に入ってしまっている?,ある意味,忘れてしまったら終わり?) //=================================================================== *パスワードファイル(フィールド)へのアクセス制御 [#a81af91c] 登録されたユーザのデータを見るためには % 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 では,デフォルトでこの設定がなされている. //========================================================= *検索インデックスの作成. [#w32d9e3c] 検索を高速にするため,インデックスを作成する. slapd.conf の # index objectClass,uid,uidNumber,gidNumber,memberUid eq # index cn,mail,surname,givenname の行のコメントをはずして slapd を停止する. そして, # /usr/sbin/slapindex を実行すればインデックスの作成ができる. //========================================================= *OpenLDAP サーバの証明書とキー作成 [#h392af63] **秘密キーの作成 [#s66e93f0] # 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) **証明書発行要求(CSR)の作成 [#n7cf4fe3] 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 []: # **認証局による署名とサーバ証明書の発行 [#gde1fa9e] # 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 //----------- **作成した証明書のベリファイ [#y6073bcf] $ openssl verify -CAfile /etc/ssl/demoCA/cacert.pem LDAPserver.crt LDAPserver.crt: OK //----------- **証明書を利用して LDAPS のたちあげ [#yace4a3c] /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:///" **クライアント側 [#gc4ce563] クライアント側から 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 //================================================================= *登録データ登録 [#k1889bfb] **OU People [#v0d8d959] $ 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' **ユーザ soka [#z1f703fa] $ 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' **OU Group [#w96b6d6d] $ 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' **グループ nonstop [#na7eedcc] $ 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' **ユーザ一括登録 [#x002ab83] ユーザを一括で登録する場合は,上記のの usersoka.ldif のような LDIF データを空行で区切って 1つのファイル(adduser.ldif)として保存し, 同じコマンドで登録をすればよい. **sudoers の登録 [#yc6d04ec] 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 //============================================================== *登録情報の検索 [#vf6784ff] 一覧の表示 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 //============================================================== *登録情報の変更 [#nae5a28c] 登録情報の変更には,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 ファイルにデータを書き込んでおいて, -f オプションで指定してもいい. また,一度に複数のデータを書き換える場合は, データを "-" で区切って以下のようにする. 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 として指定できるのは以下のもの. -replace -add -delete //============================================================== *登録情報の変更 [#a54b2c58] アカウントを削除するときは, 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 スプールなどを 削除する必要がある. //============================================================== *SASL の利用 [#vc1e430b] **アプリケーション追加 [#o6eac564] # apt-get install sasl2-bin libsasl2-modules **saslauthd の設定 [#k173e7ee] /etc/default/saslauthd を編集 以下の行がコメントアウトされているので,アンコメント. START=yes 以下の行を編集(sasldb を追加する) MECHANISMS="pam sasldb" **認証データベースの設定 [#k6517080] # 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 **slapd の設定変更 [#ace2ca06] /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 **SASL をサポートしているかを確認 [#n0069619] $ 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 **SASL を利用して LDAP を検索 [#l0dd57c8] # ldapsearch -U soka -b 'dc=ldap,dc=example,dc=co,dc=jp' \ '(objectclass=*)' これがうまくいけば,Mac にてクリアテキストパスワードの使用を不可にしても 認証がうまくいく. **プレインテキストパスワード認証を抑制する [#c280742b] プレインテキストパスワードでの認証(Simple Bind)を抑制するためには /etc/ldap/slapd.conf の先頭辺りに disallow bind_simple と書いておく. //============================================================== *GUI でのデータ閲覧 [#c53b3bee] GQ を使えば,GUI にて LDAP のデータ操作ができる. (Debian にはパッケージがある.要 GTK+) &ref(gq.png); //============================================================== *LDAP クライアントとしての設定 [#xed62f83] **PAM [#f72e0e70] ユーザ認証,承認のために 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 のパスワード **OpenLDAP サーバを LDAP クライアントとして設定する場合 [#v760e646] nsswitch.conf に passwd: files ldap shadow: files ldap group: files ldap といったエントリがあると,サーバ起動時のデーモン起動順によっては, ldap の名前解決待ちが延々と続くことがある. その場合,/etc/ldap.conf(これは nss_ldap の設定.OpenLDAP サーバ側ではない)で, bind_policy soft を指定しておいてやるとよい. //============================================================== *データマイグレーション [#h93142da] 現行ファイル(/etc/hosts など)から LDAP へのデータ移行には, PADL で提供されている [[PADL Migration Tools:http://www.padl.com/OSS/MigrationTools.html]] が使える.