初めての OpenAM

# 背景
- 業務で OpenID Connect や SAML を触る機会がありました
- その文脈で OpenAM を触る必要があったため、忘れないようにメモります

# OpenAM とは
Wiki を読むと、Sun Microsystems 社が OpenSSO として開発し、2016年まで ForgeRock 社にサポートされ、現在は OSS(Open Identity Platform Community サポート)に至る。(※ [wiki](https://en.wikipedia.org/wiki/OpenAM))


OpenAM は複数機能を有しています。

1. Authentication
1. Authorization
1. Adaptive risk authentication
1. Federation
1. Single sign-on(SSO)
1. High availability

ざっと読んでイメージを掴みたいと思います。

#### Authentication
- 複数の認証方式をサポート。JAVA でカスタム認証モジュールを作れる。

#### Authorization
- XACML (eXtensible Access Control Mark-Up Language)に基づいてポリシーを作れる。XACML って...聞いた事ないです...

#### Adaptive risk authentication
- 認証対象のユーザをスコア算出(ex:IPアドレス範囲、アイドル時間、新規デバイス)し、スコアに基づいて追加認証を要求する。

#### Federation
- Federation はセキュアに identity 情報を共有する。要は SMAL2.0 や OpenID Connect をサポートし、認証ゲートウェイ(multi protcol-hub)になります。

#### Single sign-on(SSO)
- Federatin とほぼ同義ですね。OpenAM は agent(アプリ側にインスト)があるようで、agent インスト不可環境でも色々できます。

#### High availability
- session failover 機能を有します。いわゆる NW 機器の Active-Standby 構成でしょうか。

### Developer access
- client application programming interfaces を Java,C APIs,a RESTful API 提供しているようです。

# とりあえず触ってみたい
[git](https://github.com/OpenIdentityPlatform/OpenAM)に諸々上がっていますので、docker run する方式が一番簡単そうです。git の README にも、既存環境に変更を加えることなく、SAML2.0, OICD, Cross Domain Single sign on(CDSSO)を提供すると言っています。OSS の認証ゲートウェイですね。

#### Quick Start Guide
[Quick Start Guide](https://github.com/OpenIdentityPlatform/OpenAM/wiki/Quick-Start-Guide)を読みながら環境を用意します。

###### 検証環境
- CnetOS: `CentOS Linux release 7.8.2003 (Core)`
- Docker: `Docker version 20.10.12, build e91ed57`

###### 手順

1.Docker 環境を用意します。

2.Docker を動作させている host 側の /etc/hosts ファイルを修正します。

```
127.0.0.1   localhost openam.example.com www.example.com
```

3.docker run をコマンド実行します。

```
#docker run -h openam.example.com -p 8080:8080 --name openam                   openidentityplatform/openam

// -h : ホスト名を指定
// -p : ポートを指定(ホスト側:コンテナ側)
// -name : コンテナ名を指定

Unable to find image 'openidentityplatform/openam:latest' locally
latest: Pulling from openidentityplatform/openam
627b765e08d1: Pull complete
c040670e5e55: Pull complete
073a180f4992: Pull complete
bf76209566d0: Pull complete
f10db7ba7580: Pull complete
5e5dee180760: Pull complete
c26c02f721c2: Pull complete
d24d42fda432: Pull complete
20abf5c2533f: Pull complete
d16e82e0b4a0: Pull complete
4f4fb700ef54: Pull complete
8ce75fc249df: Pull complete
Digest: sha256:7fda33515006c61fdf71011cf65d40abee462686515f96461a7fbedd41bafd9b
Status: Downloaded newer image for openidentityplatform/openam:latest
```

image をダウンロードしてコンテナを起動します。結構 info が出力されますね。



4.docker ps コマンドを実行します。

```
# docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED         STATUS         PORTS                                       NAMES
59383bab0fd2   openidentityplatform/openam       "/usr/local/tomcat/b…"   4 minutes ago   Up 4 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   openam
```

5.正常に起動したようなのでホスト側から http://openam.example.com:8080/openam にアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/10c11bd7-2de7-7163-3e83-b146d2e6b46b.png)

6."Create Default Configuration" を選択して進めます。規約に agree して、先に進むとパスワード設定が必要になります。スーパーユーザーと agent 側で必要になるようです。忘れずどこかにメモっておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/fb3b5ea5-3375-2821-51d5-181b5ce0dad7.png)

7.設定が完了すると、ログイン画面が表示されます。amAdmin と先ほどのパスワードを入力してログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/f01198dc-186d-2273-eca3-12597661887e.png)

ここまでで環境準備は終わりました。まずは簡単そうな SSO あたりから初めて、最終的に OCID を動かしたいと思います。

8.デフォルトの Top Level Realm を選択し、Authorization -> Policy Sets -> New Policy Set の順番でクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/0c7a4178-4437-e18b-20e0-db955036d3a6.png)

[マニュアル](https://backstage.forgerock.com/docs/openam/13.5/admin-guide/#configure-apps-with-console)を読むと、Policy Sets はポリシーのテンプレートとして使われるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/54a4c177-efdf-12f0-d6f8-6e303271bad7.png)
・Id は必須項目
・Nmae は option です
・Resoure Types は URL を指定

9.オブジェクト作成完了後、実際の Policy を追加する必要があるので、Add a Policy していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/dfddee89-bf9c-7df9-7687-d70afba52479.png)

10.マニュアルに沿って進めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/5baeeec1-1b6e-3961-33a8-368add5cf701.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/b7a86124-89bb-3410-a228-bafe7f5d5ef6.png)

11.新規作成 Policy に許可するメソッドを指定するようです。GET と POST を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/7484363f-f2f7-eaf9-899c-bde334ee3445.png)

12.Subject Condition(要はアクセス許可対象？）を設定します。先ほど作成した Authenticated Users を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/363b8342-1634-138d-195a-8cc0719bedec.png)

13.Applications -> Web Agents を選択し、画面中段の Agent を新規作成する New...ボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/2f914962-5285-8485-d5c5-e14aaca98d19.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/0111e6bf-f3db-1c49-9e3c-104bd1f821b0.png)

14.Cookie 設定を追加するべき Global Services は何も表示されない。とりあえずスキップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/474478/8fe39a02-8705-e953-fc1e-f1a8bc4323d0.png)

15.任意の作業フォルダに apache 用の Dockerfile を作成します。パスワードのみ OpenAM セットアップ時に指定した agent のパスワードを指定します。
`/home/user/openam-quickstart/apache/`

16.Dockerfile 保存パスは適宜変更して docker build コマンドを実行します。
`docker build --network=host -t apache_agent -f /home/user/openam-quickstart/apache/Dockerfile /home/user/openam-quickstart/apache/`

ちょろちょろエラー出ます...時間無いので続きは今度！！

17.リダイレクトを確認して終了ですね。

# あとがき
OpenAM 勉強本はほぼ洋書のみなんですね...Qiita 記事と Google さんでどうにもならなかったら手を出すしかないんですね...