KnowledgeでOpenLDAP連携

公開:2021/02/23
更新:2021/02/23
6 min読了の目安(約6100字TECH技術記事

最近になって OpenLDAP を触りはじめました.アカウントの一元管理が目的です.
色々と問題なく設定できていたのですが,Knowledgeというオープンソースの情報共有サービスでつまづいたので,まとめておきたいと思います.最初に書いてありますが,LDAP 初心者なのであしからず.

Dockerコンテナを使って構築します.環境は Docker for Windows で確認しました.

📌 OpenLDAP

ディレクトリサービスは OpenLDAP を使用します.管理用に phpLDAPAdmin も使います.
以下は docker-compose.yml ファイルです.

version: "3"
services:
  ldap-server:
    image: osixia/openldap:latest
    restart: always
    container_name: ldap-host
    environment:
      LDAP_ORGANISATION: "ABC"
      LDAP_DOMAIN: "dev.local"
      LDAP_ADMIN_PASSWORD: "admin"
    volumes:
      - "data:/var/lib/ldap"
      - "config:/etc/ldap/slapd.d"
    ports:
      - "389:389"
  
  ldap-admin:
    image: osixia/phpldapadmin:latest
    container_name: ldap-admin
    restart: always
    environment:
      PHPLDAPADMIN_LDAP_HOSTS: "ldap"
      PHPLDAPADMIN_HTTPS: "false"
    ports:
      - "6001:80"
    links:
      - "ldap-server:ldap"
    volumes:
      - "phpadmin_data:/var/www/phpldapadmin"

volumes:
  data:
  config:
  phpadmin_data:

docker-compose up -d でコンテナを起動します.
起動したら,http://localhost:6001 で phpLDAPAdmin にアクセスします.
もし Docker Toolbox on Windows を使用している場合は Docker Terminal を起動したときに docker-machine の IP アドレスが表示されていますので,localhost の部分はその IP アドレスで置き換えます.docker-machine env でも確認することができます.

phpLDAPAdmin の画面が表示されたら,login をクリックして,以下を入力します.

項目
Login DN cn=admin,dc=dev,dc=local
Password admin

ログインできると,左側に dc=dev,dc=local,その下に cn=admin があると思います.そのすぐ下にある Create new entry here をクリックして,Generic: Organizational Unit を選択します.入力欄には users と入れて Create Object を押して Commit します.そうすると cn=admin の下に ou=users という項目が追加されているはずです.

次に ou=users をクリックして,右側の Create a child entry をクリックします.テンプレートから Kolab: User Entry を選択して,必要な情報を入力します.Last Name, Common Name は必須で,あとは Email, Password も設定して Create Object を押して Commit とします.これでユーザーアカウントが追加できました.

📌 Knowledge

次に Knowledge を構築します.以下のリポジトリのものをベースとします.

https://github.com/support-project/docker-knowledge

すでに構築した OpenLDAP を使いますので,そのネットワークに含まれるようにします.パブリックIPアドレスが割り当てられているなら,ネットワークの設定は不要です.以下は docker-compose.yml ファイルです.

version: '3'
services:
  app:
    image: koda/docker-knowledge
    volumes:
      - data:/root/.knowledge
    ports:
      - "8080:8080"
    restart: always
    depends_on:
      - "db"
    networks:
      - default
      - openldap_default
  db:
    image: postgres:9
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=admin123
      - POSTGRES_DB=knowledge_production
    volumes:
      - db_data:/var/lib/postgresql/data
    restart: always

volumes:
  data:
  db_data:

networks:
  openldap_default:
    external: true

これでKnowledgeのコンテナを起動して localhost:8080 にアクセスします.右上のメニューからサインインを選択して,以下を入力します.

項目
ID admin
パスワード admin123

これで管理者でログインできます.ログインできたら,右上のメニューからシステム設定を選びます.次にシステム設定からLdap設定をクリックします.LDAP設定画面になりますので,追加を押します.

Ldap Config1, Ldap Config2 と2つの設定がありますが,Ldap Config2 を使います.以下のように設定します.

項目
設定名 OpenLDAP
Host ldap-host
Port 389
Security Plain
検索用に接続するための Bind DN cn=admin,dc=dev,dc=local
検索用に接続するためのパスワード admin
ユーザー検索のBaseDN ou=users,dc=dev,dc=local
ユーザ検索のFilter (cn=:userid)
Id Attribute cn
Name Attribute givenName
Mail Address Attribute mail
管理者ID admin

入力したら保存を押します.その後に保存されている設定で接続確認を押して,「接続できました」と確認できれば設定は完了です.

これで,一度ログアウトして,LDAPで追加したユーザーアカウントでログインしてみましょう.ログインできなければ次に進みます.

📌 アクセス権の設定

どうやら,OpenLDAP でアクセス権の設定が必要なようです.
アクセス権は以下のコマンドで確認できます.

ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config

docker コマンドを使えば次のようになります.

docker exec -it ldap-host ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config

確認するところは次の部分です.

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
    by self write
    by dn="cn=admin,dc=dev,dc=local" write
    by anonymous auth
    by * none
olcAccess: {1}to *
    by self read
    by dn="cn=admin,dc=dev,dc=local" write
    by * none

これを次のように書き換えます.

dn: olcDatabase={1}mdb,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
    by self write
    by dn="cn=admin,dc=dev,dc=local" write
    by anonymous auth
    by * none
olcAccess: {1}to *
    by users read
    by dn="cn=admin,dc=dev,dc=local" write
    by * none

変更するには ldapmodify コマンドを使用します.
まず,上記の設定を ./ldif/acl.ldif というファイルに保存します.

OpenLDAP の docker-compose ファイルを編集します.

version: "3"
services:
  ldap-server:
    image: osixia/openldap:latest
    restart: always
    container_name: ldap-host
    environment:
      LDAP_ORGANISATION: "ABC"
      LDAP_DOMAIN: "dev.local"
      LDAP_ADMIN_PASSWORD: "admin"
    volumes:
      - "./ldif:/ldif"
      - "data:/var/lib/ldap"
      - "config:/etc/ldap/slapd.d"
    ports:
      - "389:389"
  
  ldap-admin:
    image: osixia/phpldapadmin:latest
    container_name: ldap-admin
    restart: always
    environment:
      PHPLDAPADMIN_LDAP_HOSTS: "ldap"
      PHPLDAPADMIN_HTTPS: "false"
    ports:
      - "6001:80"
    links:
      - "ldap-server:ldap"
    volumes:
      - "phpadmin_data:/var/www/phpldapadmin"

volumes:
  data:
  config:
  phpadmin_data:

これを使ってコンテナを再起動します.
./ldif//ldif/ にマウントしていますので,以下のコマンドを実行します.

ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f /ldif/acl.ldif

または

docker exec -it ldap-host ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f /ldif/acl.ldif

実行して modifying entry "olcDatabase={1}mdb,cn=config" と表示されれば正常に変更されています.これでもう一度ログイン出来ることを確認してみます.

以上です.