はじめに
本記事は、OpenAM/OpenIGを使用したシングルサインオン環境の構築という記事から続く関連記事の一部です
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にインポート という流れになる。
実作業
- 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のパスワード
2.前項のNew Connectionの隣のOpen Connection
を実行。正常にLDAP接続できれば、ツリー状の構造が表示されるはず。
3.ツリーを下ると、peopleというouの中にuid=demo
が見つかる。これがデフォルトのユーザアカウントdemoの実体。これを右クリ => Export => LDIF Export を実行。LDIF Exportのウィアードが立ち上がるので何も弄らず Next => LDIF File にファイル保存パスを入力し、Finish
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でインポートする段階ではハッシュ化されていなくても問題ない。
@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処理を進めてくれるので失敗しないよう祈りながら待つ。
7.完了したらpeople ouを見てみる。大量のアカウントが出来上がっていれば成功。あとはOpenAMでログインを試してみて無事にログインできたら完全に終わり。
小ネタ
- 大量のオブジェクトが存在する場合、デフォルトのLDAP Searchの検索上限に引っかかって全てが表示されない。その場合は、ConnectionのBrowser Options => Count Limitの値を大きくしよう。今回はユーザアカウントを5000個作ったので、余裕をとってCount Limitを6000にしている。
- インポートするときに何かエラーでたらApache Directory Studioの下部に表示されているログを見てみて、Result OKになっていたら、結局のところインポートとしては成功しているので気にしなくて良い。(もちろんエラー内容読んだ上で対処しないといけない内容であればそうするべきだが)