ちょっと、OpenLDAPへ匿名ユーザーからのアクセス(参照)を許可する方法を調べることになりまして。
確認は、こちらのOpenLDAPのDockerイメージを使います。
起動。
$ docker container run -it --rm --name openldap --env LDAP_ADMIN_PASSWORD="admin-password" --env LDAP_DOMAIN=test.example osixia/openldap:1.2.2
管理ユーザーは、admin / admin-password です。
ここで、テスト用のエントリを登録しておきます。
test.ldif
dn: uid=user001,dc=test,dc=example,dc=com objectClass: inetOrgPerson objectClass: posixAccount uid: user001 cn: テスト 太郎 sn: テスト uidNumber: 10001 gidNumber: 10001 homeDirectory: /home/user001 userPassword: {SSHA}K1h08ZgBJQIInrqH1eerLG/I4jO2H9fh description: My Test Account
登録。
# ldapadd -f test.ldif -D "cn=admin,dc=test,dc=example,dc=com" -w admin-password adding new entry "uid=user001,dc=test,dc=example,dc=com"
確認。
# ldapsearch -x -H ldap://localhost -b uid=user001,dc=test,dc=example,dc=com -D "cn=admin,dc=test,dc=example,dc=com" -w admin-password # extended LDIF # # LDAPv3 # base <uid=user001,dc=test,dc=example,dc=com> with scope subtree # filter: (objectclass=*) # requesting: ALL # # user001, test.example.com dn: uid=user001,dc=test,dc=example,dc=com objectClass: inetOrgPerson objectClass: posixAccount uid: user001 cn:: 44OG44K544OIIOWkqumDjg== sn:: 44OG44K544OI uidNumber: 10001 gidNumber: 10001 homeDirectory: /home/user001 userPassword:: e1NTSEF9SzFoMDhaZ0JKUUlJbnJxSDFlZXJMRy9JNGpPMkg5Zmg= description: My Test Account # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
参照できています。
ここで、これを匿名ユーザーからのアクセス(バインドDNなし)とすると、参照できなくなります。
# ldapsearch -x -H ldap://localhost -b uid=user001,dc=test,dc=example,dc=com # extended LDIF # # LDAPv3 # base <uid=user001,dc=test,dc=example,dc=com> with scope subtree # filter: (objectclass=*) # requesting: ALL # # search result search: 2 result: 32 No such object # numResponses: 1
現在の設定を確認する
アクセス権限の設定確認は、以下のコマンドで行います。
# ldapsearch -Y EXTERNAL -H ldapi:/// -b olcDatabase={1}mdb,cn=config
以下の、「olcAccess」の部分がアクセス権限の設定です。
# {1}mdb, config dn: olcDatabase={1}mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: {1}mdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=test,dc=example,dc=com olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=test,dc=example,dc=com" write by anonymous auth by * none olcAccess: {1}to * by self read by dn="cn=admin,dc=test,dc=example,dc=com" write by * none
現在の設定は、「userPassword」および「shadowLastChange」属性については自分自身は更新可能、管理ユーザーからも
更新可能、匿名ユーザーからのauth(バインド)は可能、それ以外はアクセス権なし、という設定になります。
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=test,dc=example,dc=com" write by anonymous auth by * none
もうひとつは、「userPassword」、「shadowLastChange」以外の属性について、自身は参照可能、管理ユーザーからは
更新可能、それ以外はアクセス権なし、となります。
olcAccess: {1}to * by self read by dn="cn=admin,dc=test,dc=example,dc=com" write by * none
ちなみに、OpenLDAPサーバー全体の設定を確認する場合は、こちら。
# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config
「-Y EXTERNAL」は、LDAP Version 3のSASL認証のうち、外部認証(Linuxユーザー認証)を使う指定で、「-H」では接続先の
LDAPサーバーを指定するのですが、「ldapi」はUNIXドメインソケットを使ったローカルのLDAPサーバーと接続するための
指定です。
で、匿名ユーザーが参照可能なように、2つ目のアクセス権限の設定で「*」の部分を「read」にします。
access.ldif
dn: olcDatabase={1}mdb,cn=config changetype: modify replace: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by dn="cn=admin,dc=test,dc=example,dc=com" write by anonymous auth by * none olcAccess: {1}to * by self read by dn="cn=admin,dc=test,dc=example,dc=com" write by * read
変更。
# ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f access.ldif modifying entry "olcDatabase={1}mdb,cn=config"
これで、匿名ユーザーでも参照可能になりました。
# ldapsearch -x -H ldap://localhost -b uid=user001,dc=test,dc=example,dc=com # extended LDIF # # LDAPv3 # base <uid=user001,dc=test,dc=example,dc=com> with scope subtree # filter: (objectclass=*) # requesting: ALL # # user001, test.example.com dn: uid=user001,dc=test,dc=example,dc=com objectClass: inetOrgPerson objectClass: posixAccount uid: user001 cn:: 44OG44K544OIIOWkqumDjg== sn:: 44OG44K544OI uidNumber: 10001 gidNumber: 10001 homeDirectory: /home/user001 description: My Test Account # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1