既存の静的サイトに、後付けで以下のようなアクセス制限をかけたい。
site/
+- index.html : インデックスページ。誰でも表示できる
+- user1/ : user1 用ディレクトリ。この中のファイルは user1 しか表示できない
| +- profile.html
+- user2/ : user2 用ディレクトリ。この中のファイルは user2 しか表示できない
+- profile.html
Keycloak と oauth2-proxy/oauth2-proxy を組み合わせることで、そういったことができそうなので試した。
現状の oauth2-proxy では、パスごとのアクセス権限設定できず、 アップストリーム単位でのアクセス制限しかないようだ。
前述の目的は達成できないが、とりあえず使い方だけ記録しておく。
前提
- OS: Windows 10 Pro
- Docker: Docker version 20.10.6, build 370c289
構築イメージ
+----------+ +-------+
| Keycloak | | NGINX |
+----------+ +-------+
↑ localhost:8080 ^ localhost:8000
+--------------+ |
| OAuth2 Proxy |------+
+--------------+
↑ localhost:18080
+---------+
| Browser |
+---------+
Keycloak の準備
docker-compose.yaml の取得
Invoke-WebRequest -OutFile docker-compose.yaml -Uri https://raw.githubusercontent.com/keycloak/keycloak-containers/master/docker-compose-examples/keycloak-postgres.yml
とりあえず今回は管理者情報含めてこのまま使う。
Keycloak コンテナ起動
Realm 追加
http://localhost:8080
へ接続- ログイン
Username
:admin
Password
:Pa55w0rd
- 左上の
Master
にマウスオーバーしたときに表示されるAdd realm
を押下 Add realm
ページが表示されるので、必要事項を記入してCreate
ボタン押下Name
:MyApp
Enabled
:ON
OAuth クライアントの追加
Clients
->Create
ボタン押下Add Client
ページが表示されるので、必要事項を記入してSave
ボタン押下Client ID
:oauth2-proxy
Client Protocol
:openid-connect
Root URL
:http://localhost:18080
Oauth2-proxy
の設定ページが表示されるため、必要な項目を更新してSave
ボタン押下Access Type
:confidential
Mappers
タブ ->Create
ボタン押下、必要事項を記入してSave
ボタン押下Name
:Group Membership
Mapper Type
:Group Membership
Token Claim Name
:groups
Installation
タブ ->Format Option
をKeycloak OIDC JSON
に変更 -> 値を控える
ロール・グループ・ユーザーの設定
ロール作成
Roles
->Add Role
ボタン押下Add Role
ページが表示されるので、必要事項を記入してSave
ボタンを押下Role Name
:authorized
グループ作成
Groups
->New
ボタン押下Create group
ページが表示されるので、必要事項を記入してSave
ボタン押下Name
:authorized
Role Mapping
タブを開くAvailable Roles
を選択し、add selected>
ボタン押下。Assigned Roles
にauthorized
が追加されたことを確認
ユーザー作成
Users
->Add user
ボタン押下Add user
ページが表示されるので、必要事項を記入してSave
ボタン押下username
:mikoto
Email
:mikoto2000@gmail.com
Credentials
タブを開き、パスワード設定を行いSet Password
ボタンを押下Password
,Password Confirmation
を入力Temporary
:OFF
へ変更
Groups
タブを開き、グループ設定を行うAvailable Groups
からauthorized
を選択し、join
ボタンを押下
NGINX 起動
OAuth2 Proxy の準備
実行バイナリのダウンロード
oauth2-proxy V7.1.3 のリリースページ から、 oauth2-proxy-v7.1.3.windows-amd64.tar.gz
をダウンロードし、展開する。
展開した oauth2-proxy
を oauth2-proxy.exe
にリネーム。
cookie-secret の生成
oauth2-proxy 実行
$CLIENT_SECRET="f2c7ef6b-e955-4ed2-8843-72f0975956f5"
$KEYCLOAK_BASE_URL="http://localhost:8080/auth/realms/MyApp/protocol/openid-connect"
$OAUTH2_PROXY_ADDRESS="http://localhost:18080"
$NGINX_ADDRESS="http://localhost:8000"
./oauth2-proxy --provider="keycloak" `
--client-id="oauth2-proxy" `
--client-secret=${CLIENT_SECRET} `
--login-url="${KEYCLOAK_BASE_URL}/auth" `
--redeem-url="${KEYCLOAK_BASE_URL}/token" `
--profile-url="${KEYCLOAK_BASE_URL}/userinfo" `
--validate-url="${KEYCLOAK_BASE_URL}/userinfo" `
--http-address=${OAUTH2_PROXY_ADDRESS} `
--upstream=${NGINX_ADDRESS} `
--scope="openid" `
--redirect-url="http://localhost:18080/oauth2/callback" `
--email-domain="*" `
--cookie-secret=${COOKIE_SECRET} `
--allowed-group="/authorized"
動作確認
http://localhost:18080/index.html
へアクセスすると、 Keycloak のログイン画面が表示される。
ログインすると、 http://localhost:18080/index.html
で、 NGINX に配置した index.html
が表示される。
以上。
参考資料
- Keycloak
- Keycloak コンテナがめっちゃ便利だったのでついでに https 化もした - Qiita
- Keycloakのクライアント・アダプターを試してみる(Tomcat編) - Qiita
- oauth2-proxy/oauth2-proxy: A reverse proxy that provides authentication with Google, Github or other providers.
- Keycloak Auth Provider - OAuth Provider Configuration | OAuth2 Proxy
- Overview | OAuth2 Proxy
- OAuth Provider Configuration | OAuth2 Proxy
0 件のコメント:
コメントを投稿