既存の静的サイトに、後付けで以下のようなアクセス制限をかけたい。
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:adminPassword:Pa55w0rd
- 左上の
Masterにマウスオーバーしたときに表示されるAdd realmを押下 Add realmページが表示されるので、必要事項を記入してCreateボタン押下Name:MyAppEnabled:ON
OAuth クライアントの追加
Clients->Createボタン押下Add Clientページが表示されるので、必要事項を記入してSaveボタン押下Client ID:oauth2-proxyClient Protocol:openid-connectRoot URL:http://localhost:18080
Oauth2-proxyの設定ページが表示されるため、必要な項目を更新してSaveボタン押下Access Type:confidential
Mappersタブ ->Createボタン押下、必要事項を記入してSaveボタン押下Name:Group MembershipMapper Type:Group MembershipToken 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:mikotoEmail: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 件のコメント:
コメントを投稿