OpenLDAP を構築。
Ubuntu-14.04.4-server-amd64 で確認。
作成 2012.03.24
更新 2018.04.12
更新 2018.04.12
Ubuntu で LDAP サーバー
目次
構成
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管理者パスワードを決める必要がある。
例の通り、dc=example,dc=com で作成したい場合は、OSインストール時に決めるホスト名を ldap.example.com などに指定しておくとよい。
設定ファイルの実体は /etc/ldap/slapd.d に保存されており、LDAP上では cn=config 配下のエントリーとしてアクセスできる。
ちなみに、cn=config 配下は root 権限でのみ以下の要領でアクセス可能。
$ 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
なお、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
/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
2_add_domain.ldif
3_add_admin.ldif
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 ユーザーのパスワードを生成
まずは cn=proxy ユーザーのパスワードを生成
$ slappasswd New password: Re-enter new password: {SSHA}qgTHrqSuVyJXe0e5Ejn/i6fTtUamQeomadd_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: 10000sudo しなくても実行できる。
$ 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
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
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 に該当しているため。
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