0. 経過
simpleSAML で簡単な動作を見た後、本格的な設定に入る。MySQL を使った SQL 認証がきちんと動作することが確認できたので、MySQL ベースの SAML 認証(SSO)で http (Apache) にログイン出来るようになるのが次の目標。
1. Apache に mod_auth_mellon を適用する
実は、Apache で SAML2.0 による SSO を実現する手段としては、mod_auth_saml と mod_auth_mellon という二つの選択肢がある。mod_auth_saml の方は、インストレーションは実に簡単なものの、そこから先の設定に関するドキュメントが少ない。もう一方の mod_auth_mellon の方は、インストレーションは依存性があってちょっと難儀するが、まあ、ちらほら、情報が転がっている。
実は、simpleSAMLphp の製作者が絡んでいる Feide RnD や UNINETT と mod_auth_mellon の距離が近かったため 「もしかしたら、系統も近い?」 と期待した面が多い(苦笑)
最終的にどうなるかは、今の時点では何とも言えないが、とりあえず mod_auth_mellon の方で進める予定である。
1.1 mod_auth_mellon のインストレーション
一番難儀したのが、このインストレーション。結局ソースコンパイルもせず一応全部 rpm で賄うことが出来たのだが、5種類くらい導入したように思う。まず最初に見つけ出したのが、mod_auth_mellon の rpm。若干バージョンが古いが致し方ない。本家に自分の作った CentOS6 用の rpm 提供を申し出たりしていて、なかなか。こんな真摯な人間が 「動いている」 と言うんだから信用しないわけにはいかないw 今回使用したものは以下のとおり:
mod_auth_mellon-0.5.0-1.el6.x86_64.rpm
lasso-2.3.6-1.el6.x86_64.rpm
xmlsec1-1.2.16-2.2.x86_64.rpm xmlsec1-1.2.19-3.el6.x86_64.rpm
xmlsec1-openssl-1.2.16-2.2.x86_64.rpm xmlsec1-openssl-1.2.19-3.el6.x86_64.rpm
libxmlsec1-1.2.18-123.1.x86_64.rpm
libxmlsec1-openssl-devel-1.2.18-123.1.x86_64.rpm
リンクがないものは、ほとんど rpm.pbone.net pkgs.org から落としてきたもの。細かい依存関係は解からないので、rpm を一つのディレクトリにひとまとめに置いといて 「rpm -Uvh *」 としたら問題なく入った。
ちなみに欲っしている実体は mod_auth_mellon.so ただひとつ。これが、Apache の modules のディレクトリ下にあれば成功である♪
1.2 Apache の httpd.conf の設定
mod_auth_mellon の設定は、IdP と SP のメタデータ記述を除き、全て httpd.conf の中に記述する。外置きは、このメタデータと認証書関連だけと思っていい。まず、LoadModule 文でモジュールをロードする:
LoadModule auth_mellon_module modules/mod_auth_mellon.so
後は、Mellon で始まる幾つかのシステムパラメータの類以外は、ロケーション設定である。正しいかどうかは不明であるが現在の設定値は以下のとおり:
MellonCacheSize 100
MellonLockFile "/var/run/mod_auth_mellon.lock"
MellonPostTTL 900
MellonPostSize 1073741824
MellonPostCount 100
<Location /protected>
require valid-user
AuthType "Mellon"
MellonEnable "auth"
MellonDecoder "none"
MellonVariable "cookie"
MellonSecureCookie On
MellonCookiePath /
MellonUser "NAME_ID"
MellonSetEnv "e-mail" "mail"
MellonSetEnv "DISPLAY_NAME" "displayName"
MellonSessionDump Off
MellonSamlResponseDump Off
MellonRequire "eduPersonAffiliation" "student" "employee"
MellonEndpointPath "/protected/endpoint"
MellonDefaultLoginPath "/"
MellonSessionLength 86400
MellonNoCookieErrorPage "https://www.example.com/no_cookie.html"
MellonSPMetadataFile /etc/httpd/mellon/sp-metadata.xml …①
MellonIdPMetadataFile /etc/httpd/mellon/idp-metadata.xml …①
MellonSPPrivateKeyFile /etc/pki/saml/private/sp-private.key …②
MellonSPCertFile /etc/pki/saml/certs/sp-cert.pem …②
MellonIdPPublicKeyFile /etc/pki/saml/public/idp-cert.pem …②
MellonIdPCAFile /etc/pki/saml/public/idp-ca.pem …②
MellonDiscoveryURL "http://www.example.net/idp-discovery"
…
</Location>
ちなみに上記①が xml 形式のメタデータ。これは本家に倣って /etc/httpd (もしくは /etc/apache2) 下に mellon というディレクトリを切ってその下に格納。認証書(X.509証明書)の類は、/etc/pki 下に勝手に saml というディレクトリを切り、定型的な private ・ certs の他に public というディレクトリを用意して相手側サイトの公開鍵や認証局の情報などを保存した上で参照している。
1.3 メタデータ
現在、一番難航しているのが、このメタデータ記述。IdP と SP 間で必要とされるデータ交換の他、リダイレクト的な制御も関わってくるので、ここの記述の違いで、IdP と SP 間のインタラクションがどうなるのかが、まだ良く解かっていない。
ここの部分には、「サンプルでこう書きなさい…」 みたいな記述もないだけに、IdP 側の記述は simpleSAML の仕様を見て、それと xml 記述を付け合せ、適当に作ったほど。
但し、Apache は SAML2.0 上では SP(サービスプロバイダ)以外の何者でもないので、要は、まだ著者が simpleSAML の挙動を十分理解していない…というkとに他ならない(苦笑)
ちなみに、ここでの sp-metadata.xml は、こんな感じ:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<EntityDescriptor
entityID="www.example.com"
xmlns="urn:oasis:names:tc:SAML:2.0:metadata">
<SPSSODescriptor
AuthnRequestsSigned="false"
WantAssertionsSigned="false"
protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
<SingleLogoutService
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
Location="https://www.example.com/protected/endpoint/logout" />
<NameIDFormat>
urn:oasis:names:tc:SAML:2.0:nameid-format:transient
</NameIDFormat>
<AssertionConsumerService
index="0"
isDefault="true"
Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
Location="https://www.example.com/protected/endpoint/postResponse" />
</SPSSODescriptor>
</EntityDescriptor>
どうも、lこの辺がミソらしい…苦笑