こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面 和毅です。
SAML環境のテストのために、SimpleSAMLphpを使って簡易IdP / SPをセットアップしました。SAML環境に関しては引き続き連載致します。今回は「SimpleSAMLphpを用いたSPのセットアップ」を纏めます。
連載及びコンテンツ
(SAML第1回) SimpleSAMLphpを使った簡易IdPの作成
(SAML第2回) SimpleSAMLphpを使った簡易SPの作成
(SAML第3回) mod_auth_mellonを使った簡易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で作業します。
- CentOS 7上でApacheをインストールします。通常は最小限のパッケージにしたいため、関連する必要なパッケージをそれぞれyumを用いてインストールしますが、ここではSPのインストールにフォーカスしたいため、思い切って下記の様に「yum group install」で”Basic Web Server”をインストールしてあります。
[root@samlsp ~]# yum -y groupinstall "Basic Web Server"
- 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
- /etc/php.iniで「Dynamic Extensions」に下記を加えます(下記の例では887行目です)
883 ;;;;;;;;;;;;;;;;;;;;;; 884 ; Dynamic Extensions ; 885 ;;;;;;;;;;;;;;;;;;;;;; 886 887 extention=mbstring.so 888
- localeを設定します。
[root@samlsp ~]# localectl set-locale LANG=ja_JP.utf8
- 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
- /etc/httpd/conf.d/ssl.confを以下のようにします。
- 自己証明書を使用する
- SIMPLESAMLPHP_CONFIG_DIRを設定する
- 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(任意のパスワード)',
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との接続テストを行います。
セキュリティ系連載案内
- OSSセキュリティ技術の会による日経Linuxでの連載「IoT時代の最新SELinux入門」がITPro上で読めるようになりました。技術の会代表で第一人者である中村さん等による、最新のSELinuxの情報やコマンド類等も更新されているのでお薦めです。
- OSSセキュリティ技術の会によるThinkITでの連載「開発者のためのセキュリティ実践講座」がThinkIT上で開始しました。技術の会の中の人間で、最新の代表的なOSSセキュリティ技術を紹介していきます。
- OSSセキュリティ技術の会により、ThinkITでLinuxSecuritySummit 2018のレポートが紹介されています。
- OSSセキュリティ技術の会の面により、@ITで「OSS脆弱性ウォッチ」が連載されています。
- OSSセキュリティ技術の会の面により、@ITで「OpenSCAPで脆弱性対策はどう変わる?」が連載されています。
- OSSセキュリティ技術の会のメンバーにより、@ITで「Berkeley Packet Filter(BPF)入門」が連載されています。
CM
こちらで小学生の勉強支援サイトをオープンしました。算数のプリント(都度、自動生成)が無料でダウンロードできます。コンテンツは未だ少ないですが、徐々に増やしていきます。