2021年11月20日土曜日

OpenLDAP入門① (OpenLDAP初期構築手順)

Red Hat Enterprise Linux 7 (RHEL7) で利用できるOpenLDAPは、ユーザやパスワード情報を一元管理し、認証機能を提供することができる。ただし、Red Hat Enterprise Linux 8 (RHEL8) になってから、OpenLDAPは非サポートとなり、代わりに「Red Hat Directory Server (RHDS)」が利用できるようになった。

なお、RHEL 8でもしOpenLDAPを利用したい要件がある場合の選択肢としては、OSSTech製のOpenLDAPを利用するという方法もある。

そのような状況ではあるが、本記事では純粋な「RHEL 7のOpenLDAP」を使ってLDAPサーバを構築する手順を記載する。内容が多いため、以下の3回に分けて記載する。

環境

前述した通り、今回はRHEL 7のOpenLDAPを構築する。

  • OS : Red Hat Enterprise Linux 7.7
  • OpenLDAP : 2.4.44

OpenLDAPのドメイン等の情報は以下とする。

設定項目 設定値
ドメイン dc=example,dc=com
RootDN cn=Manager,dc=example,dc=com
OU ou=group,dc=example,dc=com
グループ cn=ldapgrp,ou=group,dc=example,dc=com
ユーザ1 uid=user01,ou=group,dc=example,dc=com
ユーザ2 uid=user01,ou=group,dc=example,dc=com

OpenLDAPサーバ構築手順

1. OpenLDAPパッケージのインストール

OpenLDAPを使うためには、yumを使用してopenldap-serversopenldap-clientsをインストールするだけでよい。

# yum install openldap-servers openldap-clients -y

~(中略)~

インストール:
  openldap-clients.x86_64 0:2.4.44-21.el7_6
  openldap-servers.x86_64 0:2.4.44-21.el7_6

完了しました!

特に依存関係もないため、rpmを使って直接インストールすることも可能。RHEL 7のインストールメディアからインストールする場合は、以下の通り実行する。

# rpm -ivh openldap-servers-2.4.44-21.el7_6.x86_64.rpm
# rpm -ivh openldap-clients-2.4.44-21.el7_6.x86_64.rpm

2. OpenLDAPの起動

インストールをしたら、とりあえずOpenLDAPを起動させる。

# systemctl start slapd
# systemctl enable slapd

3. 管理用パスワードの設定

いよいよOpenLDAPの設定を実施していく。まず、設定ファイルをディレクトリ丸ごとバックアップしておこう。

# cp -pr /etc/openldap/slapd.d{,_20211016}
# ls -ld /etc/openldap/slapd.d*
drwxr-x---. 3 ldap ldap 45  7月 18 14:49 /etc/openldap/slapd.d
drwxr-x---. 3 ldap ldap 45  7月 18 14:49 /etc/openldap/slapd.d_20210718

OpenLDAPはldapaddldapmodifyldapdeleteコマンドを使用して設定する。これらのコマンドに「LDIF」と呼ばれるLDAP用の設定情報が記載されたファイルを読み込ませることで、直接設定ファイルを編集しなくとも設定することができる

今回はldapaddコマンドにて設定を行う。構文は以下と覚えておく。

ldapadd -Y EXTERNAL -H ldapi:/// -f [ファイル名].ldif

-Y EXTERNAL : root作業時のパスワード入力をスキップ
-H ldapi:/// : ローカルのLDAPに対する作業

まずOpenLDAPに必要となる管理用パスワードを設定する。パスワードは平文ではなくハッシュ値にてLDIFファイルに記載する。パスワードのハッシュ値を生成するためのコマンドとして、slappasswdが用意されているため、こちらを利用してパスワードのハッシュ値を生成する。

生成されたパスワードはソルト付きのSHA-1のハッシュ値となり、{SSHA}という文字が先頭に付いた32文字となる。

# slappasswd
New password:
Re-enter new password:
{SSHA}XXX~(省略)~XXX

以下の通りLDIFファイルを作成して、ldapaddコマンドにて設定する。

# cat << EOF > rootpw.ldif
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootDN
olcRootDN: cn=config
-
add: olcRootPW
olcRootPW: {SSHA}XXX~(省略)~XXX
EOF

# ldapadd -Y EXTERNAL -H ldapi:/// -f rootpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"

設定内容を確認するコマンドとしてはldapsearchを使う。指定するオプションは以下の通り。

オプション 説明
-LLL LDIF バージョンを表示させないため、Lオプションを3つ付与する。
-b LDAPの検索位置を指定する。

実際に確認した結果は以下の通りとなる。

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'olcDatabase={0}config,cn=config'
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: olcDatabase={0}config,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {0}config
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
 ,cn=auth" manage by * none
olcRootDN: cn=config
olcRootPW: {SSHA}XXX~(省略)~XXX

4. 管理者パスワードの設定

管理者パスワードとして、monitorとhdbのパスワードを設定する。monitorはモニターデータベース、hdbはLDAPのデータベース本体と理解しておこう。

今回、それぞれの管理ユーザは「cn=Manager,dc=example,dc=com」で設定する。この管理ユーザをRootDNと呼ぶ。

以下の通りLDIFファイルを作成して、ldapaddコマンドにて設定する。

# cat << EOF > hdbpw.ldif
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=example,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com
-
replace: olcRootDN
olcRootDN: cn=Manager,dc=example,dc=com
-
add: olcRootPW
olcRootPW: {SSHA}XXX~(省略)~XXX
EOF

# ldapadd -Y EXTERNAL -H ldapi:/// -f hdbpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"

modifying entry "olcDatabase={2}hdb,cn=config"

5. スキーマの追加

LDAPで利用するスキーマを設定する。スキーマは、cosine.ldifinetorgperson.ldifnis.ldifを登録すればLDAPサーバとして利用できる。

登録コマンドは以下の通り。

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif

実際の実行結果は以下の通り。

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"

# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"

6. BaseDN、OU、グループを登録

ここまで設定すれば、LDAPサーバにBaseDNや、OU、グループが登録できる。

設定項目 設定値
ドメイン dc=example,dc=com
OU ou=group,dc=example,dc=com
グループ cn=ldapgrp,ou=group,dc=example,dc=com

以下の通りLDIFファイルを作成する。

# cat << EOF > base.ldif
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
dc: example
o: Example Inc.

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

dn: cn=ldapgrp,ou=group,dc=example,dc=com
objectClass: posixGroup
gidNumber: 10000
cn: ldapgrp
EOF

ここからはldapaddコマンドを利用することは変わらないが、少しオプションが異なり、先ほど設定した管理者 (cn=Manager,dc=example,dc=com) を指定して登録を行う点に注意する。

# ldapadd -x -D "cn=Manager,dc=example,dc=com" -w '[RootDNのパスワード]' -f base.ldif
adding new entry "dc=example,dc=com"

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

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

7. ユーザを登録

ユーザを登録する。

設定項目 設定値
ユーザ1 uid=user01,ou=group,dc=example,dc=com
ユーザ2 uid=user01,ou=group,dc=example,dc=com

以下の通りLDIFファイルを作成して、ldapaddコマンドにて設定する。

# cat << EOF > user.ldif
dn: uid=user01,ou=group,dc=example,dc=com
uid: user01
cn: Hoge Hoge
sn: user01
objectClass: posixAccount
objectClass: inetOrgPerson
userPassword: {SSHA}XXX~(省略)~XXX
loginShell: /bin/bash
uidNumber: 10001
gidNumber: 10000
homeDirectory: /home/user01

dn: uid=user02,ou=group,dc=example,dc=com
uid: user02
cn: Hoge Hoge
sn: user02
objectClass: posixAccount
objectClass: inetOrgPerson
userPassword: {SSHA}XXX~(省略)~XXX
loginShell: /bin/bash
uidNumber: 10002
gidNumber: 10000
homeDirectory: /home/user02
EOF

# ldapadd -x -D "cn=Manager,dc=example,dc=com" -w '[RootDNのパスワード]' -f user.ldif
adding new entry "uid=user01,ou=group,dc=example,dc=com"

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

これで一通り設定が完了したので、最後にldapsearchコマンドで登録結果を確認してみよう。

# ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b 'ou=group,dc=example,dc=com'
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
dn: ou=group,dc=example,dc=com ←★OU「group」の情報
objectClass: organizationalUnit
ou: Group

dn: cn=ldapgrp,ou=group,dc=example,dc=com ←★グループ「ldapgrp」の情報
objectClass: posixGroup
gidNumber: 10000
cn: ldapgrp

dn: uid=user01,ou=group,dc=example,dc=com ←★ユーザ「user01」の情報
uid: user01
cn: Hoge Hoge
sn: user01
objectClass: posixAccount
objectClass: inetOrgPerson
userPassword:: e1NTSEF9TFdVQXZyNzUvQlBpUDJ2MWZ5amxFdDlEVlB0d0lVYmU=
loginShell: /bin/bash
uidNumber: 10001
gidNumber: 10000
homeDirectory: /home/user01

dn: uid=user02,ou=group,dc=example,dc=com ←★ユーザ「user02」の情報
uid: user02
cn: Hoge Hoge
sn: user02
objectClass: posixAccount
objectClass: inetOrgPerson
userPassword:: e1NTSEF9TFdVQXZyNzUvQlBpUDJ2MWZ5amxFdDlEVlB0d0lVYmU=
loginShell: /bin/bash
uidNumber: 10002
gidNumber: 10000
homeDirectory: /home/user02

8. LDP.exeを使った確認

ここまでの設定を行ったことで、OpenLDAPサーバに対してLDAPによる接続が可能となる。

実際に、外部からアクセスできることをWindows ServerのLDP.exeを利用して確認する。なお、LDP.exeは、役割管理ツールの「AD DSおよびAD LDSツール」に含まれる。

「ファイル名を指定して実行」にてldpを入力し「OK」を押すと、LDP.exeが起動する。

「ファイル」→「接続」を選択し、OpenLDAPサーバのIPアドレスとポート番号「389」を指定する。また、今回はLDAPSを使用しないため、SSLのチェックを外しておく。

次に、「表示」→「ツリー」を選択し、「ou=group,dc=example,dc=com」を入力する。

以下の通りOUに登録されているグループとユーザが表示されれば、問題なくOpenLDAPの設定は完了となる。

なお、バインドせずともOpenLDAPサーバに登録されているグループとユーザが表示される理由は、LDAPのデータベースに対してアクセス権を設定していない場合は、デフォルトで匿名ユーザの参照権限が有効となるためである。権限の設定方法は、別記事で紹介することとし、今回は割愛する。

以上で、OpenLDAPサーバの構築は完了となる。次回以降は今回構築したOpenLDAPサーバに対して、LDAPSの有効化やLinuxのSSSDを使って認証連携を行うことにする。

参考

0 件のコメント:

コメントを投稿

人気の投稿