null Alfresco Community EditionでSAML SSO(1) - Alfrescoを外部認証連携する

こんにちは。おおたにです。

 

今回はAlfresco Community Edition(CE)でSAML SSOを実現するための方法について紹介したいと思います。Enterprise Edition(EE)ではSAML Module for Alfresco Content Servicesというモジュールが提供されていますが、CEにはこのようなモジュールが無いため、以下の2つのステップでSAML SSOを実現しようと思います。

  1. Alfrescoに外部認証連携の設定を行い、リクエストヘッダに認証済みユーザ名が入っている場合に認証を通すようにする
  2. Alfrescoの前段にSMAL認証を行いリクエストヘッダに認証済みユーザ名をセットするリバースプロキシを建てる(Apache + mod_auth_mellon)

本記事ではまず1.について紹介します。なお、以下の内容はAlfresco Community Edition 201911GAで検証していますが、同様の方法で6.2.1-Ax等のバージョンにも適用できると思います。

 

下準備 : Alfrescoをインストールする

まずはAlfrescoをインストールします。一番お手軽な方法はDocker Composeを使ったデプロイです。「Alfresco Community Edition 201911GAをDocker Composeでデプロイする」で手順を紹介しているので参考にしてください。

 

Alfresco Content Repositoryの設定

まずはAlfrescoのコアリポジトリの設定を行います。<tomcat_dir>/shared/classes/alfresco-global.propertiesに以下の設定を追加してください。

authentication.chain=external1:external,alfrescoNtlm1:alfrescoNtlm
external.authentication.enabled=true
external.authentication.proxyUserName=
external.authentication.proxyHeader=X-Alfresco-Remote-User
external.authentication.defaultAdministratorUserNames=admin

Docker Composeでデプロイしている場合は、docker-compose.ymlservices=>alfresco=>environment=>JAVA_OPTSに以下のパラメータを追加する形でもOKです。

-Dauthentication.chain=external1:external,alfrescoNtlm1:alfrescoNtlm
-Dexternal.authentication.enabled=true
-Dexternal.authentication.proxyUserName=
-Dexternal.authentication.proxyHeader=X-Alfresco-Remote-User
-Dexternal.authentication.defaultAdministratorUserNames=admin

なお、環境によって以下のパラメータを調整してください。

  • external.authentication.proxyHeader : 認証済みユーザ名が格納されるリクエストヘッダパラメータ名
  • external.authentication.defaultAdministratorUserNames : Alfrescoの管理者権限を与えたいユーザ名をカンマ区切りで列挙

設定変更後に再起動(もしくはイメージのリビルド)をして設定完了です。

 

Alfresco Shareの設定

次にAlfresco Share(ユーザインタフェース)の設定を行います。<tomcat_dir>/shared/classes/alfresco/web-extension/share-config-custom.xmlに以下の設定変更を行います。

  • 既存の<config evaluator="string-compare" condition="Remote">をコメントアウトする
  • コメントアウトされている<config evaluator="string-compare" condition="Remote">のコメントアウトを外す(こちらの設定をベースに使います)
    • alfrescoHeaderコネクタのuserHeaderの値をproxyHeaderと同じ値に設定する(今回はX-Alfresco-Remote-User
    • alfrescoエンドポイントのconnector-idをalfrescoHeaderに変更する
    • alfresco, alfresco-feed, alfresco-apiエンドポイントのendpoint-urlのサーバ名をlocalhost:8080から実際のAlfresco Content Repositoryのサーバ名、ポート番号に変更する(Docker Composeを利用している場合はalfresco:8080に設定する)
    • alfresco, alfresco-feedエンドポイントのendpoint-urlのパスを/alfresco/wcsから/alfresco/sに変更する

なお、Docker ComposeでデプロイしたShareやContent RepositoryのTomcatディレクトリは/usr/local/tomcatになっています。参考までにDocker ComposeでデプロイしたAlfresco ShareのRemote設定のサンプルを貼っておきます。

   <config evaluator="string-compare" condition="Remote">
      <remote>
         <ssl-config>
            <keystore-path>alfresco/web-extension/alfresco-system.p12</keystore-path>
            <keystore-type>pkcs12</keystore-type>
            <keystore-password>alfresco-system</keystore-password>

            <truststore-path>alfresco/web-extension/ssl-truststore</truststore-path>
            <truststore-type>JCEKS</truststore-type>
            <truststore-password>password</truststore-password>

            <verify-hostname>true</verify-hostname>
         </ssl-config>

         <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-Alfresco-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://alfresco:8080/alfresco/s</endpoint-url>
            <identity>user</identity>
            <external-auth>true</external-auth>
         </endpoint>

         <endpoint>
            <id>alfresco-feed</id>
            <parent-id>alfresco</parent-id>
            <name>Alfresco Feed</name>
            <description>Alfresco Feed - supports basic HTTP authentication via the EndPointProxyServlet</description>
            <connector-id>alfrescoHeader</connector-id>
            <endpoint-url>http://alfresco:8080/alfresco/s</endpoint-url>
            <identity>user</identity>
            <external-auth>true</external-auth>
         </endpoint>

         <endpoint>
            <id>alfresco-api</id>
            <parent-id>alfresco</parent-id>
            <name>Alfresco Public API - user access</name>
            <description>Access to Alfresco Repository Public API that require user authentication.
                         This makes use of the authentication that is provided by parent 'alfresco' endpoint.</description>
            <connector-id>alfrescoHeader</connector-id>
            <endpoint-url>http://alfresco:8080/alfresco/api</endpoint-url>
            <identity>user</identity>
            <external-auth>true</external-auth>
         </endpoint>
      </remote>
   </config>

こちらも設定変更したら再起動して完了です。

 

動作確認してみる

では動作確認してみましょう。まだ認証を担うリバースプロキシが無いので、リクエストヘッダに必要なパラメータを追加してアクセスしてみます。リクエストヘッダはModHeader等のツールを使うと簡単に操作できます。ModHeaderであれば以下のようにリクエストヘッダパラメータX-Alfresco-Remote-Userにadminをセットします。

リクエストヘッダパラメータの設定が終わったらAlfresco Shareにアクセスします。Docker Composeでデプロイしている場合は http://localhost:8080/share にアクセスします。ログイン画面が表示されずにadminユーザ(Alfrescoデフォルトで用意されている管理者ユーザ)のダッシュボードが表示されればOKです。

 

今回の記事は以上です。リクエストヘッダに認証情報が付加されるような認証基盤が既に導入されている場合、上記設定のみでAlfrescoにSSOすることが可能です。簡単に設定できるので是非お試しください。

関連記事
install

RANKING
2020.10.12
2020.11.19
2020.12.23
2020.10.05
2020.11.25