OpenAM 14 SAML IdP(認証基盤)構築 10分間クッキング


# SAML IdPの構築
ほとんど全てのクラウドサービスで外部認証用として使われているSAML（サムル）プロトコル。
OpenAMではウィザード形式で設定でき、非常に短時間で正確にSAML認証サーバー(IdP)の認証基盤を構築できます。

前提条件としてOpenAM 14の環境構築が終わっている必要があります。
環境構築手順は前の記事[OpenAM 14を最速で構築する10分間クッキング](https://qiita.com/tonoki/items/6a59cb9fe0b3062d8e84)にありますので参考にしてください。
OpenAMのSAML認証基盤の構築完了までだいたい10分です。

※パスワードレス認証の設定も試したい場合は[OpenAM 14のパスワードレス設定10分間クッキング](https://qiita.com/tonoki/items/9cd3b6ff427bf9916ed0)を参考にしてください。

## 今回構築するイメージ
今回構築する構成はOpenAMをSAML IdPとし、G-SuiteをSPとするSAMLによるSSO環境です。
![openam-saml.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/11137af6-fa57-c391-153a-c19218eeaa64.png)


## OpenAM SAML認証基盤構築とサービス登録（SSO先追加）の流れ
通常[1]と[2]の作業は1回で良いです。[3]はサービス登録毎に行います。
 1.SAMLアサーション署名用の鍵ペアの生成
 2.OpenAMにSAML IdPを構築
 3.クラウドサービス毎にSAML連携設定を追加（今回はG-Suite)

## 1. SAMLアサーション署名用鍵ペアの設定
OpenAM初期設定後に自動生成されているtest鍵ペアは、全OpenAMサーバー共通なので、絶対に運用に使わないで下さい。
もちろんテスト用途だけならOKですが、どうせならコマンドライン一行なので独自に鍵ペア生成して使いましょう。

CNとか、validity(有効期限)だけ要件にあわせて変更してます。
OpenAMのインストールされた環境で以下のコマンドを実行します。

```console
# keytool -genkeypair \
 -keyalg rsa \
 -alias openam14-idp \
 -dname "CN=openam14.example.com,O=Example,ST=Tokyo,C=JP" \
 -keypass changeit \
 -keystore /usr/share/tomcat/openam/openam/keystore.jceks \
 -storetype JCEKS \
 -storepass changeit \
 -validity 365 \
 -keysize 2048
```

OpenAM管理者URLから **amadmin** でログインします。
https://openam14.example.com/openam?service=adminconsoleservice

![w1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/3da1d80d-1299-bd37-2359-29a5de447c76.png)

デプロイメントからサーバーを選びます。
![key2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/5cd1b9b3-d8f8-4d15-df4d-9056ba318cbf.png)

登録されているサーバー（今回は1台のみ）を選択します。
![key3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/678a32d6-805b-3114-7655-a8e8fbb81106.png)


前の工程で生成した鍵ペアのエイリアスを署名鍵として設定します。
左メニューから **セキュリティ** を選び、**キーストア** タブを選びます。
**証明書エイリアス** の **鍵🔒マーク** を押し、継承設定を解除後、
証明書エイリアスに先程実行したコマンドの **-alias** に指定した値 **[openam14-idp]** を入力し、**変更の保存** を押します。
![keystore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/a4382f90-e39c-4fe6-4865-8e51a0025daa.png)
署名鍵設定は以上です。

## 2.SAML IdP構築
次にOpenAM上にSAML IdPを構築します。
**[最上位のレルム]** を選択します。
![w2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/646d9d39-bdb3-48bd-0a3f-8eb071b02896.png)

レルムの概要画面で **SAMLv2プロバイダの作成** を選択します。
![idp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/cbbdf38a-fb1b-ce30-11ba-71ecd0812a35.png)

次の画面で **ホストアイデンティティプロバイダの作成** を選択します。
![idp3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/6085da30-7091-ce9a-152c-0ea60fd257c9.png)

**名前** は自動的に入っています。これが **Entity ID** となります。任意に変更できますが、URLをベースとした値にして置いた方が安全です。
署名鍵はプルダウンから先程設定した **openam14-idp** を選びます。
![idp4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/f07d317d-20cc-0a84-707e-2dca18a481a2.png)

**トラストサークル** はIdPとSPが共通で所属するイメージとなります。
任意の名前を入力し、右上の**設定**を押します。
![idp5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/bb95e097-95fd-cb2e-f5b1-dd59c9b24065.png)


一瞬でこの画面になると思いますが、この画面で既にIdP構築は完了しています。
右下の **終了** ボタンを押せば最初のレルム内の画面にもどります。

引き続きG-SuiteのSP設定を追加する場合は終了を押さずに **Google Apps(旧G-Suite名)を設定する** を選びます。
![idp6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/cf05d0da-6015-749c-3718-ad1b50aeab16.png)

ここまででIdP構築は完了です。

## SAML SPとしてクラウドサービスの G-Suite を追加する。
先程の画面で　**Google Apps(旧G-Suite名)を設定する** を選ばなかった場合は、レルムのトップ画面　**Google Appsの設定** からG-Suiteの設定が可能です。
![idp111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/adf21b6f-bf67-c760-c023-eae4222ef244.png)

G-Suiteで設定しているドメイン名を入力し追加、右上の**作成**を押します。
![idp7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/d3429459-d1f7-73dd-2014-4b967d310a1e.png)

一瞬でこの画面になりますので、**了解**を押します。
![idp8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/1a252b01-b318-38f4-40ed-c2911b7d28d9.png)

この画面が出ればOpenAM側にはSAML SPとしてG-Suiteが追加されました。
つづいて、この画面に表示されている情報を元にG-Suite側の設定をします。
SAML署名用の証明書ををエクスポートする代わりにダウンロードして、G-Suite側へアップロードします。
![idp9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/b3be98c7-bc71-af89-2570-9f834caffb2e.png)

OpenSSOCert.txtファイルを任意の場所へ保存します。
![idp10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/7c36284e-b44d-4cd3-cf51-e783ee0ebb47.png)

G-Suiteの管理者画面へログインします。
ブラウザの別のタブ、又は別ウィンドウで開き、コピーペーストしやすい状況で作業して下さい。
Admin画面の **セキュリティ** アイコンをクリックします。
![sp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/c31040da-acf2-7c09-7530-8b34094bfc50.png)

セキュリティ画面を下へスクロールします。
![sp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/888263f3-4e8c-c8f6-cb04-aaf18ad40ea1.png)

**サードパーティのIDプロバイダを使用したシングルサインオン（SSO)の設定**　を選びます。
![sp3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/277eaefc-12c7-3bd6-c4c9-de1e3ce17a5c.png)

**サードパーティのIDプロバイダを使用したシングルサインオン（SSO)の設定** 画面の **サードパーティのIDプロバイダでSSOを設定する** にチェックを入れます。
**ログインページURL** および **ログアウトページURL** OpenAM画面に表示されていた、**サインインページのURL** と **サインアウトページのURL** をコピーペーストします。
※ログインページURLは実質的にSAMLのエンドポイントです。ログイン画面のURLではありません。
![sp4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/1ffed03c-34b5-bfc4-5250-7c0aa34c0adc.png)

次に **ドメイン固有の発行元を利用** にチェックを入れ、**パスワード変更用URL** に 同じくOpenAM画面に表示されていた、**パスワード変更のURL**を入力し、一旦 **保存**を押した後、**証明書の更新** を選びます。※入力の途中で**証明書の更新**を選ぶと入力した欄が空欄になってしまうので、一旦保存しています。
![sp5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/fcdac6e3-f6cd-a397-8b65-c703f7acc535.png)

先程ダウンロードした**OpenSSOCert.txt**をアップロードします。
アップロードが終わりましたら、右下の**保存**を押します。
G-Suite側の設定もこれで完了です。
![sp6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/97d5eece-8be4-f146-d7f6-414c77f46e4e.png)

G-Suite側の設定が完了し、OpenAM側の画面に出ている情報も不要なので**終了**を押します。
![sp7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/3453827a-8e0b-c34b-44b5-0d87ec5362f3.png)
以上で、全ての設定は完了です。10分に収まりましたでしょうか。



# G-Suiteと接続テスト
G-SuiteのURL **[例]ｈttps://mail.google.com/a/設定したドメイン名**　に接続します。
SAMLリクエストと共にOpenAM IdPへリダイレクトされます。
FirefoxのSAML-tracerアドオンで見ると以下のようなSAMLリクエストが確認できます。
一部マスクしてしまっていますが、Issuerに入っているのがSAML SPのEntityIDです。
![samlreq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/dca3d25b-69c1-7927-d16c-62e010b66fb6.png)


OpenAMに既にログイン済みでない場合は、ログイン画面が表示されます。
既にOpenAMにログイン済みでセッションがある場合はログイン画面は表示されず次のSAMLレスポンスとなります。
![login0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/c8904550-c26e-3c00-139b-9541f4511675.png)


認証成功後は **SAMLレスポンス** と共にGoogleへ戻ります。
SAML-tracerで確認すると、以下のようなSAMLレスポンスが応答されています。
署名が含まれています。
Issuerに入っているのがSAML IdPのEntityIDです。
![samlres.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/597ff030-83cd-faa0-8eb0-3b4ab4de8c27.png)

無事Gmailの画面が表示されたらSAMLによるSSO完了です。
![login2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316098/89aa13bd-a1fb-bfc2-263b-9ad8e05d7dff.png)