CLOVER🍀

That was when it all began.

OpenLDAPで匿名ユーザーからの参照を許可する

ちょっと、OpenLDAPへ匿名ユーザーからのアクセス(参照)を許可する方法を調べることになりまして。

確認は、こちらのOpenLDAPのDockerイメージを使います。

osixia/openldap

起動。

$ 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