OpenAM 組込データストアへのユーザ一括追加

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

OpenAMでは、組込ユーザデータストアというものが用意されており、新しいユーザアカウントを作成したりすると、実体としてこのデータストアに情報が書き込まれる。
デフォルトユーザとして、`dmeo`が用意されていて、このユーザアカウントを使って、別記事にてSSOの動作確認をしている。
実際に社内システムなどで本番環境として運用するとなると、別のユーザデータストア(AD)と連携させることになると思うが、検証段階では組込データストアをそのまま使い続けていることも少なくないと思う。
そんなとき、検証のためにユーザアカウントを大量に用意したい・・・という場合、そんな機能はOpenAMには用意されていなかったため、少し変則的な方法をとって対応したため、そのときの方法を本記事にまとめる。
※もっと良い方法があるかもしれない

まぁ何がやりたかったかと言うと、Jmeterを使って大量のユーザのログインを行いOpenAMの負荷試験をやりたかった。
同じユーザアカウントを使うよりも別々のものを使ったほうが、負荷試験としては正しいと思うので大量のユーザアカウントが必要になった。

# 前提
* 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

# 目標
OpenAMの組込ユーザデータストアにユーザアカウント5000個を一括追加する

# 事前に用意しておくもの
* Apache Directory Studio

# 概要
OpenAMの組込ユーザデータストアは、実際にはOpenDJというForgerockが開発しているOSSのディレクトリサーバである。
それの最小版かどうかよくわからないが、小さいOpenDJが内部的に動作している。
OpenDJは結局のところLDAPサーバなので、普通にLDAP Searchなどが使える。
つまり、何をするかというと、OpenDJにLDAPツールを使って接続し、既存ユーザアカウントのldifをエクスポート => 丸々コピーして少し内容書き換えた大量のユーザアカウントのldifを用意 => OpenDJにインポート という流れになる。

# 実作業
1. Apache Directory Studio を起動し、左上の`New Connection`を実行。以下の通り設定する。

* Network Parameter
  * Connection name: 任意
  * Hostname: OpenAMのIPアドレス/ホスト名
  * Port: 50389
  * Encryption method: No encryption
  * Provider: Apache Directory LDAP Client API
* Authentication
  * Authentication Method: Simple Authentication
  * Authentication Parameter
    * Bind DN or user: cn=Directory Manager
    * Bind password: amadminのパスワード

![2017-03-29-16-34-26.png](https://qiita-image-store.s3.amazonaws.com/0/80163/e8c9a0e8-4675-e57d-7ac1-76aa4d84fb05.png)

![2017-03-29-16-34-50.png](https://qiita-image-store.s3.amazonaws.com/0/80163/66c9d48b-79b7-9925-73cb-3392bb6d2400.png)



2.前項のNew Connectionの隣の`Open Connection`を実行。正常にLDAP接続できれば、ツリー状の構造が表示されるはず。
![2017-03-29-16-37-36.png](https://qiita-image-store.s3.amazonaws.com/0/80163/480d4572-45ac-9848-8f9a-ff5925009684.png)


3.ツリーを下ると、peopleというouの中に`uid=demo`が見つかる。これがデフォルトのユーザアカウントdemoの実体。これを右クリ => Export => LDIF Export を実行。LDIF Exportのウィアードが立ち上がるので何も弄らず Next => LDIF File にファイル保存パスを入力し、Finish

![2017-03-29-16-39-36.png](https://qiita-image-store.s3.amazonaws.com/0/80163/e537f097-1ddc-43a5-3d4a-17fbf9a3c8c5.png)

4.試しにLDIFファイルを覗いてみる。userPasswordはSSHAで保存されているので平文では見えない。とはいえchangeitなのはわかっているが。このファイルをベースに、uid/cn/sn/userPasswordだけを変更してユーザアカウントを大量に生成しそのLDFIをインポートする。これでdemoアカウントのクローンとして大量のユーザアカウントを作成できる。

```
version: 1

dn: uid=demo,ou=people,dc=openam,dc=forgerock,dc=org
objectClass: iplanet-am-auth-configuration-service
objectClass: iPlanetPreferences
objectClass: person
objectClass: top
objectClass: organizationalperson
objectClass: sunAMAuthAccountLockout
objectClass: oathDeviceProfilesContainer
objectClass: forgerock-am-dashboard-service
objectClass: sunFederationManagerDataStore
objectClass: iplanet-am-user-service
objectClass: sunIdentityServerLibertyPPService
objectClass: devicePrintProfilesContainer
objectClass: inetorgperson
objectClass: sunFMSAML2NameIdentifier
objectClass: inetuser
objectClass: iplanet-am-managed-person
objectClass: kbaInfoContainer
cn: demo
sn: demo
inetUserStatus: Active
uid: demo
userPassword:: e1NTSEF9REZlOHJvYTVHMnRMNE9yVDVjWjJOVGR5dHFBT0RkdW5McVgwbVE9PQ==
```

5.やり方は色々あると思うが、私がささっと作ったバッチは以下。これで5000個分のユーザアカウントのLDIFを生成する。とてつもなく簡単なバッチなので説明は割愛する。ユーザアカウント名 = uidとパスワードは同じにしている。LDIFでインポートする段階ではハッシュ化されていなくても問題ない。

```gen_users.bat
@echo off
for /L %%i in (1,1,5000) do (
	echo dn: uid=user%%i,ou=people,dc=openam,dc=forgerock,dc=org
	echo objectClass: iplanet-am-auth-configuration-service
	echo objectClass: iPlanetPreferences
	echo objectClass: person
	echo objectClass: top
	echo objectClass: organizationalperson
	echo objectClass: sunAMAuthAccountLockout
	echo objectClass: oathDeviceProfilesContainer
	echo objectClass: forgerock-am-dashboard-service
	echo objectClass: sunFederationManagerDataStore
	echo objectClass: iplanet-am-user-service
	echo objectClass: sunIdentityServerLibertyPPService
	echo objectClass: devicePrintProfilesContainer
	echo objectClass: inetorgperson
	echo objectClass: sunFMSAML2NameIdentifier
	echo objectClass: inetuser
	echo objectClass: iplanet-am-managed-person
	echo objectClass: kbaInfoContainer
	echo cn: user%%i
	echo sn: test
	echo givenName: test
	echo inetUserStatus: Active
	echo uid: user%%i
	echo userPassword: user%%i
	echo.
)
```

6.前項のバッチを実行し作成したLDIFファイルをインポートする。Apache Directory Stuidoを起動し、作成したOpenAMへのConnectionを接続し、右クリ => Import => LDIF Import を実行する。エクスポートのときと同じようにウィザードが立ち上がるので、LDIFファイルを指定して、importする。頑張ってimport処理を進めてくれるので失敗しないよう祈りながら待つ。

![2017-03-30-16-22-42.png](https://qiita-image-store.s3.amazonaws.com/0/80163/843ba0a5-46d9-ba77-8895-b63ad67e6ba2.png)


7.完了したらpeople ouを見てみる。大量のアカウントが出来上がっていれば成功。あとはOpenAMでログインを試してみて無事にログインできたら完全に終わり。

![2017-03-30-16-27-47.png](https://qiita-image-store.s3.amazonaws.com/0/80163/52f228bf-8b74-2b01-7e27-ace6994de26c.png)


# 小ネタ
* 大量のオブジェクトが存在する場合、デフォルトのLDAP Searchの検索上限に引っかかって全てが表示されない。その場合は、ConnectionのBrowser Options => Count Limitの値を大きくしよう。今回はユーザアカウントを5000個作ったので、余裕をとってCount Limitを6000にしている。

![2017-03-30-16-31-17.png](https://qiita-image-store.s3.amazonaws.com/0/80163/71990d69-5bdf-7f93-7d85-72fa01a9cf4a.png)

* インポートするときに何かエラーでたらApache Directory Studioの下部に表示されているログを見てみて、Result OKになっていたら、結局のところインポートとしては成功しているので気にしなくて良い。(もちろんエラー内容読んだ上で対処しないといけない内容であればそうするべきだが)