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]]
が使える.

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS