OpenAM データストアの追加(AD連携)

# はじめに
#### 本記事は、[OpenAM/OpenIGを使用したシングルサインオン環境の構築](http://qiita.com/gzock/items/af6f820b5e872366e853)という記事から続く関連記事の一部です

OpenAMでは、組込ユーザデータストアというものが用意されており、新しいユーザアカウントを作成したりすると、実体としてこのデータストアに情報が書き込まれる。
検証段階ではこの組込ユーザデータストアで問題ないのだが、実際のユーザ環境だと認証先としてActiveDirectoryやOpenLDAPを使用したいことが多々あると思う。もちろん検証段階でもそういった要望は少なくないはず。
というわけで、本記事ではOpenAMとActiveDirectoryの連携を目指す。
ADに限って説明をするが、別のデータストアでもやり方は変わらないので、方法は流用可能なはず。
ちなみにAD連携をやっておくと、デスクトップSSOという便利機能が割と簡単に実現できちゃいます。(きっとそのうち記事にする)

# 前提
* OpenAMがインストールされているサーバはCentOS7.3を想定
* OpenAMは無料で手に入るv13.0を使用

# 環境
* OpenAM
  * サーバOS: CentOS7.3
  * ホスト名: sso.test.local
  * IPアドレス: 172.16.1.130
  * JDK Ver: 1.8.0_111
  * Tomcat Ver: 8.0.39
  * OpenAM Ver: 13.0.0

* Active Directory
  * サーバOS: Windows Server 2012 R2
  * ドメイン機能レベル/フォレスト機能レベル: 2012R2

# 目標
OpenAMのユーザデータストアとしてActiveDirectoryを追加する

# 実作業
1. WebブラウザからOpenAMの管理画面を開き、Top Level Realm => Data Stores => 新規 を実行し、名前には任意のデータストア名を指定し、タイプとして`Active Directory`を選択。次へ。

2. 色々と設定する項目があるが、最低限以下を変更すればOKなはず。参考程度に画像も載せておく。DNなどは隠しているが、どんな感じか雰囲気はわかるはず。全部設定し終わったらページ右上の`終了`をクリック。

* LDAPサーバー: ADのIPアドレスあるいはホスト名とポート番号(389)
* LDAPバインドDN: LDAP SearchをかけるユーザのDN (ADであれば検索だけなら一般ユーザ権限でOK)
* LDAPバインドパスワード: 上記バインドユーザのパスワード
* LDAP組織DN: ベースDNのことだと思う。指定したDNをベースに検索をかける。パスのルートだと思えば良い。
* LDAP Connection Mode: 基本的にはLDAPで良いが、OpenLDAPとかをLDAPSで構築している場合は適宜変更する必要がある。
* LDAPユーザー検索属性: sAMAccountName
* 認証ネーミング属性: sAMAccountName
* グループメンバーシップの属性名: memberOf
* 持続検索ベースDN: LDAP組織DNに同じ

![1.png](https://qiita-image-store.s3.amazonaws.com/0/80163/4d433025-a2c6-8bd8-39e8-0325972bead3.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/80163/1435f89b-b876-1ac4-3b00-d2764589eb9c.png)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/80163/c00fc243-97ce-909a-22b0-40012d862ea7.png)
![4.png](https://qiita-image-store.s3.amazonaws.com/0/80163/61f4ee90-88c8-b6a6-bee6-23ca902b9b8b.png)
![5.png](https://qiita-image-store.s3.amazonaws.com/0/80163/4f8493f3-829f-fe9f-e524-8d038069453c.png)
![6.png](https://qiita-image-store.s3.amazonaws.com/0/80163/0d8695b5-ac44-6831-7b79-fcd5d1472a29.png)


# 動作確認
WebブラウザからOpenAMの管理画面を開き、Top Level Realm => Subjects を実行。この画面ではユーザデータストア内のユーザーアカウントが全て表示される。
そのため、この画面でAD上のユーザアカウントが表示されていれば動作としてはOK。あとはADのユーザアカウントを使って、OpenAMにログインできるかを確認する。

# 小ネタ
### AD上にはユーザアカウントが1000個あるはずなのに、Subjectsでは100個しか表示されない！
デフォルトではLDAP Searchの結果に数に上限が設けられている。
Top Level Realm => Configuration => コンソール => 管理 => 検索で返される結果の最大数 の値を変更すればSubjectsにきちんと表示されるはず。
ただし、注意書きで書いてある通り、あまりにも大きな数を指定していると問題ありそうなのでほどほどに。
あくまでSubjectsの結果に表示されないだけで、ログイン自体は正常に出来るので、正直あまり気にしなくて良い。

# オプション
## ADの属性をOpenIG側で参照するには？
OpenAMとOpenIGを連携させる場合、普通に構築するとOpenIG側には認証ユーザーのユーザー名とパスワードだけが渡ってくる。
このとき、AD上の様々な属性もOpenIG側で参照したい！というときにどうするか。
以下の操作が必要になる。

1. 本記事上でも述べているデータストアの設定画面上に存在する`LDAPユーザー属性`で、必要とする属性を追加する。
  * 一般的によく使う属性は最初から存在するので一度リストを見てみて、存在しないようなら追加しよう
2. エージェントの設定を開き、アプリケーション => `プロファイル属性フェッチモード`を`なし`以外のどれかに変更
  * 恐らくは`HTTP_COOKIE`か`HTTP_HEADER`のどちらかを使うと思う
3. プロファイル属性マッピングのマップキーにAD属性名を入力、対応するマップ値として任意の名前を入力
  * 例えば、memberOf=memberで、フェッチモードでHTTP_HEADERを選んだ場合、ADのmemberOf属性がHTTPヘッダーにmemberという形で追加される
  * 属性が複数ある場合、それこそmemberOfも同名の属性で複数あったりするが、その場合でもHTTPヘッダー内で同名で全て付与される
  * OpenIGのルートファイルでは、request.cookies['member'][0]といった形で取得できる、複数ある場合は[1]などで取得できる

![AD連携_属性設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/80163/d706533a-2dff-8eed-28c2-1b5b8d552143.png)

まぁOpenIGと書いたが、このやり方はOpenIGに限った話ではない。
とにかくデータストア上の何らかの属性をHTTPに何らかの形で付与して通信したい場合には全て使える。