Wednesday, January 28, 2015

Alfresco 5.0 で外部SSO連携を設定する(リクエストヘッダパラメータ編)

こんにちは。大谷です。

今回はAlfresco 5.0を外部SSO基盤と連携するための設定方法を紹介したいと思います。

外部SSOの仕様によって連携方法が異なりますが、今回は、認証済ユーザのリクエストヘッダに特定のパラメータを付与するパターンのSSOについてみていきます。このパターンはありがちなSSOの仕様の1つで、SSO基盤製品として標準機能で対応しているものや、エージェントと呼ばれるソフトウェアをSSO対象サーバ側にインストールして実現するもの(OpenAMもこのパターンです)などがあります。


AlfrescoでのSSO設定


では早速設定を行います。Alfrescoは2つのファイルに設定を行うだけで上記のパターンのSSOに対応できます。以下では、SSO基盤が認証済ユーザからのHTTPリクエストのリクエストヘッダに X-Test-Remote-User というパラメータでユーザ名を付与することを想定しています。

まずは毎度おなじみ alfresco-global.properties です。ここに以下の3設定を追記します。
  • authentication.chain : Alfresco認証チェーンに外部認証を追加します(external1はデフォルトで定義されている外部認証用の設定)
  • external.authentication.proxyUserName : このプロパティを空に設定することで、external.authentication.proxyHeader で指定したリクエストヘッダパラメータの値をユーザ名として利用します
  • external.authentication.proxyHeader : ユーザ名を読み出すリクエストヘッダパラメータ名を指定します(SSO基盤が認証済ユーザのリクエストヘッダに付与するパラメータ名を指定)

<tomcat_dir>/shared/classes/alfresco-global.properties
authentication.chain=external1:external,alfrescoNtlm1:alfrescoNtlm
external.authentication.proxyUserName=
external.authentication.proxyHeader=X-Test-Remote-User

続いて share-config-custom.xml の設定を行います。まずは既存の <config evaluator="string-compare" condition="Remote"> エレメントをコメントアウトし、以下の設定を追記します。インストーラでインストールした場合は、以下の設定がコメントアウトされた状態で記述されているので、以下の箇所のコメントタグを外します。

<tomcat_dir>/shared/classes/alfresco/web-extension/share-config-custom.xml
   <config evaluator="string-compare" condition="Remote">
      <remote>
         <keystore>
             <path>alfresco/web-extension/alfresco-system.p12</path>
             <type>pkcs12</type>
             <password>alfresco-system</password>
         </keystore>
         
         <connector>
            <id>alfrescoCookie</id>
            <name>Alfresco Connector</name>
            <description>Connects to an Alfresco instance using cookie-based authentication</description>
            <class>org.alfresco.web.site.servlet.SlingshotAlfrescoConnector</class>
         </connector>
         
         <connector>
            <id>alfrescoHeader</id>
            <name>Alfresco Connector</name>
            <description>Connects to an Alfresco instance using header and cookie-based authentication</description>
            <class>org.alfresco.web.site.servlet.SlingshotAlfrescoConnector</class>
            <userHeader>X-Test-Remote-User</userHeader>
         </connector>

         <endpoint>
            <id>alfresco</id>
            <name>Alfresco - user access</name>
            <description>Access to Alfresco Repository WebScripts that require user authentication</description>
            <connector-id>alfrescoHeader</connector-id>
            <endpoint-url>http://localhost:8080/alfresco/wcs</endpoint-url>
            <identity>user</identity>
            <external-auth>true</external-auth>
         </endpoint>
      </remote>
   </config>

設定のポイントは以下の2か所です。インストーラでインストールした場合は必ず以下の2か所を設定変更してください。
  • alfrescoHeaderコネクタのuserHeaderタグ : ユーザ名を読み出すリクエストヘッダパラメータ名を指定します(external.authentication.proxyHeader と同じ値を指定)
  • alfrescoエンドポイントのconnector-idタグ : alfrescoHeader を指定します(リクエストヘッダパラメータを使ったSSO認証を行うようになります)
設定は以上となります。なお、設定を反映させるためにはAlfrescoの再起動が必要です。


動作の確認


では、早速動作確認してみましょう。SSO基盤がある場合はSSO基盤の認証が通った状態でAlfrescoにアクセスしてみます。もしSSO基盤が無く、同様の状況をエミュレートする必要がある場合は、ブラウザのアドオン等を利用します。Chromeであれば、ModHeaderがお勧めです。今回の設定ではパラメータ X-Test-Remote-User からユーザ名を読み出すように設定したので、このリクエストヘッダパラメータにユーザ名(下記スナップショットではtest1)を指定しておきます。


ModHeaderのリクエストヘッダパラメータ追加画面

この状態で、http://<server name>:<port>/share にアクセスしてみましょう(ローカルPCであれば http://localhost:8080/share)。ログイン画面がスキップされ、以下のように指定したユーザのダッシュボード画面が表示されれば動作確認完了です。


Tipsとか


うまく動作しない場合は、ログを確認してみましょう。Alfresco Shareのログ出力設定に以下の行を加えると、詳細な動作状況を確認することができます。ただし、HTTPリクエストの度にログが出力されるのでログ肥大化には注意が必要です。

<tomcat_dir>/webapps/share/WEB-INF/classes/log4j.properties
log4j.logger.org.alfresco.web.site.servlet=debug

Alfresco起動時には以下のようなログが表示され、

DEBUG [org.alfresco.web.site.servlet.SSOAuthenticationFilter] [ContainerBackgroundProcessor[StandardEngine[Catalina]]] Initializing the SSOAuthenticationFilter.
DEBUG [org.alfresco.web.site.servlet.SSOAuthenticationFilter] [ContainerBackgroundProcessor[StandardEngine[Catalina]]] Endpoint is alfresco
DEBUG [org.alfresco.web.site.servlet.SSOAuthenticationFilter] [ContainerBackgroundProcessor[StandardEngine[Catalina]]] userHeader is X-Test-Remote-User
INFO [org.alfresco.web.site.servlet.SSOAuthenticationFilter] [ContainerBackgroundProcessor[StandardEngine[Catalina]]] SSOAuthenticationFilter initialised.


アクセス時には以下のようなログが表示されるようになります。

DEBUG [org.alfresco.web.site.servlet.SSOAuthenticationFilter] [http-apr-8080-exec-4] Processing request /share/page/ SID:xxxxxxxxxx
DEBUG [org.alfresco.web.site.servlet.SSOAuthenticationFilter] [http-apr-8080-exec-4] Touching the repo to ensure we still have an authenticated session.
DEBUG [org.alfresco.web.site.servlet.SSOAuthenticationFilter] [http-apr-8080-exec-4] Validating repository session for test1
DEBUG [org.alfresco.web.site.servlet.SSOAuthenticationFilter] [http-apr-8080-exec-4] Accept-Language header present: ja,en-US;q=0.8,en;q=0.6
DEBUG [org.alfresco.web.site.servlet.SSOAuthenticationFilter] [http-apr-8080-exec-4] Authentication not required, chaining ...


起動時に指定したリクエストヘッダパラメータをチェックするように設定されているか、アクセス時に適切にユーザ名を読み取っているかを確認することができます。


本記事は以上となります。比較的簡単にSSO連携設定ができることがお分かり頂けたかと思いますので、是非一度お試しください。なお、本記事はAlfresco DocumentationのExternal configuration propertiesConfiguring Alfresco Share to use an external ssoを参考にしています。


No comments: