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
```

```text:/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 インストール
１．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
```
```text: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.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設定
１．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
```

６．ssl.conf設定

```
# vi /etc/httpd/conf.d/ssl.conf
```
```text: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
```
```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
```
```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
```
```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
```
```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
```
```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
```
```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
```


以上