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

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

    本記事は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に遷移する

    20231208_CentOS9_01

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

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

    OUの作成

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

    ユーザーの作成

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

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

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

    参考文献

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