(SAML第3回) mod_auth_mellonを使った簡易SPの作成

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面 和毅です。

SAML環境のテストのために、SimpleSAMLphpを使って簡易IdP / SPをセットアップしました。SAML環境に関しては引き続き連載致します。今回は「SimpleSAMLphpを用いたIdPにApache+mod_auth_mellonを繋げてみる」を纏めます。




環境

  • IdP(連載第一回・第二回で作成・使用したもの)
    • OS: CentOS 7.9(最新にyumで更新)
    • Apache: 2.4.6-97(最新のものをyumから取得)
    • PHP: 7.3.27(remiから取得)
    • SimpleSAMLphp: 1.19.0(最新)
    • IdP ホスト名:idp.example.net
  • SP(新たに作成)
    • OS: CentOS 7.9(最新にyumで更新)
    • Apache: 2.4.6-97(最新のものをyumから取得)
    • PHP: 7.3.27(remiから取得)
    • SP ホスト名:mellon.example.net
  • 前提
    • mellon.example.net/saml_test
    • mellon.example.net/cgi-bin

    のいずれかにアクセスする際にSAMLで連携してIdPの認証を使用する。

1. SP用のWebサーバ(Apache)の作成

CentOS 7を使ってWebサーバ+PHP(PHP 7.3以上)が動く状況を作成します。以下、第一回第二回で行ったのと同じ手順でCentOS 7でApache+PHP(7.3)が動く状態を作成します。

2.mod_auth_mellonのインストール

Yumを使用してmod_auth_mellonをインストールします。以下、rootで作業します。

  1. mod_auth_mellonのインストールにより/etc/httpd/conf.d/auth_mellon.confファイルが生成されます。
  2. /etc/httpd/samlディレクトリを作成し、/etc/httpd/samlディレクトリに移動します。
  3. 幾つかのURLを決定します。
    1. Entityidを決定します。通常はSPのURLで、SPのメタデータを取得できるSPのURLになります。以下の例では"https://mellon.example.net/sp"を使用します。
    2. endpointを決定します。以下の例では"https://mellon.example.net/mellon"を使用します。
  4. /etc/httpd/samlディレクトリ内でmellon_create_metadata.shツールを使用します。"mellon_create_metadata.sh Entityid endpoint"の形式で実行します。

    (Assertion Consumer Service : SAML SP endpointのURLです。ここでは使いませんが、第四回で説明する「GoogleをIdPとして使用する」で使います)。

    下記の例では、Entityid: https://mellon.example.net/sp, Endpoint(ACS): https://mellon.example.net/mellonとなります(GoogleのときはACSとしてのパスの最後にpostResponseをつける必要があることに注意しましょう)。

    
    [root@mellon saml]#/usr/libexec/mod_auth_mellon/mellon_create_metadata.sh https://mellon.example.net/sp https://mellon.example.net/mellon
    
  5. 上述のコマンド実行により、/etc/httpd/samlディレクトリに以下の3つのファイルが出来ています。
    
    [root@mellon conf.d]# ls /etc/httpd/saml/
    https_mellon.example.net_sp.cert  https_mellon.example.net_sp.key  https_mellon.example.net_sp.xml
    [root@mellon conf.d]#
    
  6. idpからXML形式のメタデータを取得し、上述の/etc/httpd/saml/ディレクトリに「idp-metadata.xml」ファイルとして作成します。
  7. spのメタデータ(/etc/httpd/saml/https_mellon.example.net_sp.xml)の内容をIdPに登録します。メタデータの形式に注意しましょう(SimpleSAMLphpのIdPに登録する場合には、一度IdPのWebUIを利用してXML->メタデータにパースしたデータを登録する)。

  8. /etc/httpd/conf.d/auth_mellon.confを編集します。今回は
    • /var/www/html/saml_test
    • /var/www/cgi-bin
    の2つのディレクトリでIdPでの認証が必要なように設定します(どちらかでログインしていれば、SSOによりもう片方では認証は聞かれない)。
    
    MellonCacheSize 100
    MellonLockFile "/run/mod_auth_mellon/lock"
    
    <Location />
      MellonEndpointPath "/mellon"
      MellonIdPMetadataFile /etc/httpd/saml/idp-metadata.xml
      MellonSPPrivateKeyFile /etc/httpd/saml/https_mellon.example.net_sp.key
      MellonSPCertFile /etc/httpd/saml/https_mellon.example.net_sp.cert
      MellonSPMetadataFile /etc/httpd/saml/https_mellon.example.net_sp.xml
    </Location>
    
    <Location /saml_test>
      AuthType "Mellon"
      Require valid-user
      MellonEnable "auth"
    </Location>
    
    <Location /cgi-bin>
      AuthType "Mellon"
      Require valid-user
      MellonEnable "auth"
    </Location>
    
    

3. Apacheの再起動

Apacheを再起動します。


[root@mellon ~]# systemctl restart httpd

4. SPのテスト

  • /var/www/cgi-binに"printenv.cgi"を作成します。
    
    #!/usr/bin/perl
    
    print "Content-type: text/plain\n\n";
    foreach $var (sort(keys(%ENV))) {
    $val = $ENV{$var};
    $val =~ s|\n|\\n|g;
    $val =~ s|"|\\"|g;
    print "${var}=\"${val}\"\n";
    }
    
  • https://mellon.example.net/cgi-bin/printenv.cgiにアクセスすると、IdPでの認証が呼び出されます。

  • ログインに成功すると、CGIによりApacheの環境変数が表示されます。mod_auth_mellonによりIdPからの返答に含まれる属性は"MELLON_"が接頭語として付く変数に含まれていることがわかります。

5. SPからログアウトする際に"400エラー"が出る場合

  • IdP側のメタデータを修正します。SimpleSAMLphpの場合には/var/www/simplesaml/metadata/saml20-idp-hosted.phpに下記を加えます。
    
        'privatekey' => 'idp.example.net.pem',
        'certificate' => 'idp.example.net.crt',
    
        // For supporting logout by using mod_auth_mellon
        'validate.logout' => TRUE,
        'redirect.sign' => TRUE,
    
  • SP側からlogoutをReturnToを付加して呼び出して確認します。例えば、下記のように呼び出します。
    
    https://hoge.sample.com/mellon/logout?ReturnTo=https%3A%2F%2Fhoge.sample.com
    

まとめ

mod_auth_mellonを用いると、Apacheと組み合わせてSPを簡単に作成してテストすることが可能です。


次回は

次回は、今回作成したmod_auth_mellonを、GoogleのIdPと接続してテストを行います。


セキュリティ系連載案内

CM

こちらで小学生の勉強支援サイトをオープンしました。算数のプリント(都度、自動生成)が無料でダウンロードできます。コンテンツは未だ少ないですが、徐々に増やしていきます。


OSSに関するお困りごとは サイオス OSSよろず相談室まで

サイオスOSSよろず相談室 では、OSSを利用する中で発生する問題に対し、長年培ってきた技術力・サポート力をもって企業のOSS活用を強力に支援します。Red Hat Enterprise Linux のほか、CentOS をご利用されている環境でのサポートも提供いたします。

前へ

Kubernetes(kube-apiserver) の脆弱性情報(Meduim: CVE-2021-25735)

次へ

Linux Kernelの脆弱性(Moderate: CVE-2021-23133)