第3章 Red Hat build of Keycloak をコンテナー内で実行する
この章では、コンテナーを実行する際に最適なエクスペリエンスを実現するために、Red Hat build of Keycloak コンテナーイメージを最適化して実行する方法を説明します。
この章は、OpenShift 環境で実行するイメージのビルドにのみ適用されます。このイメージは OpenShift 環境のみをサポートします。他の Kubernetes ディストリビューションで実行する場合はサポートされません。
3.1. カスタマイズおよび最適化されたコンテナーイメージの作成
デフォルトの Red Hat build of Keycloak コンテナーイメージは、すぐに設定および最適化できる状態で出荷されます。
Red Hat build of Keycloak コンテナーを最適に起動するには、コンテナーのビルド中に build
ステップを実行してイメージをビルドします。この手順を実行することで、後に続くコンテナーイメージの各起動フェーズで時間を節約できます。
3.1.1. 最適化された Red Hat build of Keycloak Dockerfile を記述する
次の Dockerfile
は、健全性およびメトリクスのエンドポイントとトークン交換機能を有効にし、PostgreSQL データベースを使用する、事前設定済みの Red Hat build of Keycloak イメージを作成します。
Dockerfile:
FROM registry.redhat.io/rhbk/keycloak-rhel9:24 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 registry.redhat.io/rhbk/keycloak-rhel9:24 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"]
ビルドプロセスには複数の段階が含まれます。
-
build
コマンドを実行してサーバーのビルドオプションを設定し、最適化されたイメージを作成します。 -
build
段階で生成されたファイルが、新しいイメージにコピーされます。 - 最後のイメージで、ホスト名とデータベースの追加の設定オプションが設定されているため、コンテナーの実行時にそれらを再度設定する必要はありません。
-
エントリーポイントで、
kc.sh
により、すべてのディストリビューションのサブコマンドがアクセス可能になります。
カスタムプロバイダーは、JAR ファイルを /opt/keycloak/providers
ディレクトリーに含めるステップを定義するだけでインストールできます。このステップは、以下のように、build
コマンドを RUNs
行の前に配置する必要があります。
# A example build step that downloads a JAR file from a URL and adds it to the providers directory FROM registry.redhat.io/rhbk/keycloak-rhel9:24 as builder ... # Add the provider JAR file to the providers directory ADD --chown=keycloak:keycloak --chmod=644 <MY_PROVIDER_JAR_URL> /opt/keycloak/providers/myprovider.jar ... # Context: RUN the build command RUN /opt/keycloak/bin/kc.sh build
3.1.2. 追加の RPM パッケージをインストールする
FROM registry.redhat.io/rhbk/keycloak-rhel9
段階で新しいソフトウェアをインストールしようとすると、microdnf
、dnf
、さらには rpm
がインストールされていないことがわかります。また、利用できるパッケージは非常に少なく、bash
シェルと Red Hat build of Keycloak 自体の実行に必要なものしかありません。これは、Red Hat build of Keycloak の攻撃対象領域を減らすセキュリティー強化対策によるものです。
まず、ユースケースを別の方法で実装できるかどうかを検討し、なるべく最終的なコンテナーへの新規 RPM のインストールを回避します。
-
Dockerfile 内の
RUN curl
命令は、リモート URL をネイティブにサポートしているため、ADD
に置き換えることができます。 -
一部の一般的な CLI ツールは、Linux ファイルシステムを創造的に使用することで置き換えることができます。たとえば、
ip addr show tap0
はcat/sys/class/net/tap0/address
になります。 - RPM を必要とするタスクはイメージビルドの前の段階に移動し、代わりに結果をコピーできます。
以下は例です。前のビルド段階で update-ca-trust
を実行し、後の段階に結果をコピーします。
FROM registry.access.redhat.com/ubi9 AS ubi-micro-build COPY mycertificate.crt /etc/pki/ca-trust/source/anchors/mycertificate.crt RUN update-ca-trust FROM registry.redhat.io/rhbk/keycloak-rhel9 COPY --from=ubi-micro-build /etc/pki /etc/pki
絶対に必要な場合は、ubi-micro で確立された次の 2 段階のパターンに従い、新しい RPM をインストールできます。
FROM registry.access.redhat.com/ubi9 AS ubi-micro-build RUN mkdir -p /mnt/rootfs RUN dnf install --installroot /mnt/rootfs <package names go here> --releasever 9 --setopt install_weak_deps=false --nodocs -y && \ dnf --installroot /mnt/rootfs clean all && \ rpm --root /mnt/rootfs -e --nodeps setup FROM registry.redhat.io/rhbk/keycloak-rhel9 COPY --from=ubi-micro-build /mnt/rootfs /
このアプローチでは chroot (/mnt/rootfs)
を使用するため、指定したパッケージとその依存関係のみがインストールされます。その結果、推測を必要とせずに第 2 段階に簡単にコピーできます。
一部のパッケージには、依存関係の大きなツリーがあります。新しい RPM をインストールすると、コンテナーの攻撃対象領域が意図せず増大する可能性があります。インストールされているパッケージのリストを慎重に確認してください。
3.1.3. コンテナーイメージの構築
実際の container イメージをビルドするには、Dockerfile を含むディレクトリーから次のコマンドを実行します。
podman build . -t mykeycloak
3.1.4. 最適化された Red Hat build of Keycloak コンテナーイメージの起動
イメージを起動するには、以下を実行します。
podman run --name mykeycloak -p 8443:8443 \ -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=change_me \ mykeycloak \ start --optimized
Red Hat build of Keycloak は、セキュアな HTTPS 通信のみを使用して実稼働モードで開始され、https://localhost:8443
で使用できます。
ヘルスチェックエンドポイントは、https://localhost:8443/health
、https://localhost:8443/health/ready
、および https://localhost:8443/health/live
で使用できます。
https://localhost:8443/metrics
を開くと、モニタリングソリューションで使用できる運用メトリクスを含むページが表示されます。