tWAS 9.0 と Keycloak で SAML認証

# 目的
SAML認証の構成は難しいので、Dockerとスクリプトで自動で構成できるようにします。一部ブラウザ操作が必要です。

# Gitレポジトリ
Liberty で SAML認証したものと同じものを使用します。用意したGitレポジトリをクローンします。

```
git clone https://github.com/pdprof/security-auth.git
cd security-auth/saml-docker
```

# Keycloak Dockerイメージのビルド
LibertyとKeycloakのイメージをビルドします。Libertyの構成をしたことがある場合は、削除するかそのまま使います。
まず、ブラウザでアクセスするホスト名を環境変数 ACCESS_HOST に指定します。ローカルでテストしている場合はlocalhost、リモートの場合はそのホスト名を指定します。

- 認証で使用するのでアクセス時のホストに一致させる必要があります。
- setup-docker.sh で docker の liberty(ol) と keycloak(kc) が開始します。
- Keycloakのビルドと起動後に100秒の待ち時間があります。環境によってはこの時間を延ばしてください。

```
export ACCESS_HOST=localhost
# export ACCESS_HOST=`hostname` # hostnameコマンドで返す値でアクセスできる場合
./setup-docker.sh
```

# tWAS 9.0 Dockerイメージのビルド
tWAS 9.0 Dockerイメージをビルドします。7060, 7043, 7080, 7443をLISTENします。

```
export ACCESS_HOST=localhost
# export ACCESS_HOST=`hostname` # hostnameコマンドで返す値でアクセスできる場合
./setup-was90.sh
```

# SAML認証の動作確認

http://localhost:7080/security.auth/

にアクセスします。アクセスしているポートが 7080 なのに気を付けてください。Keycloakの認証画面が表示されたら

```
Username: pdprof
Password: password
```

を入力して Sign In します。httpsの証明書エラーが表示されますが、問題ないものとしてアクセスを継続します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/b8afe70f-b449-68c3-69e1-28e0744f8ad9.png)

が表示されれば成功です。

# SP Initiated の Client Signatureを有効にする

構成後は Client Signature は有効になっていません。手動で有効にします。

http://localhost:8080/auth/admin/master/console/#/realms/pdprof/clients

にアクセスします。localhost部分はACCESS_HOSTの指定に変わっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/71ad5f8f-c868-d6c7-ad86-ec14d9a54dd4.png)

```
admin
password
```

で Sign In します。左側 の Clients をクリックして　Client ID に

```
http://localhost:7080/samlsps/acs
```
が増えていることを確認しクリックします。ホスト名はACCESS_HOSTの指定で変わります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/52ca2cdf-fe07-d846-fb58-4bbb47f2632e.png)

Client Signature Required は 設定後は OFFになっているので、これを有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/96766341-9c06-1fb3-68bb-adbff235a830.png)

以下は IDP Initiated の構成を試すときに必要になるので、事前に指定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/4da9d602-f380-430b-6218-f76dd7b490f8.png)

構成を更新したあとは保管します。

Client IDをクリックしたあとの Keys のタブ（Client Signature Requiredを有効にして保管していないと表示されない）で tWASの key を import します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/b447ad90-3f4f-044c-ef0b-e86219d1fa48.png)

setup-was90.sh の実行で key.p12 が実行ディレクトリにコピーされているので、Key Alias: defulat , Store Password: は以下のコマンドで確認したもの で import します。

```
podman exec was90-saml cat /tmp/keystorepasswordupdated
```

注：tWASのデフォルトパスワードは WebAS ですが、コンテナー作成時に変更されているので確認が必要です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/70b9c213-e4c9-e043-67e2-cb28449349bf.png)



# IDP Initiated へ動作を変える

Client Signature Requiredの構成中でした IDP Initiated SSO... の設定が更新済みであることを確認します。Dockerイメージは SP Initiated で構成してあります。SPからredirect可能なIDP Initiated に動作を変えることができます。
WASの管理コンソールで

- Security > Global Security > Web and SIP security > Trust association をクリックします。画像の右下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/cefb3df2-78c6-491a-74b8-705392c4cd6c.png)

- Intercepter > com.ibm.ws.security.web.saml.ACSTrustAssociationInterceptor をクリックすると以下の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/bc84eb47-eacf-eafc-4ebd-6093ac17a93c.png)

Docker build 時に保管されているこれを以下の値に変更します。

- sso_1.sp.login.error.page : http://localhost:8080/auth/realms/pdprof/protocol/saml/clients/was90
- sso_1.idp_1.SingleSignOnUrl : http://localhost:8080/auth/realms/pdprof/protocol/saml/clients/was90
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/8a0dac65-6c71-2c11-fc18-900c9a75eb33.png)


変更後に保管したらWASを再起動します。これで

http://localhost:8080/auth/realms/pdprof/protocol/saml/clients/was90

にアクセスしてログインするとWASにリダイレクトされます。WASの

http://localhost:7080/security.auth/

にアクセスしたときの表面上の動きは変わっていない（IDPに転送される）ように見えますが、内部的な動きは変わっているので、IDPの構成に合わせて対応します。

# 参考情報

## SAML Clientの手動登録

自動で作成される SAMLクライアントの手動登録の方法です。

http://localhost:8080/auth/admin/master/console/#/realms/pdprof/clients

にアクセスします。localhost部分はACCESS_HOSTの指定に変わっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/71ad5f8f-c868-d6c7-ad86-ec14d9a54dd4.png)

```
admin
password
```

で Sign In します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/52ca2cdf-fe07-d846-fb58-4bbb47f2632e.png)

テーブル右上の Create ボタンを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/f083fe22-afd1-55d3-57bd-672656027111.png)

- Client Protocol に saml を選択
- Select file ボタンで　setup-docker.sh を実行したディレクトリに spMetadata-was90.xml があるので選択
- Save ボタンを押す

次の画面では以下を変更します。必要な設定はこのページの上に記載しました。


## tWAS 9.0のSecurity構成

アプリケーションをデプロイしたときに必要戸なる設定です。
管理コンソールにログインします。

```
wsadmin
passw0rd
```

- https://localhost:7043/ibm/console
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/eba0559a-c70e-bca6-1272-db0de955aad3.png)

- WASのセキュリティ構成
Security > Global Security に移動して Enable application security のチェックして Apply をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/aaba9f41-be8e-89b8-59ad-e7a72cfb9c0f.png)

- アプリケーションのセキュリティマッピング
Applications > Application Types > WebSphere enterprise applications > security_auth
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/7a4cf0b3-f602-3d31-a237-ddf5a2524e42.png)
のページで　Security role to user/group mapping をクリックします。上の画像の右下です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/0df2e3f9-8028-ac30-5da4-19c325751efe.png)
次のページで AllAuthenticated を選択して、All Authenticated in Trusted Realms を選択して、OKをクリックします。

その後は Save してサーバー再起動です。

```
docker stop was90-saml
docker start was90-saml
```

# まとめ

tWASでSAML認証ができるようになりました。

# 参考文書

https://www.ibm.com/docs/ja/was/9.0.5?topic=swss-enabling-saml-sp-initiated-web-single-sign-sso

https://www.ibm.com/docs/en/product-master/12.0.0?topic=sso-enabling-saml-service-provider-initiated-web