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のセットアップとコンフィグレーションの部分について共有したいと思います。
構成は次の図のようになります。
OpenAM構成図

playbookフロー

OpenAMをlocal_openamという名前のサーバーに、認可機能を必要とするWebサービスのApacheをlocal_webという名前のサーバーにprovision.ymでインストールして、site.ymlでそれぞれコンフィグレーションします。
OpenAM
  1. Javaインストール
  2. Tomcatインストール
  3. OpenAM初期設定
  4. OpenAMコンフィグレーション
Webサービス
  1. Apacheインストール
  2. 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では修正されているようです)。

参考リンク

次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。

皆さんのご応募をお待ちしています。

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事