AQ Tech Blog

CentOS9でLDAP環境構築をしてみた

作成者: daichi.araki|2023年12月08日

本記事はAsiaQuest Advent Calendarの8日目です。

 

LDAPの環境構築

CentOS Stream 9にOpenLDAPをインストールし、 LDAPサーバにphpLDAPadminをインストールするまでの手順をまとめました。

 

LDAPとは

ログイン情報を管理するツールであり、PHPやJava等と連携しユーザー情報を管理できます。
アカウント周りを独自で作成しなくても良いのが利点です。
また、パスワードのログイン期限等を一括で設定できるため、独自で作成しなくても良いのが利点です。

環境情報

OS: CentOS Stream 9
CPU: インテル® Celeron® プロセッサー N3050
メモリ: 8GB
OpenLDAP: v2.6.2

LDAPサーバの環境構築手順

OpenLDAPのインストールと構築

OpenLDAPのインストール
ドメイン名は「asia.quest」として進めていきます。
※必要に応じて変更してください

yum -y install openldap-servers openldap-clients

  • OpenLDAPの起動とOS起動時の自動起動を設定
systemctl start slapd
systemctl enable slapd

  • 初期化を行う
ls /etc/openldap/slapd.d/cn=config

  • 上記コマンドを実施し、olcDatabase={2}の値を確認
    mdb.ldifかhdb.ldifとなっているので覚えておいてください。
    今回はmdb.ldifであるためmdb.ldifとして進めていきます。
systemctl stop slapd
rm -fr /etc/openldap/slapd.d/cn=config/olcDatabase={2}mdb.ldif
rm -fr /var/lib/ldap
install -d -o ldap -g ldap -m 0700 /var/lib/ldap
install -d -o ldap -g ldap -m 0700 /var/lib/ldap/asia.quest
systemctl start slapd

  • デフォルトのドメインがmy-domain.comとなっているためasia.questに変更
sudo ldapmodify <<__EOD__
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external
,cn=auth" read by dn.base="cn=Manager,dc=asia,dc=quest" read by * none
__EOD__

(以下内容が表示されれば成功)
modifying entry "olcDatabase={1}monitor,cn=config"

  • 基本的なスキーマの読み込み
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif

  • ドメイン用DB情報を作成
    ※初期化時にhdbであった場合はmdbの部分をhdbに置き換えてください
ldapadd -Y EXTERNAL -H ldapi:/// <<__EOD__
dn: olcDatabase={2}mdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcMdbConfig
olcDatabase: {2}mdb
olcDbDirectory: /var/lib/ldap/asia.quest
olcSuffix: dc=asia,dc=quest
olcRootDN: cn=Manager,dc=asia,dc=quest
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=asia,dc=quest" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=asia,dc=quest" write by * read
olcDbIndex: objectClass eq,pres
olcDbIndex: ou,cn,mail,surname,givenname eq,pres,sub
__EOD__

(以下内容が表示されれば成功)
adding entry "olcDatabase={2}mdb,cn=config"

  • データベースのチューニング
ldapmodify -Y EXTERNAL -H ldapi:/// <<__EOD__
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcDbConfig
olcDbConfig: set_cachesize 0 67108864 1
olcDbConfig: set_lg_dir .
olcDbConfig: set_lg_bsize 33554432
olcDbConfig: set_lk_max_objects 3000
olcDbConfig: set_lk_max_locks 3000
olcDbConfig: set_lk_max_lockers 3000
olcDbConfig: set_flags DB_LOG_AUTOREMOVE
__EOD__

(以下内容が表示されれば成功)
modifying entry "olcDatabase={2}mdb,cn=config"

  • パスワードの暗号化
slappasswd
New password:(パスワードを入力)
Re-enter new password:(パスワードを再度入力)
{SSHA}XXXXXXXXXX(こちらを{SSHA}からコピーする)

  • ドメインのパスワードを設定
ldapmodify -Y EXTERNAL -H ldapi:/// <<__EOD__
dn: olcDatabase={2}mdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}XXXXXXXXXX(先ほど作成したパスワードを貼り付け)
__EOD__

(以下内容が表示されれば成功)
modifying entry "olcDatabase={2}mdb,cn=config"

  • ドメイン情報の作成
ldapadd  -x -D cn=Manager,dc=asia,dc=quest -W <<__EOD__
dn: dc=asia,dc=quest
objectClass: top
objectClass: dcObject
objectclass: organization
o: Asia Quest(企業情報のため好きな名前に変更してください)
dc: AQ(企業情報のため好きな名前に変更してください)
__EOD__

(以下内容が表示されれば成功)
adding new entry "dc=asia,dc=quest"

  • OpenLDAPがHTTP通信でのデータ閲覧を無効化している場合、phpLDAPadminでログインできないため、
    OpenLDAPのHTTP通信でのデータ閲覧を有効化する
getsebool httpd_can_connect_ldap
httpd_can_connect_ldap --> off(onになっている場合はsetseboolを実行しなくてOK)
setsebool -P httpd_can_connect_ldap on

  • 外部からアクセスを許可したい場合Firewallの設定を行う
firewall-cmd --add-service=ldap --permanent
firewall-cmd --reload

 

以上でOpenLDAPの設定が完了です。

もしドメインを追加する場合は、以下を実施しドメイン用DB情報を作成から進めていただければ問題ないです。

systemctl stop slapd
install -d -o ldap -g ldap -m 0700 /var/lib/ldap/(ドメイン名)
systemctl start slapd

 

phpLDAPadminのインストール

※前提条件としてPHP、Apatchが設定されているものとします

  • phpLDAPadminのインストール
yum -y install phpldapadmin

  • ログインをuidからdnでログインするよう変更
vi  /etc/phpldapadmin/config.php
(以下場所を変更)
// $servers->setValue('login','attr','dn');
$servers->setValue('login','attr','uid');

$servers->setValue('login','attr','dn');
// $servers->setValue('login','attr','uid');

  • 外部からアクセスを許可したい場合以下の設定を行う
    ※指定方法はスラッシュ表記法でも可(例:192.168.255.255/16)
    apatchによって記載する箇所は片方でも良いですが、面倒であれば両方記載すれば確実です
vi /etc/httpd/conf.d/phpldapadmin.conf
(以下場所を変更)
<Directory /usr/share/phpldapadmin/htdocs>
<IfModule mod_authz_core.c>
# Apache 2.4
Require local
Require ip (IPアドレスを指定)
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from all
Allow from 127.0.0.1 (IPアドレスを指定)
Allow from ::1
</IfModule>
</Directory>

  • phpLDAPadminをapatchに連携するよう設定
vi /etc/httpd/conf/httpd.conf
(以下一文を最後に追加、存在する場合は不要)
Include conf.d/*.conf

以上でphpLDAPadminの設定が完了です。

phpLDAPadminの使い方

  • http://localhost/phpldapadmin(別サーバーの場合localhostの部分はサーバーのIPかドメイン名)でphpLDAPadminに遷移する

ログインDNには、作成したDN(今回の場合は「cn=Manager,dc=asia,dc=quest」)、
パスワードには、先ほど設定したパスワードを入力するとログインができます。

ログイン後の画面は以下となっており、左のdc=asia,dc=questが作成したドメイン情報となります。

OUの作成

  • ドメイン情報の「子の項目を作成」を押下
  • 「Generic: Organisational Unit」を押下
  • OUの名前を設定
  • 問題ない場合はコミットを押下
  • OU情報が作成される

ユーザーの作成

  • OU情報の「子の項目を作成」を押下
  • 「Generic: Simple Security Object」または「Generic: User Account」を押下
    今回は「Generic: Simple Security Object」を選択
  • ユーザー名、パスワードを設定
  • 問題ない場合はコミットを押下
  • ユーザーが作成される
  • 削除する場合は「この項目を削除」を押下すると削除できる

簡単ですが以上がphpLDAPadminの使い方です。

次回はPHP(Laravel)かJava(Spring)を使用してLDAP経由のログインを試していけたらと思います。

参考文献

【Server World】OpenLDAP : LDAPサーバーの設定
【Developers IO】LDAPサーバにphpLDAPadminをインストールして疎通確認する
【Qiita】OpenLDAPをマルチドメインでレプリケーション