📖

MinIO+Keycloak+LDAPの連携

2024/06/18に公開

夢は広がる…

https://zenn.dev/evakichi/articles/7c1beafb5bdb96

https://zenn.dev/evakichi/articles/cfe0dea7029514

の続きです。

今度はLDAPを立ててみようと思いまして、立ててみてその後にKeycloakとの連携をしてみました。

manager付でLDAPを立てる

まずはLDAPを立てます。
面倒なのでDocker Composeで立てちゃいます。

compose.yml
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ファイルは以下のとおりです。(おそらく無駄なことも書いています。あしからず)

nginx.conf

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