SimpleSAMLphp環境構築メモ


前提条件

  • CentOS7 7.4.1708(最小構成インストール)
  • HTTP ServerはApache HTTP Serverを利用
  • https接続はmod_sslを利用

OS初期設定

1.インターフェース名確認

# ip addr

2.IP設定およびホスト名、DNS設定

# nmcli con mod [i/f名] ipv4.method manual
# nmcli con mod [i/f名] ipv4.addresses "192.168.xx.xx/24"
# nmcli con mod [i/f名] ipv4.gateway "192.168.xx.xx"
# nmcli con mod [i/f名] ipv4.dns "192.168.xx.xx"
# nmcli general hostname
localhost.localdomain
# nmcli general hostname sp.local
# systemctl restart systemd-hostnamed
# hostname
sp.local

3.ネットワーク自動起動設定

# nmcli con mod [i/f名] connection.autoconnect yes

4.監査機能およびファイヤーウォールの停止

# systemctl stop firewalld
# systemctl disable firewalld

# systemctl stop auditd
# systemctl disable auditd

5.SELinuxの無効化

# vi /etc/selinux/config
/etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled

6.ロケール変更

localectl set-locale LANG=ja_JP.utf8

7.時刻同期

ntpdate -b ntp.nict.jp
※定期同期したい場合はcronに登録

8.OS再起動

# reboot

Apache HTTP Server インストール

1.yumで導入

# yum install -y httpd

2.httpdの起動

# systemctl start httpd

3.httpdの自動起動設定

# systemctl enable httpd

4.稼働確認
デフォルトページが表示されればOK

http://sp.local/

PHP インストール

1.php導入

# yum install -y php

2.php拡張機能導入

# yum install -y php-mbstring
# vi /etc/php.ini
php.ini
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
extention=mbstring.so  #追記 
# yum install -y php-xml

3.httpd再起動

systemctl restart httpd

4.稼働確認用phpファイル作成

cd /var/www/html
vi phpinfo.php
phpinfo.php
<?php
   phpinfo();
?>

5.稼働確認
http://sp.local/phpinfo.php

バージョン情報が表示されればOK
テキスト文字がそのまま表示された場合はNG

SimpleSAMLphp導入

1.ダウンロード

curl -OL https://github.com/simplesamlphp/simplesamlphp/releases/download/v1.15.0/simplesamlphp-1.15.0.tar.gz

※バージョン1.15.0をダウンロードする場合

2.展開とファイルの移動

# tar xvf simplesamlphp-1.15.0.tar.gz
# mv simplesamlphp-1.15.0 /var/www/simplesaml

※/var/www/simplesamlをホームとする場合

HTTP over TLS設定

1.mod_sslインストール

# yum install mod_ssl

mod_ssl-2.4.6-67.el7.centos.6.x86_64

2.秘密鍵作成(keyファイル)

# cd /etc/pki/tls/private/
# openssl genrsa -aes128 1024 > server.key

Generating RSA private key, 1024 bit long modulus
..................++++++
..........................................++++++
e is 65537 (0x10001)
Enter pass phrase:(パスフレーズ)
Verifying - Enter pass phrase:(同じパスフレーズ)

3.証明書署名要求ファイル作成(CSRファイル)

# cd /etc/pki/tls/private/
# openssl req -new -key server.key > server.csr

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Hoge
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hoge Ltd
Organizational Unit Name (eg, section) []:Hoge
Common Name (eg, YOUR name) []:sp.local
Email Address []:空白

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:空白
An optional company name []:空白

4.自己証明書ファイル作成(CRTファイル)

# cd /etc/pki/tls/private/
# openssl x509 -in server.csr -days 36500 -req -signkey server.key > /etc/pki/tls/private/server.crt

Signature ok
subject=/C=JP/ST=Tokyo/L=Hoge/O=Hoge Ltd/OU=Hoge/CN=sp.local
Getting Private key
Enter pass phrase for server.key:(上記で指定したパスフレーズ)

5.起動時パスフレーズ入力解除

# mv server.key server.key.bak
# openssl rsa -in server.key.bak > server.key

Enter pass phrase for server.key.back:(パスフレーズ)
writing RSA key

6.ssl.conf設定

# vi /etc/httpd/conf.d/ssl.conf
ssl.conf

Listen 443 https

SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout  300
SSLRandomSeed startup file:/dev/urandom  256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin

<VirtualHost _default_:443>
SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/www/simplesaml/config     #編集
DocumentRoot "/var/www/simplesaml/www"                         #編集
Alias /simplesaml /var/www/simplesaml/www                      #編集
Alias /sample /var/www/sample/                                 #編集
ServerName sp.local:443                                        #編集
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol -all +TLSv1.2                                      #編集
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA               #編集
SSLCertificateFile /etc/pki/tls/private/server.crt             #編集
SSLCertificateKeyFile /etc/pki/tls/private/server.key          #編集

<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

<Directory /var/www/simplesaml/www>                            #編集
  <IfModule mod_authz_core.c>                                  #編集
    Require all granted                                        #編集
  </IfModule>                                                  #編集
</Directory>                                                   #編集

BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

※80ポートアクセスを443リダイレクトしたい場合は下記も合わせて実施
confファイル名は何でもよい。

vi /etc/httpd/conf.d/rdct80.conf
<VirtualHost *:80>
    ServerName sp.local
    DocumentRoot /var/www/html/

    RedirectMatch 301 .* https://sp.local/simplesaml/
</VirtualHost>

7.httpd再起動

systemctl restart httpd

8.稼働確認
https://sp.local/simplesaml/

SimpleSAMLphp設定

1.adminユーザパスワード設定

vi /var/www/simplesaml/config/config.php
config.php
'auth.adminpassword' => '(任意のパスワード)',

2.secretsaltの設定
下記コマンドでランダムな文字列を生成

tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom | dd bs=32 count=1 2>/dev/null;echo
vi /var/www/simplesaml/config/config.php
config.php
'secretsalt' => '(生成したランダム文字列)',

SP構築

1.署名・暗号化用証明書作成

# cd /var/www/simplesaml
# openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes -subj "/C=JP/ST=Tokyo/CN=sp.local" -out cert/sp.local.crt -keyout cert/sp.local.pem
# ls -al /var/www/simplesaml/cert/

2.default-sp設定

vi /var/www/simplesaml/config/authsources.php
authsources.php
'default-sp' => array(
'saml:SP',
'RelayState' => 'https://sp.local/sample/start.php',
# idp認証後に遷移させたいURLがある場合

'privatekey' => 'sp.local.pem',  #追加
'certificate' => 'sp.local.crt',  #追加

#'entityID' => null, #コメントアウト
'entityID' => 'https://sp.local/', #追加

# idpのエンティティID
'idp' => 'idp_entityid',

#アサーションにNameID-format(unspecified)を強制する場合
'NameIDPolicy' => 'urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified', 

サンプル用ページ作成

mkdir /var/www/sample/
vi /var/www/sample/start.php
start.php
<?php
require_once('/var/www/simplesaml/lib/_autoload.php');
$as = new SimpleSAML_Auth_Simple('default-sp');
$as->requireAuth();
$attr=$as->getAttributes();
$name=$as->getAuthData("saml:sp:NameID");
?>
<html>
<body>
<h1>This page is ServiceProvider start page.</h1>
<h2>NameID Format</h2>
<pre><?php print_r($name) ?></pre>
<h2>Attribute</h2>
<pre><?php print_r($attr) ?></pre>
<a href="logout.php">logout</a>
</body>
</html>
vi /var/www/sample/logout.php
logout.php
<?php
require_once('/var/www/simplesaml/lib/_autoload.php');
$as = new SimpleSAML_Auth_Simple('default-sp');
$as->requireAuth();
$attributes = $as->getAttributes();
$as->logout('https://sp.local/sample/start.php');
?>

3.Idpメタデータ取り込み
・simplesamlphp管理画面->連携->XML を SimpleSAMLphpメタデータに変換
・参照ボタンから対象のIdpメタデータ(XMLファイル)をアップロード
・変換されたメタデータ(saml20-idp-remote)の内容をコピー

・saml20-idp-remote.phpにペースト
※phpソースなのでphpタグを忘れずに

vi /var/www/simplesaml/metadata/saml20-idp-remote.php
saml20-idp-remote.php
<?php
$metadata['https://test.idp.local:443/'] = array (
  'entityid' => 'https://test.idp.local:443/',
  'contacts' =>
  array (
  ),
  'metadata-set' => 'saml20-idp-remote',

<<省略>>

  ),
);
?>

IDP側設定

IDP側で連携先のSPに関わる設定を行う。(IDPのマニュアルなど参照)

稼働確認

・simplesamlphpの管理画面にアクセス

https://sp.local/simplesaml/
もしくは
https://sp.local/simplesaml/module.php/core/authenticate.php?as=(sp名)

・認証タブ->設定されている認証元をテスト->default-sp を選択
・連携したいIdpを選択後、選択ボタンを押下

・IdpにリダイレクトされIdpの認証画面が表示される
・Idp認証後、アサーションで連携されたユーザ属性やSAML Subjectが表示される

または、

https://sp.local/sample/start.php

以上