見出し画像

IDPを立ち上げるためにKeycloakを使う

はじめに


こんにちは、相も変わらず、仕事でプログラミングコードを書く機会がなかなか無い今日この頃です。
機会がなければ欲しくなるのが人の世の常
毎年の、年末年始の行事として何かしら作るようにしています。
今回はその前準備として、ユーザー認証環境を構築しておこうと思います。

KeyCloakとは?


公式の情報を見ると最小限の労力で導入が可能なようです。

Add authentication to applications and secure services with minimum effort.

https://www.keycloak.org/

Docker Containerで立ち上げる

公式の情報を元にDocker containerを起動してみます。

docker run -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:25.0.2 start-dev

https://www.keycloak.org/getting-started/getting-started-docker

無事起動しました。

2024-08-17 16:44:21 Updating the configuration and installing your custom providers, if any. Please wait.
2024-08-17 16:44:24 2024-08-17 07:44:24,265 INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 2867ms
2024-08-17 16:44:26 2024-08-17 07:44:26,026 INFO  [org.infinispan.CONTAINER] (ForkJoinPool.commonPool-worker-1) ISPN000556: Starting user marshaller 'org.infinispan.jboss.marshalling.core.JBossUserMarshaller'
2024-08-17 16:44:26 2024-08-17 07:44:26,362 INFO  [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_354917, Site name: null
2024-08-17 16:44:26 2024-08-17 07:44:26,363 INFO  [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener
2024-08-17 16:44:26 2024-08-17 07:44:26,713 INFO  [org.keycloak.quarkus.runtime.storage.legacy.liquibase.QuarkusJpaUpdaterProvider] (main) Initializing database schema. Using changelog META-INF/jpa-changelog-master.xml
2024-08-17 16:44:27 
2024-08-17 16:44:27 UPDATE SUMMARY
2024-08-17 16:44:27 Run:                        134
2024-08-17 16:44:27 Previously run:               0
2024-08-17 16:44:27 Filtered out:                 0
2024-08-17 16:44:27 -------------------------------
2024-08-17 16:44:27 Total change sets:          134
2024-08-17 16:44:27 
2024-08-17 16:44:27 2024-08-17 07:44:27,838 INFO  [org.keycloak.services] (main) KC-SERVICES0050: Initializing master realm
2024-08-17 16:44:28 2024-08-17 07:44:28,826 INFO  [org.keycloak.services] (main) KC-SERVICES0009: Added user 'admin' to realm 'master'
2024-08-17 16:44:28 2024-08-17 07:44:28,881 INFO  [io.quarkus] (main) Keycloak 25.0.2 on JVM (powered by Quarkus 3.8.5) started in 4.544s. Listening on: http://0.0.0.0:8080. Management interface listening on http://0.0.0.0:9000.
2024-08-17 16:44:28 2024-08-17 07:44:28,882 INFO  [io.quarkus] (main) Profile dev activated. 
2024-08-17 16:44:28 2024-08-17 07:44:28,882 INFO  [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-h2, keycloak, logging-gelf, narayana-jta, reactive-routes, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]
2024-08-17 16:44:28 2024-08-17 07:44:28,885 WARN  [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production.

念の為コンテナの環境変数を確認しておきます。

sh-5.1$ printenv
KEYCLOAK_ADMIN_PASSWORD=admin
KC_RUN_IN_CONTAINER=true
HOSTNAME=3da0846432aa
PWD=/
HOME=/opt/keycloak
LANG=en_US.UTF-8
KEYCLOAK_ADMIN=admin
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/printenv
sh-5.1$ 

Keycloakは外部DBを指定しない場合は、内包したH2データベースを使うとのこと、それは流石に不便なので、DBは別のコンテナで立ち上げることにします。
マニュアルが非常に親切です。さすが最小限の労力と謳うだけありますね。

Taking the next step

Before you run Keycloak in production, consider the following actions:Switch to a production ready database such as PostgreSQL.
Configure SSL with your own certificates.
Switch the admin password to a more secure password.


For more information, see the server guides.

https://www.keycloak.org/getting-started/getting-started-docker

KeycloakのDBに外部DBを設定


導入しようとしているkeycloak:25.0.2では以下のDBが利用できるようです。

https://www.keycloak.org/server/db

よりDockerfileを拝借

FROM quay.io/keycloak/keycloak:latest as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
ENV KC_DB=postgres

WORKDIR /opt/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:latest
COPY --from=builder /opt/keycloak/ /opt/keycloak/

# change these values to point to a running postgres instance
ENV KC_DB=postgres
ENV KC_DB_URL=<DBURL>
ENV KC_DB_USERNAME=<DBUSERNAME>
ENV KC_DB_PASSWORD=<DBPASSWORD>
ENV KC_HOSTNAME=localhost
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]

どうやら、Postgress押しのようですがここはあえてMariaDB:10.11で行きます。
作成したDockerfileは以下の通りです。
Docker Composeを利用するため、不要なパラメタはコメントアウトします。

FROM quay.io/keycloak/keycloak:latest as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
#ENV KC_DB=postgres

WORKDIR /opt/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:latest
COPY --from=builder /opt/keycloak/ /opt/keycloak/

# change these values to point to a running postgres instance
#ENV KC_DB=postgres
#ENV KC_DB_URL=<DBURL>
#ENV KC_DB_USERNAME=<DBUSERNAME>
#ENV KC_DB_PASSWORD=<DBPASSWORD>
ENV KC_HOSTNAME=localhost
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]

MariaDB用のDockerfileを用意します。

FROM mariadb:10.11
RUN touch /var/log/mysql/mysqld.log

ADD my.cnf /etc/mysql/conf.d/my.cnf
RUN chmod 644 /etc/mysql/my.cnf

ついでにMariaDBのコンフィグファイルを用意します。

[mysqld]
# 文字コード、整合順序の設定
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client] 
default-character-set=utf8mb4

フォルダ構成はこんな感じにします。
docker-compose.ymlからcompose.ymlに推移した事実を忘れてました、過去の資産が重たいです。

.
├── compose.yml
├── db
│   ├── Dockerfile
│   └── my.cnf
└── keycloak
    └── Dockerfile

compose.ymlはこんな感じで

services:
  keycloak:
    build:
     context: ./keycloak
    environment:
      #db
      KC_DB: mariadb
      #KC_DB_URL_HOST: db
      #KC_DB_URL_PORT: 3306
      KC_DB_DATABASE: keycloak
      KC_DB_URL: jdbc:mariadb://db:3306/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: password
      
      #Admin
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: password


      #Settings
      #KEYCLOAK_USER: mbw
      #KEYCLOAK_PASSWORD: mbw
      KC_HEALTH_ENABLED: true
      KC_METRICS_ENABLED: true
      #KC_HTTP_PORT: 8080
      #KC_HTTP_RELATIVE_PATH: '/auth'
      KC_HTTP_ENABLED: true
      KC_HOSTNAME: localhost
      KC_HOSTNAME_STRICT: false
      KC_HOSTNAME_STRICT_HTTPS: true

    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    build:
      context: ./db
    environment:
      # デフォルトのDB
      MARIADB_DATABASE: keycloak
      # デフォルトの一般ユーザー
      MARIADB_USER: keycloak
      # デフォルトの一般ユーザーのパスワード
      MARIADB_PASSWORD: password
      # 管理者(ユーザー名はroot)のパスワード
      MARIADB_ROOT_PASSWORD: admin
      # タイムゾーン
      TZ: Asia/Tokyo
    volumes:
      # DBの永続化
      - db-volume:/var/lib/mysql
    ports:
      # ポート設定
      - '3306:3306'
   
# ボリューム設定(永続化のため)
volumes:
  db-volume:
    name: mariadb-data
    driver: local

ローカルPCのコンテナをとりあえず、綺麗にします。

docker rm $(docker ps -a -q)
docker rmi $(docker images -q)

docker compose で起動します。

docker compose up -d
Docker Desktopで状態を確認

keycloakが正常動作しているかどうか確認するためログを確認します。

2024-08-17 17:44:20 Updating the configuration and installing your custom providers, if any. Please wait.
2024-08-17 17:44:24 2024-08-17 08:44:24,159 INFO  [io.qua.dep.QuarkusAugmentor] (main) Quarkus augmentation completed in 3030ms
2024-08-17 17:44:25 2024-08-17 08:44:24,537 WARN  [org.keycloak.quarkus.runtime.cli.Picocli] (main) The following used run time options are UNAVAILABLE and will be ignored during build time:
2024-08-17 17:44:25     - hostname-strict-https: Available only when hostname:v1 feature is enabled.
2024-08-17 17:44:25 2024-08-17 08:44:25,983 INFO  [org.infinispan.CONTAINER] (ForkJoinPool.commonPool-worker-1) ISPN000556: Starting user marshaller 'org.infinispan.jboss.marshalling.core.JBossUserMarshaller'
2024-08-17 17:44:26 2024-08-17 08:44:26,433 INFO  [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: node_148413, Site name: null
2024-08-17 17:44:26 2024-08-17 08:44:26,486 INFO  [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener
2024-08-17 17:44:27 2024-08-17 08:44:27,160 INFO  [io.quarkus] (main) Keycloak 25.0.2 on JVM (powered by Quarkus 3.8.5) started in 2.941s. Listening on: http://0.0.0.0:8080 and https://0.0.0.0:8443. Management interface listening on https://0.0.0.0:9000.
2024-08-17 17:44:27 2024-08-17 08:44:27,161 INFO  [io.quarkus] (main) Profile dev activated. 
2024-08-17 17:44:27 2024-08-17 08:44:27,161 INFO  [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-mariadb, keycloak, logging-gelf, micrometer, narayana-jta, reactive-routes, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, smallrye-health, vertx]
2024-08-17 17:44:27 2024-08-17 08:44:27,165 WARN  [org.keycloak.quarkus.runtime.KeycloakMain] (main) Running the server in development mode. DO NOT use this configuration in production.

では念願のブラウザでアクセスして起動を確認します。


http://localhost:8080

おわり

環境の構築が終わりましたので、あとは公式通りに設定作業をするだけになりました。まだまだ、やることはあるのですが、長くなりそうなので、今日はここまでにします。


この記事が気に入ったらサポートをしてみませんか?