CentOS7にLDAPの環境を作る

開発環境でちょっとLDAP認証したいなって思ったけどちょうどよい資料がなかったのでメモ。


基本は以下で良いのだけれど「slapd.d」の再作成のところをちょっと変更。
あと、何度も手順をやり直すときのためにDB_CONFIGのコピーも入れてある。
CentOS 7 : OpenLDAP インストールと設定 : Server World


まずはインストール。clientsも入れる。

sudo yum install openldap-servers openldap-clients


ldap自体の設定を初期化して再作成。
以前はslapd.confベースだったみたいだけれどslapd.dディレクトリベースで。

sudo sh -c 'rm -rf /etc/openldap/slapd.d/*'
sudo /usr/libexec/openldap/convert-config.sh -f /usr/share/openldap-servers/slapd.ldif -F /etc/openldap/slapd.d


ldapデータベースを初期化して再作成。

sudo sh -c 'rm -rf /var/lib/ldap/*'
sudo cp -av /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
sudo chown ldap:ldap /var/lib/ldap/DB_CONFIG


このあとslapのコマンドを使うのでこの時点で起動/自動起動登録しておく。

sudo systemctl start slapd
sudo systemctl enable slapd


管理者のパスワードのハッシュを取得。
後述の【管理者パスワード】にはここで標準出力に表示された文字列を入れる。
この文字列は「{アルゴリズム}ハッシュ値」というフォーマットだがセキュリティ的に気にしなくてもよい場合はそのまま平文を書いてもよい。
当メモでも「user001」〜「user002」は平文で「password」と書いている。

slappasswd


ldap自体の設定を変更するファイルを作成。

vi ~/example.local.ldif
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=local

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=systemadmin,dc=example,dc=local

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: 【管理者パスワード】

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword
  by self read
  by dn="cn=systemadmin,dc=example,dc=local" write
  by anonymous auth
  by * none
olcAccess: {1}to dn.base=""
  by * read
olcAccess: {2}to *
  by self read
  by dn="cn=systemadmin,dc=example,dc=local" write
  by * read


ldap自体の設定を変更。

sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f ~/example.local.ldif


ユーザを登録するファイルを作成。

vi ~/people.example.local.ldif
# Domain
dn: dc=example,dc=local
objectClass: dcObject
objectClass: organization
dc: example
o: example

# People Container
dn: ou=people,dc=example,dc=local
objectClass: organizationalUnit
ou: people

# People
dn: cn=user001,ou=people,dc=example,dc=local
objectClass: person
cn: user001
sn: user001
userPassword: password

dn: cn=user002,ou=people,dc=example,dc=local
objectClass: person
cn: user002
sn: user002
userPassword: password


ユーザを登録。

sudo ldapadd -w 【管理者パスワード】 -D cn=systemadmin,dc=example,dc=local -f ~/people.example.local.ldif


管理者ユーザで登録一式を確認。

sudo ldapsearch -x -w 【管理者パスワード】 -D cn=systemadmin,dc=example,dc=local -b dc=example,dc=local


user001で自身の情報を確認。

sudo ldapsearch -x -w password -D cn=user001,ou=people,dc=example,dc=local -b dc=example,dc=local '(cn=user001)'


必要ならファイアーウォールに設定を追加して任意のゾーン(例はpublic)でldapに接続できるように設定。

sudo firewall-cmd --add-service=ldap --zone=public
sudo firewall-cmd --add-service=ldap --zone=public --permanent


ファイアーウォールの設定を確認。

sudo firewall-cmd --list-all


以上で完了。

補足

slapd.ldifの中でcore.ldifがincludeされているがcore.ldifにないオブジェクトクラスを使いたい場合は以下のような感じで任意のスキーマを追加すること。
例えば今回の例ではユーザを「person」にしているがもうちょっとリッチなアカウント系のものにする場合は追加が必要。

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