Keycloakでリソースの保護（プロキシ編）



## はじめに

Keycloakでリソースを保護しようとするとき下記の２つが存在するみたい。

* Webサーバと連携してプロキシを設定し特定のURL等を保護する
* Client Adapterで言語レベルで組み込む

ここではApacheを利用してプロキシ型？の保護設定を試してみる。
Keycloakの設定自体は[こちら](https://qiita.com/zaburo/private/6df185803cb019cd257c)をご覧ください。

## Keycloakの設定

### クライアントの作成と設定

既存クライアントを使ってもいいのですが、設定を確認するため新規に作成します。
名前は[test]とします。

![スクリーンショット_2021-03-15_9_43_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/af2291c8-338d-1b96-7cd2-310fdde0dd2b.png "スクリーンショット_2021-03-15_9_43_15.png")

画面が切り替わるのでtestクライアントの設定を行います。
Access Typeをconfidentialに、Valid Redirect Urlsを設定します。

> confidentialにすることでclient secretを要求するようになるようです。

![スクリーンショット_2021-03-15_9_44_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/5039bc59-78b1-d387-5496-68e1a3ba2314.png "スクリーンショット_2021-03-15_9_44_10.png")

RPからのリクエスト時に利用するのでclient secretをコピーしておきます。

![スクリーンショット_2021-03-15_9_44_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/89a38c7c-0932-f90c-0e6e-14a8a06b026e.png "スクリーンショット_2021-03-15_9_44_30.png")

### ユーザーの作成と設定

ユーザーを作成してもいいですが、手順簡素化のためにここではadminを利用していきます。

>ユーザーを作成した場合は、Credentialタブでパスワードを設定しておきましょう。



## Apache(RP)側の設定

### Docker imageのダウンロードと設定

Apacheを用意するのは面倒なので、Dockerを利用します。コンテナ側の80番ポートをホスト側の8081ポートにマップします。

```bash
docker run -d -p 8081:80 --name rp php:8.0.3-apache 
```

コンテナが起動したらログインして設定を行います。
vimが入っていないのでvimを入れましょう。

```bash
docker exec -it rp /bin/bash
apt-get update
apt-get install -y vim
```

### libapache2-mod-auth-openidcのインストールと設定

プロキシ設定用のモジュールをインストールします。Keycloak依存ではなくOpenID Connect用のものです。

```bash
apt-get install -y libapache2-mod-auth-openidc
```

インストールが完了したら追加された設定ファイルを編集していきます。
ファイルは/etc/apache2/mods-enabled/auth_openidc.confです。
ポイントは下記の３つ

* OIDCProviderMetadataURL のサーバ名はホストのIPアドレスにする（localhostでは接続できない）
* OIDCClientSecret は先程コピーしたsecret
* OIDCRedirectURI はKeycloak側で設定したRedirect URLに合せる

以上に注意しながら設定します。

```bash:/etc/apache2/mods-enabled/auth_openidc.conf
OIDCProviderMetadataURL       http://192.168.0.21:8080/auth/realms/master/.well-known/openid-configuration
OIDCClientID                  test
OIDCClientSecret              c011d4eb-30e4-4c61-a21f-f658e8dacabf
OIDCResponseType              code
OIDCScope                     "openid"
OIDCSSLValidateServer         Off
OIDCProviderTokenEndpointAuth client_secret_basic
 
OIDCRedirectURI               http://localhost:8081/secure
OIDCCryptoPassphrase          passphrase
OIDCPreservePost              On
 
<Location /secure>
   AuthType         openid-connect
   Require          valid-user
</Location>
```

### コンテンツ作成

動作確認用のコンテンツを作成しておきます。

```php:/var/www/html/secure/test.php
<?php
	phpinfo();
```

### コンテナの再起動

```bash
docker restart rp
```

## 動作確認

### URLにアクセス

http://localhost:8081/secure/test.php

### 認証

![スクリーンショット 2021-03-15 10.01.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/427295a0-83d8-91a0-b136-8a5e54547953.png "スクリーンショット 2021-03-15 10.01.41.png")


### 内容確認

![スクリーンショット 2021-03-15 10.03.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55188/a5ce1c20-af10-bca3-bdad-73d59eac8814.png "スクリーンショット 2021-03-15 10.03.13.png")


## KeycloakもDockerで

```bash
docker run -d -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=password --name keycloak quay.io/keycloak/keycloak
```

## 参考

* https://tech-lab.sios.jp/archives/19319
* https://qiita.com/rawr/items/d4f45e094c39ef43cbdf