(SAML第2回) SimpleSAMLphpを使った簡易SPの作成

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

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




環境

  • 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 ホスト名:samlsp.example.net

1. Webサーバ(Apache)+PHPの作成

SPの方も、CentOS 7を使ってWebサーバ+PHP(PHP 7.3以上)が動く状況を作成します。以下、特に注釈がない場合にはrootで作業します。

  1. CentOS 7上でApacheをインストールします。通常は最小限のパッケージにしたいため、関連する必要なパッケージをそれぞれyumを用いてインストールしますが、ここではSPのインストールにフォーカスしたいため、思い切って下記の様に「yum group install」で"Basic Web Server"をインストールしてあります。
    
    [root@samlsp ~]# yum -y groupinstall "Basic Web Server"
    
  2. PHP7.3をインストールします。CentOS 7上でPHP 7.x をインストールする際には、remiレポジトリを使用します。
    
    [root@samlsp ~]# yum -y install http://ftp.riken.jp/Linux/remi/enterprise/remi-release-7.rpm
    [root@samlsp ~]# yum install --disablerepo=* --enablerepo=epel,remi,remi-safe,remi-php73 php php-mbstring php-xml php-common php-cli
    
  3. /etc/php.iniで「Dynamic Extensions」に下記を加えます(下記の例では887行目です)
    
        883 ;;;;;;;;;;;;;;;;;;;;;;
        884 ; Dynamic Extensions ;
        885 ;;;;;;;;;;;;;;;;;;;;;;
        886 
        887 extention=mbstring.so        
        888 
    
  4. localeを設定します。
    
    [root@samlsp ~]# localectl set-locale LANG=ja_JP.utf8
    
  5. mod_sslをインストールし、証明書をインストールします。今回は自己証明書を作成して/etc/pki/tls/private/以下にserver.key,server.csrとして作成しました。この辺の手順は、よくある「オレオレ証明書」でのApache(https)セットアップと同じになります。
    
    [root@samlsp ~]# openssl genrsa -aes128 1024 > /etc/pki/tls/private/server.key
    [root@samlsp ~]# openssl req -new -key /etc/pki/tls/private/server.key > /etc/pki/tls/private/server.csr
    [root@samlsp ~]# openssl x509 -in /etc/pki/tls/private/server.csr -days 3650 -req -signkey /etc/pki/tls/private/server.key > /etc/pki/tls/private/server.crt
    
  6. /etc/httpd/conf.d/ssl.confを以下のようにします。
    1. 自己証明書を使用する
    2. SIMPLESAMLPHP_CONFIG_DIRを設定する
    3. Directory /var/www/simplesamlphp/wwwを設定する

    ssl.confの修正点は下記のようになります(下記はdiffの出力結果になります)。

    
    [root@samlsp conf.d]# diff -Nru ssl.conf.org ssl.conf
    --- ssl.conf.org    2021-02-20 10:01:21.313615618 +0900
    +++ ssl.conf    2021-02-20 10:01:32.733977001 +0900
    @@ -55,9 +55,14 @@
     
     <VirtualHost _default_:443>
     
    +SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/www/simplesaml/config
    +
     # General setup for the virtual host, inherited from global configuration
     #DocumentRoot "/var/www/html"
    -#ServerName www.example.com:443
    +DocumentRoot "/var/www/simplesaml/www"
    +Alias /simplesaml "/var/www/simplesaml/www"
    +
    +ServerName samlsp.example.net:443
     
     # Use separate log files for the SSL virtual host; note that LogLevel
     # is not inherited from httpd.conf.
    @@ -72,7 +77,8 @@
     #   SSL Protocol support:
     # List the enable protocol levels with which clients will be able to
     # connect.  Disable SSLv2 access by default:
    -SSLProtocol all -SSLv2 -SSLv3
    +#SSLProtocol all -SSLv2 -SSLv3
    +SSLProtocol -all +TLSv1.2
     
     #   SSL Cipher Suite:
     #   List the ciphers that the client is permitted to negotiate.
    @@ -97,14 +103,16 @@
     # the certificate is encrypted, then you will be prompted for a
     # pass phrase.  Note that a kill -HUP will prompt again.  A new
     # certificate can be generated using the genkey(1) command.
    -SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    +#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
    +SSLCertificateFile /etc/pki/tls/private/server.crt
     
     #   Server Private Key:
     #   If the key is not combined with the certificate, use this
     #   directive to point at the key file.  Keep in mind that if
     #   you've both a RSA and a DSA private key you can configure
     #   both in parallel (to also allow the use of DSA ciphers, etc.)
    -SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    +#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
    +SSLCertificateKeyFile /etc/pki/tls/private/server.key
     
     #   Server Certificate Chain:
     #   Point SSLCertificateChainFile at a file containing the
    @@ -213,5 +221,11 @@
     CustomLog logs/ssl_request_log \
               "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
     
    +<Directory /var/www/simplesaml/www>
    +    <IfModule mod_authz_core.c>
    +        Require all granted
    +    </IfModule>
    +</Directory>
    +
     </VirtualHost>                          
    

2. SimpleSAMLphpのダウンロード

SimpleSAMLphpをhttps://simplesamlphp.org/からダウンロードします。本記事執筆の時点では1.19.0が最新ですので、このバージョンを使用します。

ダウンロードしたSimpleSAMPphpを/var/www/simplesamlとして展開します。


[root@samlsp ~]# ls /var/www/simplesaml/
CONTRIBUTING.md  SECURITY.md   cache          config            docs     log                 package-lock.json  routing    tests
COPYING          TESTING.md    cert           config-templates  extra    metadata            package.json       schemas    vendor
LICENSE          attributemap  composer.json  data              lib      metadata-templates  phpcs.xml          src        webpack.config.js
README.md        bin           composer.lock  dictionaries      locales  modules             phpunit.xml        templates  www

3. Apacheの再起動

Apacheを再起動します。


[root@samlsp ~]# systemctl restart httpd

4. SimpleSAMLphp設定ページの管理者パスワード設定

/var/www/simplesaml/config/config.phpファイルを編集し、パスワードとsecretsaltを設定します。

secretsaltは設定ファイルのコメントにある通り、下記のコマンドで設定します。


LC_CTYPE=C tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom | dd bs=32 count=1 2>/dev/null;echo


config.php )
     * A possible way to generate a random salt is by running the following command from a unix shell:
     * LC_CTYPE=C tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom | dd bs=32 count=1 2>/dev/null;echo
     */
    'secretsalt' => 'dvcdii25shoujwck3608c5mly0az16an',

---省略---
     * You can also put a hash here; run "bin/pwgen.php" to generate one.
     */
    'auth.adminpassword' => 'xxxxxxxxxxxxxxxxxxxxxx(任意のパスワード)',

5. SimpleSAMLphp設定ページへのアクセス

https://[host名]/simplesamlにアクセスします。SimpleSAMLphpの設定ページが表示されます。

6. 自己証明書の設定

また、自己証明書を/var/www/simplesaml/cert/以下に作成します。


[root@samlsp ~]# openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -subj "/C=JP/ST=SAITAMA/CN=samlsp.example.com" -out /var/www/simplesaml/cert/samlsp.example.com -keyout /var/www/simplesaml/cert/samlsp.example.com

/var/www/simplesaml/config/authresources.phpを編集し、自己証明書を設定します。


    'host' => '__DEFAULT__',

    // X.509 key and certificate. Relative to the cert directory.
    'privatekey' => 'samlsp.example.com.pem',
    'certificate' => 'samlsp.example.com.crt',
---省略---
        // The entity ID of this SP.
        // Can be NULL/unset, in which case an entity ID is generated based on the metadata URL.
        'entityID' => 'https://samlsp.example.com/',


7. SPへのIdPの登録

ここから、前回作成したIdPと今回作成するSPを連携させていきます。

  • まず最初に、前回作成したIdPのメタデーをXMLで持ってきます。
  • SP側のパーサツールでXMLからメタデータを変換しコピーします。
  • コピーしたメタデータをSPの/var/www/simplesamlphp/metadata/saml-20-idp-remote.phpの最下段に貼り付けます。
    
     * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-idp-remote
     */
    
    $metadata['https://idp.example.com/simplesaml/saml2/idp/metadata.php'] = [
        'entityid' => 'https://idp.example.com/simplesaml/saml2/idp/metadata.php',
        'contacts' => [],
        'metadata-set' => 'saml20-idp-remote',
    --省略--
                'X509Certificate' => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
            ],
        ],
    ];
    

7. IdPへのSPの登録

次に、今回作成するSPを前回作成したIdPに登録させていきます。

  • SPのメタデータ(XML)を取得します。
  • XMLをIdP側でメタデータに変換します。
  • コピーしたメタデータをIdPの/var/www/simplesamlphp/metadata/saml-20-sp-remote.phpの最下段に貼り付けます。
    
    /**
     * SAML 2.0 remote SP metadata for SimpleSAMLphp.
     *
     * See: https://simplesamlphp.org/docs/stable/simplesamlphp-reference-sp-remote
     */
    --省略--
    $metadata['https://samlsp.example.com/sp'] = [
        'entityid' => 'https://samlsp.example.com/sp',
        'contacts' => [],
        'metadata-set' => 'saml20-sp-remote',
        'AssertionConsumerService' => [
    
    --省略--
                'X509Certificate' => 'XXXXXXXXXXXXXXXXXXXXXX'."\n"
                    .'XXXXXXXXXXXXXXXXXXXXXX',
            ],
        ],
    ];
    

8. IdPの登録情報修正

IdPの方で連携するためのID/Passwordを登録します。サンプルのものを修正して使用します。

前回作成したIdPにログインし、/var/www/simplesaml/config/authsources.phpファイルを開いて「example-userpass」の箇所を修正します。


   'example-userpass' => [
        'exampleauth:UserPass',

        // Give the user an option to save their username for future login attempts
        // And when enabled, what should the default be, to save the username or not
        //'remember.username.enabled' => false,
        //'remember.username.checked' => false,

        //'student:studentpass' => [
        //    'uid' => ['test'],
        //    'eduPersonAffiliation' => ['member', 'student'],
        //],
        //'employee:employeepass' => [
        //    'uid' => ['employee'],
        //    'eduPersonAffiliation' => ['member', 'employee'],
        //],
        'siosuser:パスフレーズ' => [
            'uid' => ['hogehoge'],
            'eduPersonAffiliation' => ['member', 'employee'],
        ],
    ],

9. IdPとSPの連携確認

  • SPの認証テストページを開きます。
  • default-spを選択します。
  • IdPを選択します。
  • IdPで設定したUIDとパスフレーズを入力します。成功すると、IDとその他の情報が表示されます。
  • SP上にテスト用のページとして下記のPHPファイルを/var/www/simplesamlphp/www/test.phpとして作成します。
    
    <?php
    require_once('/var/www/simplesamlphp/lib/_autoload.php');
    
    use SimpleSAML\Auth\Simple;
    $as = new Simple('default-sp');
    $as->requireAuth();
    $name=$as->getAuthData("saml:sp:NameID");
    $attributes=$as->getAttributes();
    print_r($attributes);
    echo ($attributes["uid"][0]);
    
    ?>
    
    <html>
    <body>
    <h1>こんにちは <?php echo ($attributes["uid"][0]); ?></h1>
    < a href="https://samlsp.example.com/simplesaml/module.php/core/authenticate.php?as=default-sp&logout">logout</a >
    <body>
    </html>
    
  • "https://samlsp.example.com/simplesaml/test.php"にアクセスすると(ログアウトしている場合にはログインが必要になります)、ログインしたユーザのUIDが表示されます。

まとめ

SimpleSAMLphpを用いると、IdPやSPを簡単に作成してテストすることが可能です。


次回は

次回は、mod_auth_mellonを設定したWebサイトを用意し、前々回設定したIdPとの接続テストを行います。


セキュリティ系連載案内

CM

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


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

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

前へ

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

次へ

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