LDAP サーバパッケージのインストール

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

を実行すればインデックスの作成ができる.

OpenLDAP サーバの証明書とキー作成

秘密キーの作成

# 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)の作成

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

証明書を利用して LDAPS のたちあげ

/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

登録データ登録

OU People

$ 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

$ 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

$ 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

$ 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)として保存し, 同じコマンドで登録をすればよい.

sudoers の登録

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 ファイルにデータを書き込んでおいて,

  • 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

登録情報の変更

アカウントを削除するときは, 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 の利用

アプリケーション追加

# apt-get install sasl2-bin libsasl2-modules

saslauthd の設定

/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

slapd の設定変更

/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 をサポートしているかを確認

$ 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 を検索

# ldapsearch -U soka -b 'dc=ldap,dc=example,dc=co,dc=jp' \
 '(objectclass=*)'

これがうまくいけば,Mac にてクリアテキストパスワードの使用を不可にしても 認証がうまくいく.

プレインテキストパスワード認証を抑制する

プレインテキストパスワードでの認証(Simple Bind)を抑制するためには /etc/ldap/slapd.conf の先頭辺りに

disallow bind_simple

と書いておく.

GUI でのデータ閲覧

GQ を使えば,GUI にて LDAP のデータ操作ができる. (Debian にはパッケージがある.要 GTK+)

gq.png

LDAP クライアントとしての設定

PAM

ユーザ認証,承認のために 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 クライアントとして設定する場合

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


添付ファイル: filegq.png 742件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-05-06 (金) 11:58:09 (925d)