Alfresco Community EditionでSAML SSO(2) - ApacheでSAML認証用リバースプロキシを構築する - Alfresco Community EditionでSAML SSO(2) - ApacheでSAML認証用リバースプロキシを構築する - aegif Labo Blog Alfresco
null Alfresco Community EditionでSAML SSO(2) - ApacheでSAML認証用リバースプロキシを構築する
こんにちは。大谷です。
Alfresco Community EditionでSAML SSOということで、前回の記事「Alfresco Community EditionでSAML SSO(1) - Alfrescoを外部認証連携する」に続いてSAML SSOを実装する部分を紹介したいと思います。いくつかの実装方法がありますが、今回はApache + mod_auth_mellonでSAML SP(Service Provider)のフロント部分を担うリバースプロキシを構築します。
なお、SAML SSOのテストにはIdP(ID Provider)が必要ですが、本記事ではKeycloakを検証用のIdPとして利用します。既に社内でお使いのIdPがある場合はそちらで同様の設定を行ってください。
事前準備
SAML SSOの準備として以下のセットアップを行います。
Alfrescoにテスト用ユーザを追加する
前回の記事でインストールしたAlfresco Shareにadminユーザでログインし、管理ツール->ユーザー->新しいユーザーをクリックして以下のユーザを追加します。なお、前回の記事に従ってインストールした場合、Alfresco Shareにはhttp://localhost:8080/share/
でアクセスできます。
- 名 : test1
- 姓 : user
- Eメール : test1.user@aegif.jp
- ユーザー名 : test1.user
- パスワード : 適当に入力
ApacheをAlfrescoへのリバースプロキシとしてセットアップする
SAML SP用のリバースプロキシとしてApache 2.4をインストールします。CentOS7にApache 2.4をインストールする場合はこちらの記事が参考になるかと思います。
続いて、Alfrescoにアクセスするためのリバースプロキシの設定を行います。Apacheの設定ファイル(/etc/httpd/conf/httpd.conf
もしくは/etc/httpd/conf.d/ssl.conf
あたり)を開き、ApacheをホストするポートのVirtualHost
タグの中に以下の設定を追記します。
ProxyRequests Off
ProxyPass / http://<Alfresco Shareのホスト名>:<Alfresco Shareのポート>/
ProxyPassReverse / http://<Alfresco Shareのホスト名>:<Alfresco Shareのポート>/
Apacheを再起動し、ブラウザでhttp://<Apacheのホスト名>:<Apacheのポート>/share/
にアクセスしてAlfresco Shareのログイン画面が表示されることを確認します。
例えばApacheをhttp://localhost:80
でホストするようセットアップした場合はhttp://localhost:80/share/
にアクセスして確認します。
Keycloakをセットアップする
SAML IdP用にKeycloakを用意します。こちらの記事を参考にするとDockerを使って簡単にKeycloakをセットアップできます。この記事通りセットアップすると、Keycloakがhttp://localhost:18080
でホストされます。
続いて、ブラウザでhttp://localhost:18080/auth/admin/
にアクセスして管理者ユーザでログインし、画面左上のAdd realmをクリックしてテスト用レルムalfrescotest
を作成します。
レルムを作成したら、ブラウザでhttp://localhost:18080/auth/realms/alfrescotest/protocol/saml/descriptor
にアクセスしてIdPメタデータをファイルidp_metadata.xml
に保存します。このファイルはApacheサーバにコピーしておきます。
Keycloakにテスト用ユーザを追加する
画面左上でalfrescotest
レルムを選び、Manage->Users->Add userボタンをクリックし、以下のユーザを作成します。
- Username : test1.user (Alfrescoに作成したユーザのユーザー名と一致させる)
- Email : test1.user@aegif.jp
- First Name : test1
- Last Name : user
作成したらユーザtest1.userのCredentialsタブを開き、Reset Password欄にパスワードを入力してTemporaryをOFFにセットし、Reset Passwordをクリックしてパスワードを設定します。
Apacheとmod_auth_mellonでSAML SPをセットアップする
ではSAML SSOのセットアップに進みます。まずはApache 2.4とmod_auth_mellonを使ってSAML SPをセットアップします。mod_auth_mellonはApacheでSAML認証を行うためのモジュールですが、通常のApacheインストールには含まれていないため、別途インストールする必要があります。
まず、インストールの前に以下の2つを決めておきます。
- Entity ID : SAML SPの一意のID。今回は
http://localhost:80
とします。 - SAML通信用URLパス : SAML通信用エンドポイントをホストするURLパス。今回は
/saml
とします。
続いて、mod_auth_mellonのインストールとセットアップを行います。mellon_create_metadata.sh
の引数はEntity ID、SAML通信用URLです。
yum install mod_auth_mellon
mkdir /etc/httpd/saml
cd /etc/httpd/saml
/usr/libexec/mod_auth_mellon/mellon_create_metadata.sh http://localhost:80 http://localhost:80/saml
上記コマンドを実行すると、/etc/httpd/saml/
以下にcertファイル、keyファイル、xmlファイル(SPメタデータ)が生成されます。今回の場合は/etc/httpd/saml/http_localhost_80.xml
がSPメタデータなのでこれを取得しておきます(後ほどIdPの設定に使います)。また、IdPメタデータidp_metadata.xml
を/etc/httpd/saml/
にコピーします。
最後に、Apacheの設定ファイルを開き、ApacheをホストするポートのVirtualHost
タグの中に以下の設定を追記します。
<Location />
MellonEndpointPath "/saml"
MellonIdPMetadataFile "/etc/httpd/saml/idp_metadata.xml"
MellonSPPrivateKeyFile "/etc/httpd/saml/http_localhost_80.key"
MellonSPCertFile "/etc/httpd/saml/http_localhost_80.cert"
MellonSPMetadataFile "/etc/httpd/saml/http_localhost_80.xml"
AuthType "Mellon"
Require valid-user
MellonEnable "auth"
</Location>
RequestHeader set X-Alfresco-Remote-User %{MELLON_username}e env=MELLON_username
これらの設定は、SAML通信用エンドポイントの有効化とルートパス以下へのSAML認証の有効化、SAML認証成功時にApache環境変数MELLON_*
にセットされるSAMLユーザ属性をリクエストヘッダに付与する設定です。ここでは、SAMLユーザ属性username
をリクエストヘッダパラメータX-Alfresco-Remote-User
にセットするよう指定しています。
SAML認証に成功すると指定されたリクエストヘッダパラメータにユーザ名がセットされ、Alfrescoがそれを確認して認証OKと判定する、という流れでSSOが処理されるようになります。
以下、注意点です。
- key,cert,xmlファイルのファイル名は適宜生成されたファイル名に書き換えてください
X-Alfresco-Remote-User
はAlfrescoで設定したリクエストヘッダパラメータ名と一致するようにしますMELLON_username
はApache環境変数ですが、この後のKeycloak設定の属性マッピングで指定した名前とMELLON_
以降が一致するようにします- 念のためmod_headersが有効になっているか確認してください(リクエストヘッダパラメータ付与に利用しています)
設定が終わったらApacheを再起動します。
KeycloakのSAML設定を行う
続いて、SAML IdPの設定を行います。今回は検証目的なのでKeycloakで最低限の設定を行います。
まず、管理者ユーザでKeycloakにログインしてalfrescotest
レルムを選択し、Configure->Clients->Createをクリックし、ImportのSelect fileから取得しておいたSPメタデータファイルをインポートしてSaveします。これでSAML SPが登録されました。
続いて、登録されたSAML SPのMappersタブを開き、Createボタンをクリックします。ここで、以下のとおり属性マッピングを作成します。この設定により、SAML認証成功時にKeycloak上のユーザ属性情報が指定されたマッピングでSAML SPに送付されるようになります。
- Name : username
- Mapper Type : User Property
- Property : username
- SAML Attribute : username (Apache環境変数の
MELLON_
以降と一致するように設定する) - SAML Attribute NameFormat : Basic
以上で最低限の設定は完了です。
動作確認してみよう
では、早速動作確認しましょう。確認のポイントは以下のとおりです。
- ブラウザで
http://<Apacheのホスト名>:<Apacheのポート>/share/
にアクセスすると、Keycloakのログイン画面が表示される(上記の例ではhttp://localhost:80/share/
) - Keycloakのログイン画面でユーザ名test1.userとパスワードを入力し、認証に成功するとAlfresco Shareの画面に遷移し、test1.userのダッシュボードが表示される
今回の内容は以上になります。リバースプロキシ用ApacheやSAML IdP用Keycloakなど、必要なソフトウェアの準備が多く大変なように感じられるかもしれませんが、設定自体はそこまで複雑ではないことがお分かりいただけたかと思います。
実際にSP/IdPをセットアップする場合は署名や暗号化、属性マッピングなどの設定を要件に沿って詳細に行う必要がありますが、検証目的ではこれで十分だと思います。皆様も是非SAML SSOにトライしてみてください。