MinIO+Keycloak+LDAPの連携
夢は広がる…
と
の続きです。
今度はLDAPを立ててみようと思いまして、立ててみてその後にKeycloakとの連携をしてみました。
manager付でLDAPを立てる
まずはLDAPを立てます。
面倒なのでDocker Composeで立てちゃいます。
services:
ldap-nginx:
container_name: ldap-nginx
hostname: ldap-nginx
image: nginx:stable-alpine3.19-perl
volumes:
- ./conf/nginx.conf:/etc/nginx/nginx.conf
- ./certs/evakichi.example.com.crt:/opt/certs/evakichi.example.com.crt:ro
- ./certs/evakichi.example.com.key:/opt/certs/evakichi.example.com.key:ro
ports:
- 8085:80
- 8444:443
networks:
- ldap-network
ldap:
container_name: ldap
hostname: ldap
image: osixia/openldap:1.5.0
ports:
- 389:389
- 636:636
environment:
- LDAP_ORGANISATION=Example.com.
- LDAP_DOMAIN=example.com
- LDAP_ADMIN_PASSWORD=admin
- LDAP_BASE_DN=dc=example,dc=com
- LDAP_READONLY_USER=true
- LDAP_READONLY_USER_USERNAME=readonly
- LDAP_READONLY_USER_PASSWORD=readonly_password
- LDAP_TLS_VERIFY_CLIENT=never
- LDAP_TLS_CRT_FILENAME=evakichi.example.com.crt
- LDAP_TLS_KEY_FILENAME=evakichi.example.com.key
- LDAP_TLS_CA_CRT_FILENAME=evakichi.example.com.ca.crt
- TZ=Asia/Tokyo
volumes:
- ldap_data:/var/lib/ldap
- ldap_config:/etc/ldap/slapd.d
- ./certs/evakichi.example.com.ca.crt:/container/run/service/slapd/assets/certs/evakichi.example.com.ca.crt
- ./certs/evakichi.example.com.crt:/container/run/service/slapd/assets/certs/evakichi.example.com.crt
- ./certs/evakichi.example.com.key:/container/run/service/slapd/assets/certs/evakichi.example.com.key
tty: true
networks:
- ldap-network
restart: always
lam:
container_name: lam
hostname: lam
image: ghcr.io/ldapaccountmanager/lam:stable
environment:
- LDAP_DOMAIN=example.com
- LDAP_BASE_DN=dc=example,dc=com
- LDAP_USERS_DN=ou=people,dc=example,dc=com
- LDAP_GROUPS_DN=ou=groups,dc=example,dc=com
- LDAP_SERVER=ldap://ldap:389
- LAM_LANG=ja_JP
- LAM_PASSWORD=lam
- VIRTUAL_HOST=lam
networks:
- ldap-network
networks:
ldap-network:
volumes:
ldap_data:
ldap_config:
このとき、nginxのconfigファイルは以下のとおりです。(おそらく無駄なことも書いています。あしからず)
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
server {
listen 80;
server_name evakichi.example.com;
return 301 https://$http_host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name evakichi.example.com;
ssl_protocols TLSv1.3;
ssl_certificate /opt/certs/evakichi.example.com.crt;
ssl_certificate_key /opt/certs/evakichi.example.com.key;
# Allow special characters in headers
ignore_invalid_headers off;
# Allow any size file to be uploaded.
# Set to a value such as 1000m; to restrict file size to a specific value
client_max_body_size 0;
# Disable buffering
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
chunked_transfer_encoding off;
proxy_pass http://lam:80; # This uses the upstream directive definition to load balance
}
}
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
実行します。
$ docker compose up -d
管理画面の起動と実行
次に、LAM(LDAP Account Manager)を起動します。(https://evakichi.example.com:8444)
右上の「LAM構成設定」を押します。
次の画面では「サーバプロファイルの編集」を選択します。
LAMのパスワードを聞かれますのでDockerComposeで作ったパスワードを入れます。
「有効なユーザのリスト」「ツリーのサフィックス」が間違っていないことを確認したらタイムゾーンを変更して左下の「保存」を押します。
もう一度トップ画面に戻るので先程compose.yml
で生成したadminのパスワードを入力してログインします。
この画面に来たらまずはグループを作ります。右上から「Accounts」→「グループ」の順に選択します。
グループ名はKeycloakのレルム内で作ったグループ名にします。(私の場合はminio)
左上の「保存」を押します。
グループが作成されたことを確認します。
次はユーザの作成です。右上から「Accounts」→「ユーザ」の順に選択します。
編集画面で必須項目を入れます。
そのあと、左ペインから「UNIX」を選択し、グループが「minio」になっていることを確認します。
(うまくスクショが取れず・・・)
そして「パスワードの設定」ボタンを押してパスワードを設定します。
完了通知が来たらOKです。
Keycloakの設定
一覧を見てOKそうだったら次はKeycloakのページに移ります。
レルムは予め作っておくとします。つくったら左ペインの一番下「User federation」を押し「Add LDAP Providers」を押します。
必須項目だけ書いていきます。
-
UI display name: ldap
-
Vender: Other
-
Connection URL: ldap://evakichi.example.com
一度「Test connection」を押して確認しましょう。
- Bind type: simple
- Bind DN: cn=admin,dc=example,dc=com
- Bind credentials: compose.ymlで設定したもの。
一度「Test authentication」を押して確認しましょう。
- Edit mode: WRITABLE
- Users DN: ou=people,dc=example,dc=com
- Username LDAP attribute: uid
- RDN LDAP attribute: uid
- UUID LDAP attribute: objectGUID
- User object classes: posixAccount,inetOrgPerson,organizationalPerson,person
ここまでかけたらSaveします。
左ペインの Usersを押しますが、ユーザが出ないことがあります。そんなときは慌てずに検索窓に「*」をいれてすべてのユーザを出せばいいのです。
接続試験
ユーザ一覧が確認できたらMinIOから接続試験をします。
うまく行ったかに思えましたが、
この手のエラーはポリシーがあたっていないためなので、グループのメンバーに追加しないといけないみたいです。
左ペインから「Groups」を選択してグループを選択します。その後MenbersタブからAddmemberを押してメンバーを追加します。
これでもう一度SSOで入ってみましょう。
めでたく入れましたのでこれで作業は終了です。
終わりに
これでLDAPとも連携できました。認証の幅が広がります。ぜひお試しあれ。
Discussion