Contents
概要
389 Directory Serverの初期状態では、”cn=Directory Manager”以外のDNがアクセスできる情報はRoot DSEのみです(anyoneで許可されているため)。”cn=Directory Manager”は389 Directory Serverの設定情報(cn=config)を含み、全ての情報にアクセスできますが、LDAPクライアントには必要最低限の権限を与えるべきです。
前提条件
OS
CentOS Stream 8を使用します。
SELinux
有効です。無効にする場合はこちらを参照して下さい。
Firewalld
無効です。有効化する場合はこちらを参照して必要な許可設定をして下さい。
所感
LDAPクライアントとはLDAPサーバーに何らかの方法でBINDし、必要な認証情報を参照、または書き込みをします。このBINDする際に使用するDNがLDAPに対してどのような権限を持つかがLDAPのアクセス制御の基本です。ここまでがLDAPクライアントであり、その認証情報を使用してログインするのはLDAPサーバーではなくLDAPクライアントに対してログインします(ldapsearch等のLDAPコマンドは一旦除く)。
仮にLDAPクライアントがLinuxである場合、そのLinuxの管理者がOSとしてLDAPサーバーへのBIND設定を行います。これによりLDAPサーバーから必要な認証情報を参照できるようになる為、Linuxの管理者以外のユーザーはLDAPサーバーから取得した認証情報を使用してLinuxにログインできるようになります。Linuxは、ローカルユーザーを作成する場合でも管理者が作成しますが、この部分がLDAPに置き換わると考えると分かりやすいと思います。
設定
匿名BINDの無効化
デフォルトでは匿名BIND(Anonymous BIND)が有効になっています。匿名BINDは認証無しでLDAPの情報を参照できますが、これにはACIがanyoneで許可されている必要があります。不要なセキュリティリスクを排除するのであれば匿名BINDは無効化したほうが良いでしょう。場合によっては、LDAPクライアントの仕様により匿名BINDが必要なケースもありますので状況により判断します。
LDIF
匿名BINDは下記のLDIF(allow-anonymous-access.ldif)で設定します。
dn: cn=config replace: nsslapd-allow-anonymous-access nsslapd-allow-anonymous-access: off
上記は完全に匿名BINDを無効化しますが、適切な認証設定をしている場合でもRootDSEに関してのみ匿名BINDを試行するLDAPクライアントも存在します。匿名BINDを試行する後の挙動はLDAPクライアント側の挙動によるため省略しますが、値をrootdseとすることでRootDSEに関してのみ匿名BINDを許可する設定となります。
dn: cn=config replace: nsslapd-allow-anonymous-access nsslapd-allow-anonymous-access: rootdse
設定反映
ldapmodifyで反映します。
[root@centos ~]# ldapmodify -H ldaps://ldap.si1230.com -D "cn=Directory Manager" -W -f allow-anonymous-access.ldif
設定確認
ldapsearchで確認します。もう少しスマートな方法があるかもしれませんが、とりあえずgrepしました。
[root@centos ~]# ldapsearch -H ldaps://ldap.si1230.com -D "cn=Directory Manager" -W -b cn=config | grep nsslapd-allow-anonymous-access
BINDユーザーの作成
ここでは読み取り専用のユーザーと書き込みが可能な2つのDNを作成します。これらのDNのアクセス制御を行うACI属性は”dc=si1230,dc=com”に書きます(環境やアクセス制御設計に依存します)。尚、これらのDNはLinux認証の必要がない為、objectClassはpersonのみとしています。
LDIF
下記のLDIF(bindusers.ldif)でBINDユーザーを作成します。
dn: cn=readonly,dc=si1230,dc=com objectClass: person cn: readonly sn: readonly userPassword: password dn: cn=writable,dc=si1230,dc=com objectClass: person cn: writable sn: writable userPassword: password
設定反映
ldapaddで反映します。
[root@centos ~]# ldapadd -H ldaps://ldap.si1230.com -D "cn=Directory Manager" -W -f bindusers.ldif
設定確認
ldapsearchで確認します。
[root@centos ~]# ldapsearch -H ldaps://ldap.si1230.com -D "cn=Directory Manager" -W -b dc=si1230,dc=com
アクセス制御
389 Directory ServerはACI属性を用いてアクセス制御を行います。ACI属性は下位ディレクトリに継承されます。ここではdc=si1230,dc=comに対してACI属性を設定し、cn=readonly,dc=si1230,dc=comにはread,search,compareの許可、cn=writable,dc=si1230,dc=comにはALLを許可します。
LDIF
下記のLDIF(aci.ldif)でACIを作成します。
dn: dc=si1230,dc=com add: aci aci: (targetattr=*)(version 3.0;acl"";allow(read,search,compare)(userdn="ldap:///cn=readonly,dc=si1230,dc=com");) - add: aci aci: (targetattr=*)(version 3.0;acl"";allow(all)(userdn="ldap:///cn=writable,dc=si1230,dc=com");)
設定反映
ldapmodifyで反映します。
[root@centos ~]# ldapmodify -H ldaps://ldap.si1230.com -D "cn=Directory Manager" -W -f aci.ldif
設定確認
ldapsearchで確認します。
[root@centos ~]# ldapsearch -H ldaps://ldap.si1230.com -D "cn=Directory Manager" -W -b dc=si1230,dc=com
尚、ACI属性は下記のようにコマンドオプションを付与しなければ表示されません。もう少しスマートな方法があるのかもしれません。
[root@centos ~]# ldapsearch -H ldaps://ldap.si1230.com -D "cn=Directory Manager" -W -b dc=si1230,dc=com -s base "(objectclass=*)" aci
本稿の続き(SSSDを使用したLinuxのLDAP認証)は下記のリンクから移動して下さい。