アクセス権はそれぞれ以下の通りです。
-rw-r--r-- 1 root root 1285 Mar 12 11:31 cacert_pem.crt -rw-r--r-- 1 root root 1919 Mar 12 08:39 server_pem.crt -rw-r----- 1 root ldap 1671 Mar 12 08:34 secret_pem.key
CentOS 5 で OpenLDAP を構築したときのメモです。
難解なエラーメッセージに悩まされた人の一助となれば。
以下のオペレーションはroot権限で実行するものです。
# command
以下のオペレーションはユーザー権限で実行するものです。
$ command
以下の記述はファイルの内容を指しています。
# comment ここの行はなくてもかまいません setting=value
まあ、この辺は普通に。
# yum install openldap-servers openldap-clients
openldapサーバの本体slapdが参照するファイルです。
修正する前に、パスワードのLDAP用のハッシュ値を取得しておきます。
# slappasswd -s adminpassword
{SSHA}HWqeNmSZCEdF/vlkDE2rZI8JiC65sV4B
slapd.confの内容は以下の感じで。
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
# bind_v2 は期待通り動作しないことがあるので、必要が無ければあえて許可する必要はない
# allow bind_v2
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
# アクセスコントロールのデフォルトは
# access to * by * read
# 以下の記述をすると、/etc/ldap.conf に binddn と bindpw の設定が必須
# ただし、ユーザーが自分のパスワードを変更できるようにするためには必要
# rootdn へアクセス許可する必要はない
#
# openldap 2.3 以降では attr によるアクセス設定ができなくなりました。
access to attrs=userPassword
by dn="cn=proxy,dc=upken,dc=jp" read
by self write
by anonymous auth
by * none
access to *
by self write
by users read
by anonymous auth
by * none
database bdb
suffix "dc=upken,dc=jp"
rootdn "cn=Manager,dc=upken,dc=jp"
# slappasswdのコマンド結果はここに記述する
rootpw {SSHA}HWqeNmSZCEdF/vlkDE2rZI8JiC65sV4B
directory /var/lib/ldap
index objectClass eq,pres
index ou,cn,mail,surname,givenname eq,pres,sub
index uidNumber,gidNumber eq,pres
index uid,memberUid eq,pres,sub
index nisMapName,nisMapEntry eq,pres,sub
ldapコマンド(ldapadd, ldapmodifyなど)が参照するファイルです。
/etc/ldap.confと混同しないように気をつけてください。/etc/ldap.conf はnss_ldapやpamが参照します。
内容はこんな感じで。
BASE dc=upken,dc=jp URI ldap://localhost
データベースのパラメータファイルをコピーします。
# cp /etc/openldap/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
以下のようなパラメータがあります。
# set_cachesize <GigaBytes> <Bytes> <ncache> # 物理メモリ上にキャッシュするサイズを指定します。 # <GigaBytes>GB + <Bytes> のメモリを確保します。 # <ncache> が 0または1の場合は、連続したメモリ領域を確保します。 # <ncache> が 1より大きい場合は、<ncache>の数だけ分割して確保します。 # デフォルトは 0 262144 0 のため、指定がない場合に応答が遅くなる可能性があります。 # 推奨値は4MB以上。最大は4GBまでです。実際には物理メモリの25~50%を確保するようです。 # 64bit版に関しては不明です。 set_cachesize 0 268435456 1 # set_lg_regionmax <Bytes> # データベースファイル名を物理メモリにキャッシュする最大サイズを指定します。 # ファイル数(テーブル、インデックス)の増加にあわせて値を増やすほうが良いでしょう。 # デフォルトは約60KB # 推奨値は set_cachesize の 1/1024 です。 set_lg_regionmax 262144 # set_lg_bsize <Bytes> # トランザクションログへの書き込みバッファサイズを指定します。 set_lg_bsize 2097152 # set_flags # フラグを指定します。 # DB_LOG_AUTOREMOVE 不要になったトランザクションログを自動的に削除します # DB_TXN_NOSYNC ディスクに直ちに書き込まないことでパフォーマンスを上げます set_flags DB_LOG_AUTOREMOVE
サービス起動はこれだけです。厳密に設定ファイルをチェックしてくれるようで、書式ミスやスペルの間違いがあると起動しません。
# service ldap start
再起動後も自動起動したい場合は、以下のコマンドを打っておきます。
# chkconfig ldap on
デバッグモードで起動したいときはデバッグモードで起動を参照してください。
起動確認するには以下を実行します。パスワードはslapd.confで設定したときのものを使用します。
# ldapsearch -x -D 'cn=Manager,dc=upken,dc=jp' -W -b '' -s base '(objectclass=*)' namingContexts
ドメインと管理者の作成は必須です。
People と Group は RFC2307bis に指定されており、一般的に利用されている ou ですのでここで登録します。
ファイル名は任意です。
domain.ldif
dn: dc=upken,dc=jp objectClass: dcObject objectClass: organization o: upken ldap dc: upken dn: cn=Manager,dc=upken,dc=jp objectClass: organizationalRole cn: Manager dn: ou=People,dc=upken,dc=jp objectClass: organizationalUnit ou: People dn: ou=Group,dc=upken,dc=jp objectClass: organizationalUnit ou: Group
# ldapadd -x -D "cn=Manager,dc=upken,dc=jp" -W -f domain.ldif
グループと /etc/ldap.conf の binddn 用に使用するエントリを追加します。
ここでも slappasswd で設定用のパスワードを取得します。
# slappasswd -s bindpassword
{SSHA}fuPtbgCJdVjv7TF6qMuFgXEIX3F/5YcT
ファイル名は任意です。
auth.ldif
dn: cn=upkengroup,ou=Group,dc=upken,dc=jp
objectClass: posixGroup
cn: upkengroup
gidNumber: 10000
dn: cn=proxy,dc=upken,dc=jp
objectclass: organizationalRole
objectClass: simpleSecurityObject
cn: proxy
userPassword: {SSHA}fuPtbgCJdVjv7TF6qMuFgXEIX3F/5YcT
# ldapadd -x -D "cn=Manager,dc=upken,dc=jp" -W -f auth.ldif
いちいちこんなことをやるのは面倒だから一発作成スクリプトか何か作ったほうが良いと思います。
# slappasswd -s user0001
{SSHA}l059m9Uwdu0dB7IYma0iYd16txrX99Mh
ユーザーの作成とグループのメンバー追加をまとめて行います。
ldapmodify を使用するので各DNの2行目だけ異なることに注意してください。
user0001.ldif
dn: uid=user0001,ou=People,dc=upken,dc=jp
changetype: add
objectClass: person
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: shadowAccount
cn: user0001
sn: upkenuser
uid: user0001
mail: user0001@upken.jp
uidNumber: 10001
gidNumber: 10000
homeDirectory: /home/user0001
userPassword: {SSHA}l059m9Uwdu0dB7IYma0iYd16txrX99Mh
loginShell: /bin/bash
shadowLastChange: 10000
shadowMin: 0
shadowMax: 99999
shadowWarning: 14
shadowInactive: 99999
shadowExpire: -1
dn: cn=upkengroup,ou=Group,dc=upken,dc=jp
changetype: modify
add: memberUid
memberUid: user0001
# ldapmodify -x -D "cn=Manager,dc=upken,dc=jp" -W -f user0001.ldif
authconfig で Use LDAP と Use LDAP Authentication を選択し Next
Tera Term で接続すると入力欄が左にずれるので気をつけてください。
CentOS 5の場合は
# authconfig-tui
古いRed Hatの場合は
# authconfig
または
# setup
実際には、/etc/ldap.conf, /etc/nsswitch.conf, /etc/pam.d/system-auth-ac が書き換えられます。
つぎに、/etc/ldap.conf にbinddnとbindpwを追加します。
bindpw は平文で記述する必要があります。
/etc/ldap.conf
base dc=upken,dc=jp binddn cn=proxy,dc=upken,dc=jp bindpw bindpassword timelimit 120 bind_timelimit 120 idle_timelimit 3600 nss_initgroups_ignoreusers root,ldap,named,avahi,haldaemon uri ldap://127.0.0.1/ ssl no tls_cacertdir /etc/openldap/cacerts pam_password md5
正しく設定されている場合は、以下のコマンドで情報が取得できるはずです。
# getent passwd user0001 user0001:x:10001:10000:user0001:/home/user0001:/bin/bash
通常はnfsやautofsを使いますが、今回はベーシックに。
# cp -a /etc/skel /home/user0001 # chown -R user0001:upkengroup /home/user0001
以上の設定がすべて正しくできていれば、新しく作ったユーザーでログインできるはずです。
以降はおまけです。
passwd コマンドでも変更できるようになっています。 ldappasswd は新しいパスワードが指定されないと、勝手にパスワードを生成して登録してくれます。
$ ldappasswd -x -s newPassword -w currentpassword -D 'uid=user0001,ou=People,dc=upken,dc=jp'
$ ldappasswd -x -s newPassword -w adminpassword -D 'cn=Manager,dc=upken,dc=jp' 'uid=user0001,ou=People,dc=upken,dc=jp'
ユーザーのエントリーとグループのメンバーから削除します。
user0001-del.ldif
dn: uid=user0001,ou=People,dc=upken,dc=jp changetype: delete dn: cn=upkengroup,ou=Group,dc=upken,dc=jp changetype: modify delete: memberUid memberUid: user0001
$ ldapmodify -x -D 'cn=Manager,dc=upken,dc=jp' -W -f user0001-del.ldif
-rw-r--r-- 1 root root 1285 Mar 12 11:31 cacert_pem.crt -rw-r--r-- 1 root root 1919 Mar 12 08:39 server_pem.crt -rw-r----- 1 root ldap 1671 Mar 12 08:34 secret_pem.key
TLSCACertificateFile /etc/pki/tls/certs/cacert_pem.crt TLSCertificateFile /etc/pki/tls/certs/server_pem.crt TLSCertificateKeyFile /etc/pki/tls/certs/secret_pem.key
デバッグモードで自動起動しないように気をつけてください。
OSが正しく起動できなくなります。
/etc/sysconfig/ldap を作成して、以下のように記述します。
SLAPD_OPTIONS="-d -1"
起動すると操作画面上に表示されるようになります。
なお、デバッグ番号を指定するときは以下の数字の論理和であらわします。
| レベル | キーワード | 説明 |
| -1 | Any | すべてのデバッグレベルを有効にする |
| 0 | デバッグしない | |
| 1 | Trace | 関数呼出しのトレース |
| 2 | Packets | パケット処理のデバッグ |
| 4 | Args | 詳細なデバッグトレース |
| 8 | Conns | 接続管理 |
| 16 | BER | パケット送受信の印字 |
| 32 | Filter | 検索フィルタ処理 |
| 64 | Config | 設定の処理 |
| 128 | ACL | アクセス制御リスト処理 |
| 256 | Stats | 接続/操作結果の統計ログ |
| 512 | Stats2 | エントリ送信の統計ログ |
| 1024 | Shell | shell バックエンドとの通信の印字 |
| 2048 | Parse | エントリ解析のデバッグ印字 |
| 4096 | Cache | データベースキャッシュ処理 |
| 8192 | Index | データベースインデックスの処理 |
| 16384 | Sync | syncrepl コンシューマ処理 |