2016.06.01
OpenAMの環境をAnsibleで構築するためのノウハウ
はじめに
こんにちは。次世代システム研究室のT.Tです。
ここのところ開発に携わっていたサービスでID管理とSSOを刷新することになりました。実現方式をいくつか検討した結果OpenAMを基盤にする案が採用されて、その刷新を遂行するプロジェクトでOpenAMの環境を構築する部分を担当することになりました。
プロジェクトでは、OpenAMの初期検証のための環境や本サービスを想定した開発環境、ステージング環境、本番環境といったようにいくつかの環境を揃えて、さらに冗長構成にした形で提供します。そのため環境の構築に加えOpenAMのコンフィグレーションまでを自動化して、省力化と環境管理の簡略化を図るためにAnsibleの導入を検討してみました。
手始めにOpenAMのスタートアップガイドの環境をAnsibleで構築してみたので、今回はその際に得られたノウハウについて共有したいと思います。
利用しているOpenAMのバージョンは13.0.0、Ansibleのバージョンは2.0.2.0です。
OpenAMとは
OpenAMはID管理や認証、認可、SSOを実現する際に使われるオープンソース(※)のプロダクトで、Tomcat等のWebアプリケーションサーバーにデプロイしてコンフィグレーションするだけで、それらの機能を実現できます。
OpenAMでは用途に応じてシステム構成が異なり、例えばSSOを実現するための最小構成一つ取っても、そこで採用する方式やプロトコルによっていくつかのパターンがあります。その方式としては、エージェント方式やフェデレーション方式等があり、フェデレーション方式のプロトコルにはSAMLやOpenID Connect等があり、それぞれ異なる構成になります。
※ メジャーバージョンは無償でソースコードとディストリビューションファイルを取得できますが、メンテナンスバージョンは有償なので注意が必要です。
OpenAM構成図
今回はスタートアップガイドで説明されている認可機能を実現するための構成をAnsibleで構築しました。そのplaybookの中で、OpenAMのセットアップとコンフィグレーションの部分について共有したいと思います。
構成は次の図のようになります。

playbookフロー
OpenAMをlocal_openamという名前のサーバーに、認可機能を必要とするWebサービスのApacheをlocal_webという名前のサーバーにprovision.ymでインストールして、site.ymlでそれぞれコンフィグレーションします。
OpenAM
- Javaインストール
- Tomcatインストール
- OpenAM初期設定
- OpenAMコンフィグレーション
Webサービス
- Apacheインストール
- Apacheのエージェントインストール
provision.ymlとsite.ymlは以下のようなものです。
provision.yml
# local OpenAM
- hosts:
- local_openam
remote_user: vagrant
roles:
- pcextreme.repo-epel
- pcextreme.repo-remi
- williamyeh.oracle-java
- app.tomcat
# local web
- hosts:
- local_web
remote_user: vagrant
roles:
- geerlingguy.apache
site.yml
# local OpenAM server
- hosts:
- local_openam
remote_user: vagrant
roles:
- app.openam-setup
- app.openam-configuration
# local web
- hosts:
- local_web
remote_user: vagrant
roles:
- app.apache-agent
playbook実装
先述したフローの中でOpenAM特有の部分にあたる、OpenAM初期設定とOpenAMコンフィグレーション、Apacheのエージェントインストールについて詳細に触れてみたいと思います。
OpenAM初期設定
Tomcatにopenam.warをデプロイしてTomcatを起動すると、OpenAMを初期設定できる状態になります。Ansibleから初期設定する場合は、configuratorというツールを実行します。そのため、SSOConfiguratorTools-13.0.0.zipを予めダウンロードしておき、コマンドラインツールを配置するディレクトリに解凍します。config.propertiesにコンフィグレーションの詳細を記述して、openam-configurator-tool-13.0.0.jarの引数にそのファイルを指定してコンフィグレーションします。
configuratorはOpenAMの環境設定等の初期設定のみを扱うツールで、機能的なコンフィグレーションにはssoadmというツールを使います。ここで合わせてssoadmもインストールおきます。SSOAdminTools-13.0.0.zipも同じようにダウンロードしておき、コマンドラインツールを配置するディレクトリに解凍してsetupを実行すれば利用できるようになります。
app.openam-setup/tasks/main.yml
---
# OpenAM
- name: check OpenAM installed
stat:
path=/var/www/gmo/tomcat/webapps/openam.war
register: f
- name: copy OpenAM war
copy:
src=download/OpenAM-13.0.0.war
dest=/var/www/gmo/tomcat/webapps/openam.war
- name: restart tomcat
service:
name=tomcat
state=restarted
become: yes
become_user: root
# configurator
- name: check configurator installed
stat:
path=/opt/openam-tools/config
register: f
- name: create configurator install directory
file:
path=/opt/openam-tools/config
state=directory
mode=777
when: f.stat.exists == False
- name: unarchive configurator
unarchive:
src=download/SSOConfiguratorTools-13.0.0.zip
dest=/opt/openam-tools/config
when: f.stat.exists == False
- name: copy config.properties
template:
src=config.properties.j2
dest=/opt/openam-tools/config/config.properties
mode=644
- name: default configuration
command:
java -jar openam-configurator-tool-13.0.0.jar --file config.properties
chdir=/opt/openam-tools/config
# ssoadm
- name: check ssoadm installed
stat: path=/opt/openam-tools/admin
register: f
- name: create ssoadm install directory
file:
path=/opt/openam-tools/admin
state=directory
mode=777
when: f.stat.exists == False
- name: unarchive ssoadmin
unarchive:
src=download/SSOAdminTools-13.0.0.zip
dest=/opt/openam-tools/admin
when: f.stat.exists == False
- name: create openam config directory
file:
path=/etc/openam state=directory
mode=777
- name: setup ssoadmin
command: ./setup \
--acceptLicense \
--path /etc/openam \
--log /opt/openam-tools/admin/log
chdir=/opt/openam-tools/admin
environment:
JAVA_HOME: "/usr/java/jdk1.8.0_77"
app.openam-setup/templates/config.properties.j2
SERVER_URL=http://openam.example.com:8080
DEPLOYMENT_URI=/openam
BASE_DIR=/etc/openam
locale=ja_JP
PLATFORM_LOCALE=ja_JP
AM_ENC_KEY=key
ADMIN_PWD={{ openam_admin_pwd }}
AMLDAPUSERPASSWD={{ openam_amldapuserpasswd }}
COOKIE_DOMAIN=.example.com
ACCEPT_LICENSES=true
DATA_STORE=embedded
DIRECTORY_SSL=SIMPLE
DIRECTORY_SERVER=openam.example.com
DIRECTORY_PORT=50389
DIRECTORY_ADMIN_PORT=4444
DIRECTORY_JMX_PORT=1689
ROOT_SUFFIX=dc=openam,dc=forgerock,dc=org
DS_DIRMGRDN=cn=Directory Manager
DS_DIRMGRPASSWD={{ openam_ds_dirmgrpasswd }}
OpenAMコンフィグレーション
ssoadmでOpenAMを機能的にコンフィグレーションしますが、実行の都度管理者ユーザーのIDと生のパスワードを格納したファイルが必要になるので、パスワードファイルを/tmp/pwd.txtに作成しておきます。
Webサービス内のリソースに適用するアクセス方式やレベル等のポリシーをコンフィグレーションします。これはssoadmのcreate-policiesにポリシーを設定したxmlファイルを指定して実行できますが、実際に実行するとエラーが発生して動かないため手動により代替する必要があります。尚、xmlファイルはUIで一度設定してそれをエクスポートしたものを利用しています。
OpenAM側のエージェントは、ssoadmのcreate-agentで作成できます。詳細なコンフィグレーションをpropertiesファイルに記述して、適用するレルムとエージェントの名前と種別を指定して実行すれば作成できます。
app.openam-configuration/tasks/main.yml
---
- name: copy openam password file
template:
src=pwd.txt.j2
dest=/tmp/pwd.txt
mode=400
- name: create custom configuration directory
file:
path=/etc/openam/config/{{ item }}
state=directory
mode=755
with_items:
- xml/custom
- properties/custom
- name: copy realm-policies.xml
template:
src=realm-policies.xml.j2
dest=/etc/openam/config/xml/custom/realm-policies.xml
mode=644
#- name: create policy
# command: ./ssoadm create-policies \
# --realm / \
# --xmlfile /etc/openam/config/xml/custom/realm-policies.xml \
# --adminid amadmin \
# --password-file /tmp/pwd.txt \
# chdir=/opt/openam-tools/admin/openam/bin
# create agent
- name: copy webAgent.properties
template:
src=webAgent.properties.j2
dest=/etc/openam/config/properties/custom/webAgent.properties
- name: create agent
command: ./ssoadm create-agent \
--realm / \
--agentname webAgent \
--agenttype WebAgent
--adminid amadmin \
--password-file /tmp/pwd.txt \
--datafile /etc/openam/config/properties/custom/webAgent.properties
chdir=/opt/openam-tools/admin/openam/bin
app.openam-configuration/templates/webAgent.properties.j2
com.sun.identity.agents.config.agenturi.prefix=http://www.example.com:80/amagent
com.sun.identity.agents.config.cdsso.cdcservlet.url[0]=https://openam.example.com:8443/openam/cdcservlet
com.sun.identity.agents.config.fqdn.default=www.example.com
com.sun.identity.agents.config.login.url[0]=http://openam.example.com:8443/openam/UI/Login
com.sun.identity.agents.config.logout.url[0]=http://openam.example.com:8443/openam/UI/Logout
com.sun.identity.agents.config.remote.logfile=amAgent_www_example_com_80.log
com.sun.identity.agents.config.repository.location=centralized
com.sun.identity.client.notification.url=http://www.example.com:80/UpdateAgentCacheServlet?shortcircuit=false
sunIdentityServerDeviceKeyValue[0]=agentRootURL=http://www.example.com:80/
sunIdentityServerDeviceStatus=Active
userpassword={{ openam_admin_pwd }}
Apacheのエージェントインストール
ApacheのエージェントはWebサービスと同じサーバーにインストールします。エージェントの管理ツールでもOpenAMの管理者のIDとパスワードファイルが必要になるので、パスワードファイルを/tmp/pwd.txtに作成しておきます。
Apache_v22_Linux_64bit_4.0.0.zipを予めダウンロードしておき、エジェントの管理ツールを配置するディレクトリに解凍します。agentadminでOpenAMの情報を指定して、初期設定後にApacheを起動するとエージェントが有効になります。実際にagentadminを実行するとacceptLicenseオプションが効かずインタラクティブモードになりAnsibleの実行が中断されてしまうので、別途手動で実行する必要があります。
app.apache-agent/tasks/main.yml
---
- name: copy openam password file
template:
src=pwd.txt.j2
dest=/tmp/pwd.txt
mode=400
- name: stop apache
service:
name: httpd
state: stopped
- name: unarchive apache agent
unarchive:
src=download/Apache_v22_Linux_64bit_4.0.0.zip
dest=/opt
copy=no
- name: change owner and group of web agents
file:
path=/opt/web_agents
owner=apache
group=apache
#- name: install apache agent
# command: ./agentadmin \
# --s /etc/httpd/conf/httpd.conf http://openam.example.com:8080/openam http://www.openam.com:8000 webAgent / /tmp/pwd.txt \
# --acceptLicense \
# --changeOwner
# chdir=/opt/web_agents/apache22_agent/bin
- name: restart apache
service:
name: httpd
state: restarted
まとめ
ポリシー設定とApacheのエージェントのインストールが自動化できず、スタートアップガイドの内容を完全に自動化することは出来ませんでしたが、概ね自動化することは出来ており、環境構築の際の一助になるものとしてAnsibleの導入を進められそうです。
本稿で取り上げたコマンドはほんの一部で、今後実用に向けて様々なコンフィグレーションを追加する場合は、OpenAM Referenceを参考にすると良さそうです。コマンドラインツールは結構充実しているようですが、UI上でしか設定できない箇所もあるようなので、その辺にも注意しながら導入を進める必要がありそうです。
また、ForgeRock社が提供している環境構築用のplaybookもあります。こちらを使って環境構築をすることも検討しましたが、OpenAMに触れ始めた段階では判断が難しかったので、自前で簡単なものを作って理解を深めようという背景もありました。今後より作り込んでいく際はこちらのplaybookも参考になりそうです。
余談になりますが、自動化できなかった部分が不具合で動作していないのかを調べたところ、ポリシー設定については、OPENAM-7714 Policy Editor: Import fails to import any dataの影響で動いておらず、エージェントのインストールについては、OPENAM-7705 –acceptLicence although specified in –help is not acceptedの影響で動いていないようでした(今回試したagentadminのバージョンは4.0.0でしたが、最新の4.0.1では修正されているようです)。
参考リンク
- Getting Started With OpenAM
- OpenAM Reference
- frstack
- セキュリティトークンとOAuth 2.0
- オープンソース活用のメリット OpenAMによるシングルサインオン 第1回
次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。
皆さんのご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD

