前提条件
- 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
#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
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
extention=mbstring.so #追記
# yum install -y php-xml
3.httpd再起動
systemctl restart httpd
4.稼働確認用phpファイル作成
cd /var/www/html
vi 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
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
'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
'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
'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
<?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
<?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
<?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
以上