KnowledgeでOpenLDAP連携
最近になって 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 を構築します.以下のリポジトリのものをベースとします.
すでに構築した 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 | |
管理者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"
と表示されれば正常に変更されています.これでもう一度ログイン出来ることを確認してみます.
以上です.
Discussion