【IT備忘録】 Apache2 への mod_auth_mellon 導入 (その壱) | 仕事の覚書き

仕事の覚書き

メモメモ

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この辺がミソらしい…苦笑