Keycloak & OAuth2 Proxy を docker イメージでテストする

先日、distroless/static ベースの OAuth2 Proxy コンテナイメージを作成した というメモを書きました。 これらのコンテナを使って KeycloakOAuth2 Proxy を連携させ、Web アプリケーションに見立てた Nginx を認証で保護する方法をメモしておきます。

検証環境の構成

今回は以下の構成を構築していきます。 同一のコンピュータ内に docker (docker-compose) を使って Keycloak, OAuth2 Proxy, Nginx を構築します。 Keycloak は 8080 ポート、OAuth2 Proxy は 80 ポートを公開します。 Nginx は外部へポートを公開しません。

file

Keycloak

まず、Keycloak の構築を行います。

Step.1

docker をインストールします。

dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install -y docker-ce docker-ce-cli containerd.io
systemctl start docker
systemctl enable docker

続いて docker-compose をインストールします。

mkdir -p /usr/local/lib/docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

Step.2

Keycloak 用の docker-compose.yaml ファイルを用意します。

mkdir -p /opt/keycloak/
cat << 'EOF' > /opt/keycloak/docker-compose.yaml
version: "3"

services:
  keycloak:
    image: jboss/keycloak:16.1.0
    environment:
      KEYCLOAK_USER: admin
      KEYCLOAK_PASSWORD: password
    ports:
      - 8080:8080
EOF

docker-compose でコンテナを起動します。

cd /opt/keycloak/
docker compose up -d

Step.3

Web ブラウザで http://ADDRESS:8080 へアクセスします。 Welcome to Keycloak 画面が表示されますので Administration Console をクリックします。

file

Step.4

Sign in to your account 画面が表示されます。 docker-compose.yaml ファイル中で KEYCLOAK_USERKEYCLOAK_PASSWORD でユーザ名&パスワードを定義しているのでその通りに admin / password を入力してログインします。

file

Step.5

Master Realm のトップ画面が表示されます。 画面左上、Master という Realm 名にカーソルをあわせると Add realm というボタンが表示されるので、これをクリックします。

file

Step.6

Add realm 画面が表示されます。 Name 欄に relam1 と入力して Create をクリックします。

file

Step.7

realm1 という名前の Realm が作成されました。 Endpoints 欄の OpenID Endpoint Configuration をクリックします。

file

Step.8

Well Known 情報が表示されます。 後の手順で OAuth2 Proxy から参照させる為、Issuer の値は控えておきます。

file

Step.9

RealmLogin タブをクリックします。 デフォルトでは以下のようになっています。

file

下記を有効化しておきます。

  • User Registration
  • Forgot password
  • Remember me

file

Step.10

次はクライアント (≒ アプリケーション) の定義を行います。 ClientsCreate をクリックします。

file

Step.11

Client ID という欄には分かりやすいクライアント名を入力します。

file

Step.12

クライアント名を入力すると以下の画面が表示されます。 デフォルトで Access Typepublic になっています。

file

Access Typeconfidential へ変更します。 また、Valid Redirect URL には http://OAUTH2-ADDRESS/* を入力します。

file

Step.13

クライアントの Credentials タブをクリックします。 Secret 欄にクライアントシークレットの文字列が表示されているのでこれを控えておきます。

file

これで Keycloak 側の最低限の設定は完了です。

OAuth2 Proxy

続いて OAuth2 Proxy の構築を行います。

Step.1

まず最初に Cookie Secret 値を生成する必要があります。これは Generating a Cookie Secret に記載されているように、幾つかの方法で生成することが出来ます。 OpenSSL で生成する場合は以下を実行します。

openssl rand -base64 32 | tr -- '+/' '-_'

bash で生成するには以下を実行します。

cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1 | base64

生成した Cookie Secret 値は以降の手順で利用します。

Step.2

docker-compose で OAuth2 Proxy を起動します。 必要なパラメータは環境変数として定義します。 指定が必要なパラメータと、このメモ上で説明した箇所は以下の通りです。

項目 説明箇所 補足
OAUTH2_PROXY_COOKIE_SECRET OAuth2 Proxy → Step.1 -
OAUTH2_PROXY_OIDC_ISSUER_URL Keycloak → Step.8 -
OAUTH2_PROXY_CLIENT_ID Keycloak → Step.11 -
OAUTH2_PROXY_CLIENT_SECRET Keycloak → Step.13 -
OAUTH2_PROXY_REDIRECT_URL - http://OAUTH2-ADDRESS/oauth2/callback

具体的な docker-compose.yaml 例は以下の通りです。

mkdir -p /opt/oauth2-proxy/
cat << 'EOF' > /opt/oauth2-proxy/docker-compose.yaml
version: "3"

services:
  nginx:
    image: sig9/nginx
  oauth2-proxy:
    image: sig9/oauth2-proxy
    environment:
      OAUTH2_PROXY_HTTP_ADDRESS: 0.0.0.0:4180
      OAUTH2_PROXY_COOKIE_SECRET: jVHdfev2CVquxDj88MyUMwyfyD_WnGi_7lSA4Dnbmjc=
      OAUTH2_PROXY_COOKIE_SECURE: "false"
      OAUTH2_PROXY_COOKIE_NAME: "oauth2_proxy"
      OAUTH2_PROXY_EMAIL_DOMAINS: "*"
      OAUTH2_PROXY_UPSTREAMS: http://nginx/
      OAUTH2_PROXY_PROVIDER: oidc
      OAUTH2_PROXY_OIDC_ISSUER_URL: http://10.0.0.1:8080/auth/realms/realm1
      OAUTH2_PROXY_CLIENT_ID: client1
      OAUTH2_PROXY_CLIENT_SECRET: L7PcVvKbOD0OlB1VzmG4LwADqdbIOtpi
      OAUTH2_PROXY_REDIRECT_URL: http://10.0.0.1/oauth2/callback
      OAUTH2_PROXY_SCOPE: openid email profile
      OAUTH2_PROXY_PASS_ACCESS_TOKEN: "true"
      OAUTH2_PROXY_PASS_USER_HEADERS: "true"
      OAUTH2_PROXY_PASS_AUTHORIZATION_HEADER: "true"
      OAUTH2_PROXY_SKIP_PROVIDER_BUTTON: "true"
      OAUTH2_PROXY_INSECURE_OIDC_ALLOW_UNVERIFIED_EMAIL: "true"
    ports:
      - 80:4180
EOF

docker-compose でコンテナを起動します。

cd /opt/oauth2-proxy/
docker compose up -d

Step.3

Web ブラウザで http://ADDRESS (ポート番号は指定しない) へアクセスします。 新規作成した realm1 Realm の Sign in to your account 画面が表示されます。 まだユーザを作成していない為、画面下部にある Register をクリックします。

file

Step.4

Register 画面が表示されます。

file

以下のようにユーザ情報を入力して新規ユーザを作成します。

file

Step.5

これでアプリケーション (Nginx) へログイン出来るようになりました。

file

コメント

タイトルとURLをコピーしました