LDAPで研究室のアカウント管理

研究室では主にファイルサーバーを使ってデータの共有・継承を行っています。今後Wikiやredmineなども活用したいと思い、アカウントの管理が複雑になりそうなので、LDAPを導入することにしました。
LDAPは様々な情報を保管するデータベースのようなソフトですが、主にアカウント(ユーザーIDやパスワード)を保管して、様々なソフトに認証の仕組みを提供することができます。
今回はOpenLDAPを使います。

OpenLDAPのインストール

実機のOSはMIRACLE Linux9.0です。これにdockerでOpenLDAPのコンテナを作成します。
compose.yamlを編集して、ldapサービスを定義します。

compose.yamlの一部

  ldap:
    image: osixia/openldap
    container_name: ldap
    restart: always
    volumes:
      - ./ldap/var/lib/ldap:/var/lib/ldap
      - ./ldap/etc/ldap/slapd.d:/etc/ldap/slapd.d
    ports:
      - 389:389
    environment:
      LDAP_ORGANISATION: tsbioinfo
      LDAP_DOMAIN: tsbio.info
      LDAP_BASE_DN: "dc=tsbio,dc=info"
      LDAP_ADMIN_PASSWORD: xxxxx

OpenLDAPを起動

# docker compose up -d ldap

接続確認

コンテナに入ってldapsearchコマンドを動かします。

# docker exec -it ldap bash
# ldapsearch -x -H ldap://localhost -b dc=tsbio,dc=info -D "cn=admin,dc=tsbio,dc=info" -w xxxxx
(以下検索結果)
# 
# extended LDIF
#
# LDAPv3
# base  with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# tsbio.info
dn: dc=tsbio,dc=info
objectClass: top
objectClass: dcObject
objectClass: organization
o: tsbioinfo
dc: tsbio

ldapsearchコマンドをホスト(MIRACLE LINUX)側にインストールしておくと、いちいちコンテナに入らなくてすみます。

# dnf install openldap
# ldapsearch -x -H ldap://localhost -b dc=tsbio,dc=info -D "cn=admin,dc=tsbio,dc=info" -w xxxxx
(以下省略)

データの登録

LDIFという形式でデータを用意し、ldapaddコマンドで登録、、、というのは骨が折れるので、phpLDAPadminを使います。
こちらもdockerを利用し、ホストのApacheからリバースプロキシで接続するようにします。

compose.yamlの一部

  ldap-admin:
    image: osixia/phpldapadmin
    restart: always
    ports:
      - 10085:80
    environment:
      PHPLDAPADMIN_LDAP_HOSTS: ldap
      PHPLDAPADMIN_HTTPS: false

phpLDAPadminを起動

# docker compose up -d ldap-admin

/etc/httpd/conf.d/kiku3.confの一部

<Virtualhost *:443>
    <Location /ldap/>
        Require ip 157.110.xx.yy  # IPアドレスによるアクセス制限
        ProxyPass http://localhost:10085/
        ProxyPassReverse http://localhost:10085/
    </Location>
</Virtualhost>

apacheを再起動

# systemctl restart httpd

動作確認

https://kiku3.tsbio.info/ldap/ をブラウザーで開くと、以下のような画面が表示される。

左のloginをクリックして、ログイン画面に進む。
Login DNとしてcn=admin, dc=tsbio, dc=info 、Passwordとしてcompose.yamlに設定したものを入力してAuthenticateをクリックする。

メンバー登録

ou=Laboの登録

  1. 画面左のツリーで、dc=tsbio,dc=infoをクリックする。
  2. Create new entry here をクリックする。
  3. 右のTemplates中の Generic: Organisational Unitをクリックする。
  4. Laboと入力し、Create Objectをクリックする。

inetOrgPersonの登録

ol=Laboを追加したのと同じように、ou=Laboの下にCourier Mail Accountを作成する。
今のところサーバーへのログインとかsambaアカウントの作成を考えておらず、ウェブサービスの認証に使うだけなので、このオブジェクトで十分と思う。

ユーザーのパスワードの更新

phpLDAPadminを使うことを考えた最大の理由はユーザーにパスワードを更新させる方法の提供でした。
が、ログインにDN (uid=xxxx,ou=Labo,cn=tsbio,cn=info)を入力する必要があり、それを説明する・理解させるのが面倒になり、自前でプログラムを作成しました。その顛末はいずれここに追記します。