作成 2012.03.24
更新 2018.04.12
Ubuntu で LDAP サーバー
OpenLDAP を構築。
Ubuntu-14.04.4-server-amd64 で確認。
目次
構成
インストール
設定
エントリーの作成
既存のエントリーの確認
Database のチューニング
ドメインの作成
エントリーの作成
アクセス権の設定
アクセス権の設定
アクセス権の確認
Index の設定
一般ユーザーの作成
認証テスト
ユーザー削除
アンインストール
構成
LDAP の構造は以下のとおり。
dc=com
 |- dc=example
     |- ou=people
     |- ou=group
特殊アカウントとアクセス権は以下のとおり。
DN パスワード 用途 アクセス権
cn=admin,dc=nodomain exadmin LDAP 管理者 dc=example,dc=com 配下の管理者
cn=proxy,dc=example,dc=com prxpass BindDN 用
匿名アカウントでアクセスできないようにするため。
Read Only, パスワード閲覧・変更不可
cn=ldapgrp,ou=group,dc=example,dc=com (設定なし) 一般ユーザーの共通グループ (設定なし)
uid=user****,ou=people,dc=example,dc=com いろいろ 一般ユーザー 自身のアカウントのみ変更可能、他者のパスワード閲覧不可
インストール
インストール中にLDAP管理者パスワードを決める必要がある。
$ sudo apt-get install slapd ldap-utils
インストール前にドメイン名が指定されていないと dc=nodomain と cn=admin,dc=nodomain が作成される。削除する方法は不明。
例の通り、dc=example,dc=com で作成したい場合は、OSインストール時に決めるホスト名を ldap.example.com などに指定しておくとよい。
設定ファイルの実体は /etc/ldap/slapd.d に保存されており、LDAP上では cn=config 配下のエントリーとしてアクセスできる。
ちなみに、cn=config 配下は root 権限でのみ以下の要領でアクセス可能。
$ sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn
設定
従来の OpenLDAP は slapd.conf で設定していたが、現在は設定も動的に変更できる。
なお、ldap コマンドのように接続ユーザーを指定する必要はなく、root 権限で全て実行可能。
参考 OpenLDAP Administrator's Guide, Ubuntu documentation OpenLDAP Server
エントリーの作成
既存のエントリーの確認
slapcat コマンドで dc=nodomain と cn=admin,dc=nodomain が作成されていることがわかる。
$ sudo slapcat
dn: dc=nodomain
objectClass: top
objectClass: dcObject
objectClass: organization
o: nodomain
dc: nodomain
structuralObjectClass: organization
entryUUID: 276a5df6-8109-1035-94e3-1ba8e4f6c54c
creatorsName: cn=admin,dc=nodomain
createTimestamp: 20160318035635Z
entryCSN: 20160318035635.663576Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20160318035635Z

dn: cn=admin,dc=nodomain
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: *********************************************
structuralObjectClass: organizationalRole
entryUUID: 276cac64-8109-1035-94e4-1ba8e4f6c54c
creatorsName: cn=admin,dc=nodomain
createTimestamp: 20160318035635Z
entryCSN: 20160318035635.678691Z#000000#000#000000
modifiersName: cn=admin,dc=nodomain
modifyTimestamp: 20160318035635Z

Database のチューニング
必須ではないがデータベースをチューニングしておく。/usr/share/slapd/DB_CONFIG に説明がある。
/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 2097152 0
set_cachesize 0 268435456 0

# set_lg_regionmax <Bytes>
#	データベースファイル名を物理メモリにキャッシュする最大サイズを指定します。
#	ファイル数(テーブル、インデックス)の増加にあわせて値を増やすほうが良いでしょう。
#	デフォルトは約60KB
#	推奨値は set_cachesize の 1/1024 です。
#set_lg_regionmax        1048576
set_lg_regionmax 262144

# set_lg_bsize <Bytes>
#	トランザクションログへの書き込みバッファサイズを指定します。
set_lg_bsize 524288

# set_lg_max <Bytes>
#        トランザクションログの最大サイズです。
#        lg_bsize の4倍以上が必要です。
set_lg_max              10485760

# set_flags
#	フラグを指定します。
#	DB_LOG_AUTOREMOVE 不要になったトランザクションログを自動的に削除します
#	DB_TXN_NOSYNC ディスクに直ちに書き込まないことでパフォーマンスを上げます
set_flags DB_LOG_AUTOREMOVE

# 最大同時ロック数
set_lk_max_objects 1500
set_lk_max_locks 1500
set_lk_max_lockers 1500
サービス再起動
$ sudo service slapd restart
ドメインの作成
dc=nodomain となっているため、dc=example,dc=com へ変更する。
1_mod_domain.ldif
dn: olcDatabase={1}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com
-
replace: olcRootDN
olcRootDN: cn=admin,dc=example,dc=com
-
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymous auth by dn="cn=admin,dc=example,dc=com" write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=example,dc=com" write by * read
$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f 1_mod_domain.ldif
ドメイン作成
2_add_domain.ldif
dn: dc=example,dc=com
objectClass: dcObject
objectClass: organization
o: example
dc: example
$ ldapadd -x -D 'cn=admin,dc=example,dc=com' -W -f 2_add_domain.ldif
管理者作成
3_add_admin.ldif
dn: cn=admin,dc=example,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword:: *****************************
$ ldapadd -x -D 'cn=admin,dc=example,dc=com' -W -f 3_add_admin.ldif
もとのドメインを消す方法はわからなかった。
エントリーの作成
BindDN と一般ユーザー用の people OU を作成する。
まずは cn=proxy ユーザーのパスワードを生成
$ slappasswd
New password:
Re-enter new password:
{SSHA}qgTHrqSuVyJXe0e5Ejn/i6fTtUamQeom
add_bind_and_people.ldif ファイルを作成し、先ほどのパスワードを指定。
dn: cn=proxy,dc=example,dc=com
objectclass: organizationalRole
objectClass: simpleSecurityObject
cn: proxy
userPassword: {SSHA}qgTHrqSuVyJXe0e5Ejn/i6fTtUamQeom

dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=group,dc=example,dc=com
objectClass: organizationalUnit
ou: group

dn: cn=ldapgrp,ou=group,dc=example,dc=com
objectClass: posixGroup
cn: ldapgrp
gidNumber: 10000
sudo しなくても実行できる。
$ ldapadd -x -D 'cn=admin,dc=example,dc=com' -W -f add_bind_and_people.ldif

Enter LDAP Password:
adding new entry "cn=proxy,dc=example,dc=com"

adding new entry "ou=people,dc=example,dc=com"

adding new entry "ou=group,dc=example,dc=com"

adding new entry "cn=ldapgrp,ou=group,dc=example,dc=com"

アクセス権の設定
アクセス権の設定
BindDN は変更不可でパスワード閲覧不可、ユーザー自身は変更可能、匿名アクセスを禁止する。
mod_acl.ldif
dn: olcDatabase={1}hdb,cn=config
changeType: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=proxy,dc=example,dc=com" none by self write by dn="cn=admin,dc=example,dc=com" write by anonymous auth by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=proxy,dc=example,dc=com" read by self write by dn="cn=admin,dc=example,dc=com" write by anonymous auth by * none
$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f mod_acl.ldif
アクセス権の確認
BindDN で自身のパスワードも変更できないようになったことがわかる。また、匿名ユーザーは認証が必要であることがわかる。
$ sudo slapacl -D 'cn=proxy,dc=example,dc=com' -b 'cn=proxy,dc=example,dc=com'
authcDN: "cn=proxy,dc=example,dc=com"
entry: read(=rscxd)
children: read(=rscxd)
objectClass=organizationalRole: read(=rscxd)
objectClass=simpleSecurityObject: read(=rscxd)
cn=proxy: read(=rscxd)
userPassword=****: none(=0)
structuralObjectClass=organizationalRole: read(=rscxd)
entryUUID=2c02ec86-0a41-1031-9296-3beab350aa27: read(=rscxd)
creatorsName=cn=admin,dc=example,dc=com: read(=rscxd)
createTimestamp=20120324210756Z: read(=rscxd)
entryCSN=20120324210756.136307Z#000000#000#000000: read(=rscxd)
modifiersName=cn=admin,dc=example,dc=com: read(=rscxd)
modifyTimestamp=20120324210756Z: read(=rscxd)

$ sudo slapacl -D '' -b 'cn=proxy,dc=example,dc=com'
authcDN: ""
entry: auth(=xd)
children: auth(=xd)
objectClass=organizationalRole: auth(=xd)
objectClass=simpleSecurityObject: auth(=xd)
cn=proxy: auth(=xd)
userPassword=****: auth(=xd)
structuralObjectClass=organizationalRole: auth(=xd)
entryUUID=2c02ec86-0a41-1031-9296-3beab350aa27: auth(=xd)
creatorsName=cn=admin,dc=example,dc=com: auth(=xd)
createTimestamp=20120324210756Z: auth(=xd)
entryCSN=20120324210756.136307Z#000000#000#000000: auth(=xd)
modifiersName=cn=admin,dc=example,dc=com: auth(=xd)
modifyTimestamp=20120324210756Z: auth(=xd)
Index の設定
インデックスを付けて高速化する。
mod_index.ldif
dn: olcDatabase={1}hdb,cn=config
changeType: modify
add: olcDbIndex
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
olcDbIndex: uidNumber,gidNumber eq,pres
olcDbIndex: uid,memberUid eq,pres,sub
olcDbIndex: nisMapName,nisMapEntry eq,pres,sub
$ sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f mod_index.ldif
一般ユーザーの作成
add_user0001.ldif
dn: uid=user0001,ou=people,dc=example,dc=com
changetype: add
objectClass: person
objectClass: posixAccount
objectClass: inetOrgPerson
objectClass: shadowAccount
cn: user0001
sn: example user 0001
uid: user0001
mail: user0001@example.com
uidNumber: 10001
gidNumber: 10000
homeDirectory: /home/user0001
userPassword: {SSHA}Zoi/uVxClmChiVjdypE///wMXT0hKeqN
loginShell: /bin/bash
shadowLastChange: 10000
shadowMin: 0
shadowMax: 99999
shadowWarning: 14
shadowInactive: 99999
shadowExpire: -1

dn: cn=ldapgrp,ou=group,dc=example,dc=com
changetype: modify
add: memberUid
memberUid: user0001
$ ldapmodify -x -D 'cn=admin,dc=example,dc=com' -W -f add_user0001.ldif
Enter LDAP Password:
adding new entry "uid=user0001,ou=people,dc=example,dc=com"

modifying entry "cn=ldapgrp,ou=group,dc=example,dc=com"

認証テスト
一般ユーザーは自分自身しか検索できない。
ACLで by * none に該当しているため。
$ ldapsearch -x -D 'uid=user0001,ou=people,dc=example,dc=com' -W -b 'uid=user0001,ou=people,dc=example,dc=com' uid
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <uid=user0001,ou=people,dc=example,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: uid
#

# user0001, people, example.com
dn: uid=user0001,ou=people,dc=example,dc=com
uid: user0001

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
ユーザー削除
del_user0001.ldif
dn: uid=user0001,ou=people,dc=example,dc=com
changeType: delete

dn: cn=ldapgrp,ou=group,dc=example,dc=com
changetype: modify
delete: memberUid
memberUid: user0001
$ ldapmodify -x -D 'cn=admin,dc=example,dc=com' -W -f del_user0001.ldif
Enter LDAP Password:
deleting entry "uid=user0001,ou=people,dc=example,dc=com"

modifying entry "cn=ldapgrp,ou=group,dc=example,dc=com"

アンインストール
以下の手順で設定の完全削除が可能。
$ sudo dpkg --purge slapd
$ sudo rm -rf /var/lib/ldap
タグ: Ubuntu OpenLDAP

©2004-2017 UPKEN IPv4