先日、distroless/static ベースの OAuth2 Proxy コンテナイメージを作成した というメモを書きました。 これらのコンテナを使って Keycloak と OAuth2 Proxy を連携させ、Web アプリケーションに見立てた Nginx を認証で保護する方法をメモしておきます。
検証環境の構成
今回は以下の構成を構築していきます。 同一のコンピュータ内に docker (docker-compose) を使って Keycloak, OAuth2 Proxy, Nginx を構築します。 Keycloak は 8080 ポート、OAuth2 Proxy は 80 ポートを公開します。 Nginx は外部へポートを公開しません。
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
をクリックします。
Step.4
Sign in to your account
画面が表示されます。 docker-compose.yaml
ファイル中で KEYCLOAK_USER
と KEYCLOAK_PASSWORD
でユーザ名&パスワードを定義しているのでその通りに admin
/ password
を入力してログインします。
Step.5
Master Realm のトップ画面が表示されます。 画面左上、Master
という Realm 名にカーソルをあわせると Add realm
というボタンが表示されるので、これをクリックします。
Step.6
Add realm
画面が表示されます。 Name
欄に relam1
と入力して Create
をクリックします。
Step.7
realm1
という名前の Realm が作成されました。 Endpoints
欄の OpenID Endpoint Configuration
をクリックします。
Step.8
Well Known 情報が表示されます。 後の手順で OAuth2 Proxy から参照させる為、Issuer
の値は控えておきます。
Step.9
Realm
→ Login
タブをクリックします。 デフォルトでは以下のようになっています。
下記を有効化しておきます。
- User Registration
- Forgot password
- Remember me
Step.10
次はクライアント (≒ アプリケーション) の定義を行います。 Clients
→ Create
をクリックします。
Step.11
Client ID
という欄には分かりやすいクライアント名を入力します。
Step.12
クライアント名を入力すると以下の画面が表示されます。 デフォルトで Access Type
は public
になっています。
Access Type
は confidential
へ変更します。 また、Valid Redirect URL
には http://OAUTH2-ADDRESS/*
を入力します。
Step.13
クライアントの Credentials
タブをクリックします。 Secret
欄にクライアントシークレットの文字列が表示されているのでこれを控えておきます。
これで 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
をクリックします。
Step.4
Register
画面が表示されます。
以下のようにユーザ情報を入力して新規ユーザを作成します。
Step.5
これでアプリケーション (Nginx) へログイン出来るようになりました。
コメント