SimpleSAMLphp で SAML 2.0 によるシングルサインオン (SSO) の動作を確認してみた

# 0. 前提条件
|マシン|IPアドレス|
|---|---|
|IdP CentOS 7|192.168.56.10|
|SP1 CentOS 7|192.168.56.11|
|SP2 CentOS 7|192.168.56.12|

# 1. 事前準備【全てのサーバ】

```
# mv -i /etc/selinux/config /etc/selinux/config.orig
# sed 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config.orig >/etc/selinux/config
# setenforce permissive

# firewall-cmd --add-service=http --permanent
# firewall-cmd --reload

# mv -i /etc/chrony.conf /etc/chrony.conf.orig
# sed '/^server/d; 1,/^$/s/^$/server time.nist.gov iburst\
/' /etc/chrony.conf.orig >/etc/chrony.conf
# systemctl restart chronyd
```
SimpleSAMLphp の動作に時刻同期は必須です。pool.centos.org は不安定なため、NICT の NTP サーバを指定しています。

# 2. パッケージのインストールと設定【全てのサーバ】
```
# yum install -y --disablerepo=updates httpd php php-mbstring php-xml

# mv -i /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.orig
# cat /etc/httpd/conf/httpd.conf.orig - <<EOF >/etc/httpd/conf/httpd.conf

<IfModule mod_alias.c>
    Alias /simplesaml /var/www/simplesamlphp/www

    <Directory "/var/www/simplesamlphp/www">
        Require all granted
    </Directory>

    SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/www/simplesamlphp/config
</IfModule>
EOF

# mv -i /etc/php.ini /etc/php.ini.orig
# sed '/^; Dynamic Extensions ;$/,/^$/s/^$/\
extention=mbstring.so\
/' /etc/php.ini.orig >/etc/php.ini

# systemctl enable httpd
# systemctl start httpd
```

# 3. SimpleSAMLphp のダウンロードと配置【全てのサーバ】
```
# curl -LO https://github.com/simplesamlphp/simplesamlphp/releases/download/v1.16.3/simplesamlphp-1.16.3.tar.gz
# tar -xzf simplesamlphp-1.16.3.tar.gz
# chown -hR root:root simplesamlphp-1.16.3
# mv -i simplesamlphp-1.16.3 /var/www/simplesamlphp
```

本稿執筆時点で、より新しい SimpleSAMLphp 1.18.7 がリリースされていますが、CentOS 7 に同梱の PHP 5.4.X 上では SimpleSAMLphp 1.16.3 より新しいリリースは動作しません。

# 4. IdP の設定【IdP CentOS 7】
```
# cd /var/www/simplesamlphp/
# mv -i config/config.php config/config.php.orig
# sed "
  s/'auth.adminpassword' => '123'/'auth.adminpassword' => 'admin1'/;
  s/'secretsalt' => 'defaultsecretsalt'/'secretsalt' => '"\
`env LC_CTYPE=C tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom |
dd bs=32 count=1 2>/dev/null;echo`"'/;
  s/'enable.saml20-idp' => false/'enable.saml20-idp' => true/;
  " config/config.php.orig >config/config.php

# mv -i config/authsources.php config/authsources.php.orig
# sed "\$i\\
    'example-userpass' => array(\\
        'exampleauth:UserPass',\\
        'user1:pass1' => array(\\
            'uid' => array('user1'),\\
            'eduPersonAffiliation' => array('member', 'admin'),\\
        ), \\
        'user2:pass2' => array(\\
            'uid' => array('user2'),\\
            'eduPersonAffiliation' => array('member', 'developer'),\\
        ),\\
    ),\\

" config/authsources.php.orig >config/authsources.php
# touch modules/exampleauth/enable

# openssl req -newkey rsa:2048 -new -x509 -days 3652 -nodes \
-subj /C=JP/ST=Tokyo/CN=MyIdP -out cert/server.crt -keyout cert/server.pem
```

1. ブラウザで http://192.168.56.10/simplesaml/ にアクセスし、「認証」タブをクリックします。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/98d761f3-ed89-a287-a4f9-e500ac67f294.png)
2. 「管理者でログイン」をクリックします。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/047ce600-a849-c755-5afb-73cbfb64cc73.png)
3. ユーザ名:admin、パスワード:admin1 でログインします。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/62d42982-f367-166d-65f2-f9dda7e8474f.png)
4. 「連携」タブをクリックします。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/39748d23-c03f-bd4e-4d05-489aa0ef767f.png)
5. 「SAML 2.0 IdPメタデータ」リージョンの「メタデータを表示」をクリックします。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/a6176707-bc25-29c5-9ce2-c435bcdac055.png)
6. 「SAML 2.0 用のメタデータXMLフォーマット」の内容をクリップボードにコピーします。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/80dbd299-e7c0-1623-1dd9-9b78b65cc0fa.png)
7. 左上冒頭の「SAML 2.0 IdPメタデータ」 (タイトル) をクリックし、「連携」タブをクリックします。
8. 「ツール」リージョンの「XML を SimpleSAMLphpメタデータに変換」をクリックします。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/ca3deffb-b493-4905-6d58-164031750f81.png)
9. テキスト領域にクリップボードの内容を貼り付け、「パース」ボタンをクリックします。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/ef0619bc-692f-2848-13db-a33103bf662c.png)
10. 「saml20-idp-remote」リージョンの内容をクリップボードにコピーします。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/40f20f87-93ef-adf8-dbc7-50475bdcdff1.png)
11. SP1 の /var/www/simplesamlphp/metadata/saml20-idp-remote.php の末尾に追記します。
12. SP2 の /var/www/simplesamlphp/metadata/saml20-idp-remote.php の末尾に追記します。

# 5. SP1 の設定【SP1 CentOS 7】
```
# cd /var/www/simplesamlphp/
# mv -i config/config.php config/config.php.orig
sed "
  s/'auth.adminpassword' => '123'/'auth.adminpassword' => 'admin1'/;
  s/'secretsalt' => 'defaultsecretsalt'/'secretsalt' => '"\
`env LC_CTYPE=C tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom |
dd bs=32 count=1 2>/dev/null;echo`"'/;
  " config/config.php.orig >config/config.php
```

1. ブラウザで http://192.168.56.11/simplesaml/ にアクセスし、「連携」タブをクリックします。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/2110c96c-9568-db64-6361-d47d1407ec2f.png)
2. SAML 2.0 SPメタデータ」リージョンの「メタデータを表示」をクリックします。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/36cb7d6d-1137-664c-237e-0f0d8a4b2914.png)
3. 「SAML 2.0 用のメタデータXMLフォーマット」の内容をクリップボードにコピーします。
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/bfe70d37-b35c-21db-b309-e38cf2223bb8.png)
4. ブラウザで http://192.168.56.10/simplesaml/admin/metadata-converter.php にアクセスします。
![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/2e526e00-4440-bacf-0b9e-9827c432e71e.png)
5. ログイン画面が表示された場合は、ユーザ名:admin、パスワード:admin1 でログインします。
6. 「saml20-sp-remote」リージョンの内容をクリップボードにコピーします。
![29b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/c42f8191-18c7-98e4-e248-c429cb86504e.png)
7. IdP の /var/www/simplesamlphp/metadata/saml20-sp-remote.php の末尾に追記します。

# 6. SP2 の設定【SP2 CentOS 7】
```
# cd /var/www/simplesamlphp/
sed "
  s/'auth.adminpassword' => '123'/'auth.adminpassword' => 'admin1'/;
  s/'secretsalt' => 'defaultsecretsalt'/'secretsalt' => '"\
`env LC_CTYPE=C tr -c -d '0123456789abcdefghijklmnopqrstuvwxyz' </dev/urandom |
dd bs=32 count=1 2>/dev/null;echo`"'/;
  " config/config.php.orig >config/config.php
```

1. ブラウザで別のタブを開き、http://192.168.56.12/simplesaml/ にアクセスし、「連携」タブをクリックします。
![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/a002dde2-a8bf-3f14-e136-c7cc67d8f14c.png)
2. 「SAML 2.0 SPメタデータ」リージョンの「メタデータを表示」をクリックします。
![32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/08848a02-77d7-b5e3-5181-d84daa9f7d14.png)
3. 「SAML 2.0 用のメタデータXMLフォーマット」の内容をクリップボードにコピーします。
![33a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/9ef393e1-341b-0598-1c7d-0f9f8697560c.png)
4. ブラウザで http://192.168.56.10/simplesaml/admin/metadata-converter.php にアクセスします。
![35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/6f4abf3b-3b34-c072-6b0a-169693b15c7d.png)
5. ログイン画面が表示された場合は、ユーザ名:admin、パスワード:admin1 でログインします。
6. 「saml20-sp-remote」リージョンの内容をクリップボードにコピーします。
![37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/e55b5bf6-5b52-2471-896b-c26e1d603897.png)
7. IdP の /var/www/simplesamlphp/metadata/saml20-sp-remote.php の末尾に追記します。

# 7. 動作確認 (シングルサインオンによるログインとログアウト)

1. ブラウザで http://192.168.56.11/simplesaml/ にアクセスし、「認証」タブをクリックします。
![41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/6ebd70fc-862c-98c6-40f2-3b99ed4ba137.png)
2. 「設定されている認証元をテスト」をクリックします。
![42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/88e4fae1-04d2-2323-705e-e7ba381faad6.png)
3. 「default-sp」をクリックします。
![43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/c1ee99d6-3039-1b0f-f170-e01a4dcfd168.png)
4. 「選択」ボタンをクリックします。
![44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/3f6c91de-4061-b8dc-0d31-3497d99eea11.png)
5. ユーザ名:user1、パスワード:pass1 でログインします。
![45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/e31616f9-5e4a-37b6-6c65-5023463105e5.png)
6. ブラウザで別のタブを起動し、 http://192.168.56.12/simplesaml/ にアクセスします。
![46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/207cf443-62eb-8d5e-88c0-c5520da41e16.png)
7. 「認証」タブをクリックします。
![47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/24db9892-e6c8-778c-abb1-e4d42e3cae6b.png)
8. 「設定されている認証元をテスト」をクリックします。
![48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/e81c97d4-352b-e662-e146-33100dcabfe6.png)
9. 「default-sp」をクリックします。
![49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/410aa3ac-ad9d-5c37-7c98-a834f9847620.png)
10. 「選択」ボタンをクリックします。
![50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/775b4c2c-31cf-8459-f68d-41b56c5d4acd.png)
11. この時、ログイン画面が表示されず、既にログインされた状態になれば、シングルサインオンによるログインに成功です。
![51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/f7574e9e-4666-27ed-36b2-939ec132d7b4.png)
12. 画面左下の「ログアウト」をクリックします。
13. 最初のタブ (SP1 へ接続) を再読み込み (リロード) し、「選択」ボタンをクリックします。
![53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/ee82b191-6480-fdf7-9bbe-b89d3e2285c6.png)
14. この時、既にログインされた状態にならず、ログイン画面が表示されれば、シングルサインオンによるログアウトに成功です。
![54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388314/178ce944-af41-ae18-8881-8a082b94f8da.png)