Home > Tags > SSO

SSO

OpenAM(旧OpenSSO)でシングルサインオンをしてみる

やりたいことは、クロスドメイン(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エージェントのマシン両方に設定しておく必要がある(どちらもそれぞれのホストを見に行く必要があるため)

環境

  • Tomcat 6.0.35(SSOサーバーマシン用)
    TOMCAT_HOME=C:\Program Files\apache-tomcat-6.0.35-server
  • Tomcat 6.0.35(SSOエージェントマシン用)
    TOMCAT_HOME=C:\Program Files\apache-tomcat-6.0.35-agent
  • Windows XP SP3
  • OpenAM(openam_954.war)
  • J2EE Policy Agent(tomcat_v6_agent_3.zip)

今回は、JavaEEサーバーにエージェントを組み込む、「エージェント型」で動かしてみる。
また、OpenSSOを組み込むTomcat(SSOサーバー用)とSSOエージェントを組み込むTomcat(SSOエージェント用)は、必ず別にする必要がある(SSOエージェントをインストールする際に、SSOサーバー用Tomcatは起動していて、SSOエージェント用Tomcatは停止している必要があるため)

手順

  1. OpenAMをインストール
  2. OpenAMにプロファイルを作成
  3. SSOエージェントをインストール
  4. SSO対象のWebアプリにフィルタを設定
  5. OpenAMにポリシーを作成
  6. 確認

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]タブ に移動する。

「エージェント」の「新規…」ボタンをクリックして、プロファイルを作成する。

  • 名前 : tomcatagent
  • パスワード : password3
  • 設定 : 集中
  • サーバーURL : http://sso.server.com:8080/openam
  • エージェントURL : http://sso.agent.com:8080/agentapp

名前、パスワード、サーバー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

  1. Enter the Tomcat Server Config Directory Path→ C:\Program Files\apache-tomcat-6.0.35-agent\conf
  2. OpenSSO server URL→ http://sso.server.com:8080/openam
  3. Enter the $CATALINA_HOME environment variable→ C:\Program Files\apache-tomcat-6.0.35-agent
  4. Install agent filter in global web.xml ?→ false
  5. Agent URL→ http://sso.agent.com:8080/agentapp
  6. Enter the Agent Profile name→ tomcatagent
  7. 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 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>

大事なところはフィルタ「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 にそれぞれアクセスできる。

Home > Tags > SSO

Search
Feeds
Meta

Return to page top