✍️blog

技術系のこととか

Keycloakをリバースプロキシ環境へデプロイ

いつの時代も入り口は1つでサービスは複数という構成はあるもので、
Keycloakをリバースプロキシの後ろへ配置することがあったのでメモ。

www.keycloak.org

TL;DR

公式ドキュメントが一番w

www.keycloak.org

環境

今回はDockerでリバプロ+Keycloakを用意します。

  • Keycloak
    • イメージ:quay.io/keycloak/keycloak:20.0.3
  • nginx(リバースプロキシ)
    • イメージ:nginx:1.23.3

nginxの準備

リバースプロキシとして動作するようにnginxの設定を用意します。

events {
    worker_connections  120;
}
http {
    server {
        listen 80;

        location /keycloak {
            proxy_set_header  Host              $http_host;
            proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header  X-Forwarded-Proto $scheme;
            proxy_set_header  X-Forwarded-port  $server_port;
            proxy_pass http://keycloak:8080/keycloak;
            proxy_redirect off;
      
        }
    }
}

/keycloakに来たリクエストをhttp://keycloak:8080/keycloakに流します。
流すと同時にX-Forwarded-*ヘッダーを付加します。
このヘッダーがあることでKeycloak側でもリバースプロキシの裏にいるんだなと認識してくれます。
大抵のリバースプロキシではこのヘッダーを付与してくれるはずw
(Forwardedヘッダの方が標準的なんでしょうけど。)

docker-compose.ymlの設定

version: "3"

services:
  keycloak:
    image: quay.io/keycloak/keycloak:20.0.3
    container_name: keycloak_app
    environment:
      KEYCLOAK_ADMIN: "admin"
      KEYCLOAK_ADMIN_PASSWORD: "password"
      KC_PROXY: "edge"
      KC_HTTP_RELATIVE_PATH: "keycloak"
    command: start-dev

  nginx:
    image: nginx:1.23.3
    container_name: keycloak_proxy
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - 80:80

nginxは先ほどの設定を読み込ませているだけです。

Keycloakの設定は実行時引数や設定ファイルでも可能ですが、今回は環境変数で設定を行っています。

ポイントは KC_PROXYKC_HTTP_RELATIVE_PATHの設定です。

KC_PROXYはKeycloakがリーバスプロキシの裏にいることを設定し、その際の動作モードを設定します。
設定値は以下のようなものがあります。

設定値 用途
none (デフォルト) リバースプロキシを使わない
edge リバースプロキシとの間の通信をHTTPで行う場合。リバースプロキシでTLSを終端してる時など。
reencrypt リバースプロキシとの間の通信をHTTPSで行う場合。
passthrough リバースプロキシがクライアントと行う通信と同じ方式で通信を行う。

私が、試した環境ではリバースプロキシ側でTLSを終端していたのでedgeを使用しています。
(上記のnginxにはHTTPSの設定は入ってないですけど...)

KC_HTTP_RELATIVE_PATHはkeycloakのコンテキストパスを指定するために使用します。

この設定で「http://localhost/keycloak」にアクセスするとkeycloakが表示されます。

www.keycloak.org


私が実際にKeycloakを載せようとしていたのは、AWS CloudFrontの後ろなんですが、
keycloakの動作確認を手軽にローカルでやれるようにコンテナでそれらしい環境を用意して試しました。
こういう時にコンテナは便利ですよね。(今更だろという話ですがw)

via GIPHY