やりたいことは、クロスドメイン(CDSSO)でシングルサインオンを実現し、ユーザーを識別(認可)して、アクセスできるURLを制限したい、というもの。
SSO製品は色々あるようですが、一番とっつきやすそうなOpenAMで試す。
SSOエージェントなど、独特のSSO用語は以下のページがとてもわかり易いです。
http://dev.ariel-networks.com/column/tech/opensso/
前提
SSOサーバーとSSOエージェントは別マシン(同じマシンで実行した(もちろんポートを変えて)が上手くいかなかった為)
- SSOサーバーのホスト(10.29.56.64) : sso.server.com
- SSOエージェントのホスト(10.29.55.56) : sso.agent.com
SSOはCookieを用いて、SSO Tokenをやり取りするので、localhostなどでアクセスして設定を行なってしまうと、Cookieのドメイン属性がうまく設定できず、動かない可能性がある。
そのため、設定を行う場合は必ずFQDNでアクセスする。
試しにやる場合は、hostsファイルを編集するのが一番楽かと思います。
hosts
10.29.56.64 sso.server.com
10.29.55.56 sso.agent.com
なお、このhosts設定はSSOサーバーのマシン、SSOエージェントのマシン両方に設定しておく必要がある(どちらもそれぞれのホストを見に行く必要があるため)
環境
今回は、JavaEEサーバーにエージェントを組み込む、「エージェント型」で動かしてみる。
また、OpenSSOを組み込むTomcat(SSOサーバー用)とSSOエージェントを組み込むTomcat(SSOエージェント用)は、必ず別にする必要がある(SSOエージェントをインストールする際に、SSOサーバー用Tomcatは起動していて、SSOエージェント用Tomcatは停止している必要があるため)
手順
- OpenAMをインストール
- OpenAMにプロファイルを作成
- SSOエージェントをインストール
- SSO対象のWebアプリにフィルタを設定
- OpenAMにポリシーを作成
- 確認
1. OpenAMをインストール
SSOサーバーとして機能するOpenAMは、JavaのWebアプリとして配布されているので、配備はWARをデプロイするだけです。
以下から、WAR(openam_954.war)をダウンロードする。
http://www.forgerock.org/openam.html
WARを以下のように配置する(openam_954.war を openam.war にリネームした)
C:\Program Files\apache-tomcat-6.0.35_server\webapps\openam.war
Tomcatを起動したら、以下にアクセスする。
http://sso.server.com:8080/openam
以下の画面が出れば正常にデプロイされている。

「デフォルト設定の作成」を選択する。
パスワードは、以下。
- amAdmin : password1
- UrlAccessAgent : password2
インストールが始まる。

正常に完了したら、「ログインに進む」をクリックする。

「amAdmin」ユーザのID、パスワードを入力すればログインできる(IDは大文字・小文字を区別しないようだ)

ログイン成功!

2. OpenAMにプロファイルを作成
引き続きそのままプロファイルを作成する。
プロファイルは~~みたいなものだと思います。
[アクセス制御]タブ → [/ (最上位のレルム)] → [エージェント]タブ → [J2EE]タブ に移動する。

「エージェント」の「新規...」ボタンをクリックして、プロファイルを作成する。
名前、パスワード、サーバーURL、エージェントURLは以降でも使うので、覚えておく。

ついでに、クロスドメインの設定もしておく
先ほど作成した、[tomcatagent] → [SSO]タブ → [クロスドメインSSO] に移動し、「有効」のチェックを付け、ページ上部の「保存」ボタンを押下する。

3. SSOエージェントをインストール
(SSOエージェント用マシンで実施)
まず以下から、ZIPをダウンロードし、解凍する。
http://www.forgerock.org/openam.html
場所は以下にした(この場所をエージェントが参照しているようなので、日本語パス等は避けたほうがいいかも)
C:\work\SSO\j2ee_agents
次に、プロファイルで設定したパスワードをパスワードファイルとして保存しておく必要がある。
以下に、「pass」というファイル名でパスワードファイルを作成した(場所はどこでもいいと思う)
C:\Program Files\apache-tomcat-6.0.35-agent\agentpass\pass
そして、このファイルにパスワードを平文で記述する(ここでは「password3」)
これで、準備が整ったので以下を実行する(SSOサーバー用のTomcatを起動しておくこと)
C:\work\SSO\j2ee_agents\tomcat_v6_agent\bin\agentadmin.bat --install

- Enter the Tomcat Server Config Directory Path→ C:\Program Files\apache-tomcat-6.0.35-agent\conf
- OpenSSO server URL→ http://sso.server.com:8080/openam
- Enter the $CATALINA_HOME environment variable→ C:\Program Files\apache-tomcat-6.0.35-agent
- Install agent filter in global web.xml ?→ false
- Agent URL→ http://sso.agent.com:8080/agentapp
- Enter the Agent Profile name→ tomcatagent
- Enter the path to the password file→ C:\Program Files\apache-tomcat-6.0.35-agent\agentpass\pass
あと、忘れずに、以下のフォルダにある「agentapp.war」をエージェント用のTomcatに配備(C:\Program Files\apache-tomcat-6.0.35-agent\webapps)しておく。
C:\work\SSO\j2ee_agents\tomcat_v6_agent\etc
4. SSO対象のWebアプリにフィルタを設定
これで、SSOを行う準備が整ったので、SSO対象のWEBアプリへのリクエストがエージェントを経由するように、WEBアプリのweb.xmlにフィルタを作成する。
[xml]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>SampleWeb2</display-name>
<filter>
<filter-name>Agent</filter-name>
<filter-class>com.sun.identity.agents.filter.AmAgentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Agent</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<servlet>
<servlet-name>Sample1</servlet-name>
<servlet-class>org.sample.Sample1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Sample1</servlet-name>
<url-pattern>/Sample1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>Sample2</servlet-name>
<servlet-class>org.sample.Sample2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Sample2</servlet-name>
<url-pattern>/Sample2</url-pattern>
</servlet-mapping>
</web-app>
[/xml]
大事なところはフィルタ「Agent」です。これでこのアプリへの全てのリクエストがエージェントを経由することになる。
ちなみにサンプル用のWEBアプリは以下のような構成。
| アプリケーション |
アクセスパス |
アクセスできるユーザー |
| SampleWeb1 |
/SampleWeb1/Sample1 |
sample0, sample1 |
| /SampleWeb1/Sample2 |
sample0, sample1 |
| SampleWeb2 |
/SampleWeb2/Sample1 |
sample0, sample2 |
| /SampleWeb2/Sample2 |
sample0, sample2 |
5. OpenAMにポリシーを作成
最後に、OpenAMにどのURLをどのユーザに許可するなどのポリシーを作成する。
まずユーザーを作成しておく。
[アクセス制御]タブ → [/ (最上位のレルム)] → [対象]タブ で「新規...」ボタンを押下し、ユーザーを作成する。
今回は先ほど書いてるように「sample0, sample1, sample2」を作成した。

次にポリシーを作成する。
[アクセス制御]タブ → [/ (最上位のレルム)] → [ポリシー]タブ で「新規ポリシー...」ボタンを押下する。
一般
名前 : SampleWeb1

ルール
サービスタイプ : URL ポリシーエージェント (リソース名あり)
名前 : Sample1
リソース名 : http://sso.agent.com:8080/SampleWeb1/Sample1
アクション : GET,POST(共に許可)


同様にして「/SampleWeb1/Sample2」を許可するルールも追加しておく。
対象
タイプ : OpenAM アイデンティティー対象
名前 : identity1
sample0, sample1 を選択


SampleWeb2用の新規ポリシーも上記と同様にして作成する。

6. 確認
最後に正しく、SSOとアクセス制御が出来ているか確認する。
エージェントが組み込まれたTomcatが起動していない場合は起動する。
http://sso.agent.com:8080/SampleWeb1/Sample1 にアクセス。未ログインなので、ログイン画面が表示される。

「sample1」でログインすると、正常にアプリにアクセスできる。

http://sso.agent.com:8080/SampleWeb2/Sample1 にアクセス。権限が無いので、403エラーになる。

一旦、ログアウト(http://sso.server.com:8080/openam/UI/Logout にアクセス)して、
再度、http://sso.agent.com:8080/SampleWeb1/Sample1 にアクセス。今度は「sample0」でログインする。


「sample0」は別アプリの /SampleWeb1 と /SampleWeb2 にそれぞれアクセスできる。