Alfresco Community EditionでSAML SSO(1) - Alfrescoを外部認証連携する - Alfresco Community EditionでSAML SSO(1) - Alfrescoを外部認証連携する - aegif Labo Blog Alfresco
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を実現しようと思います。
- Alfrescoに外部認証連携の設定を行い、リクエストヘッダに認証済みユーザ名が入っている場合に認証を通すようにする
- 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.yml
のservices=>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
に変更する
- alfrescoHeaderコネクタのuserHeaderの値をproxyHeaderと同じ値に設定する(今回は
なお、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することが可能です。簡単に設定できるので是非お試しください。