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