CentOS7でのSimpleSAMLphp環境構築(前編)

# 環境
・CentOS Linux release 7.5.1804 (Core)
・Apache/2.4.6
・PHP 5.6.40 ※後述
・SimpleSAMLphp 1.17.2

# SimpleSAMLphpとは？
これ
https://simplesamlphp.org/

### シングルサインオンについて
Webサービスを利用するときにアカウントをを登録することが多いと思いますが、だいたいのサイトではIDとパスワードを登録してログイン時に入力することでユーザ認証を行うという流れだと思います。
この流れは良いのですが、利用するサービスが増えると登録して覚えておくべきIDとパスワードのセットも増えていき、ユーザの負担が大きい、パスワードを忘れてしまうことがある、同じパスワードを使い回してしまいセキュリティ的によろしくない、といった問題があります。この問題に対するアプローチの一つがシングルサインオンです。
シングルサインオンは、認証サーバ(IdP：Identity Provider)にアカウントを一つ登録しておき、その他のサービス(SP：Service Provider)へのアカウント登録の際にIdPのアカウントを利用してサインインするといったものです。よくある"Twitterでログイン"みたいなのもシングルサインオンですね。
<img width="704" alt="スクリーンショット 2019-05-29 16.47.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404657/c2070893-e753-d983-3ac1-08c9a4461792.png">

### SAMLについて
SAMLとはSecurity Assertion Markup Languageの略称で簡単に言うとシングルサインオンを実装するときに使う言語の一種です。

### SimpleSAMLphp
今回題材としているSimpleSAMLphpとは、シングルサインオンを実装するためのSAMLベースのオープンソースソフトウェアです。リファレンスが英語のみで、実際に使用方法などを記述したサイトなども少なく、バージョンの違いなんかで動かなくなるようなちょっとトリッキーなものではありますが、シングルサインオンを実装するには非常に便利です。
今回は、IdPとSPそれぞれの環境構築と連携までを行います。

# CentOS初期設定
こちらの記事が参考になります。
VirtualBoxを使うならssh接続できたほうがいろいろと便利なので…。
https://qiita.com/ebkn/items/751ed657629ba8d4ab0a

# SimpleSAMLphp環境構築
こちらの記事が参考になります。
https://qiita.com/haya43/items/c74d2710cd9b57d2cbb4

だいたいこの通りにやればうまくいきますが筆者が少々躓いたのとIdPの設定が少しことなっていることから加筆しながらなぞっていく形になります。

## CentOSの設定
参照した記事ではIPアドレスなどいろいろコマンドラインで設定していますが、ssh接続の記事で設定しているので今回は無視します。
hostnameは変えておくとのちのちわかりやすいので変えておきます。

```
＃ nmcli general hostname <変更するhostname>
# systemctl restart systemd-hostnamed
```

簡単に説明しておくとhostnameはいま設定しているVMの名前で、ウェブサイトとしてアクセスする際のURLになるのでわかりやすいものを付けるといいです。SPならばsp.local、IdPならばidp.localのようにしておくとURLを見ただけでSPかIdPか判別できます。

ssh接続してローカル環境のブラウザからアクセスする際には、ファイヤーウォールを停止しておかないとアクセスできないので停止しておきます。

```
# systemctl stop firewalld
# systemctl disable firewalld
```

アクセス制御の設定などをいい感じに設定できると停止しなくても良さそうですが、とりあえずアクセスできるようになることを目標とします。CentOSのVMをGUI起動して、VM内のブラウザからアクセスする場合はファイヤーウォールが起動していてもアクセスできたと思うので参考までに。

SELinuxを無効化します。

```
# vi /etc/selinux/config
```

```:etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled
```

ロケールを変更します。

```
# localectl set-locale LANG=ja_JP.utf8
```

OSを再起動します。

```
# reboot
```

## ApacheとPHPのインストール
Apache

```
# yum install -y httpd
# systemctl start httpd
# systemctl enable httpd
```

ブラウザからhttp://<設定したhostname>/にアクセスしてApacheのデフォルトページが表示されたらOK。

PHP

```
# yum -y install php php-mbstring
# vi /etc/php.ini
```

```:php.ini
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
extention=mbstring.so  #追記
```

```
# yum -y install php-xml
# systemctl restart httpd
```

テストページを作る。

```
# vi /var/www/html/phpinfo.php
```

```php:phpinfo.php
<?php
    phpinfo();
?>
```

http://<設定したhostname>/phpinfo.phpにアクセス、PHPのバージョン情報が表示されればOK。

## SimpleSAMLphpインストール
wgetコマンドで入れます。
wgetコマンドがないよとエラーが出たらyumでインストール。

```
# yum -y install wget
```

https://simplesamlphp.org/download から最新のパッケージのリンクをコピーしてwgetのあとに入力してダウンロードします。先にSimpleSAMLphpのファイルを展開したいディレクトリに移動しておくといいかも。今回は/var/www/配下に展開するので先にcdコマンドで移動しておきます。

```
# cd /var/www
# wget https://simplesamlphp.org/download?latest
```

ダウンロードしたファイルを展開

```
# tar xvf download?latest
```

展開したファイルはsimplesamlphp-1.XX.XXみたいなファイル名になっていると思うのでわかりやすいように変更しておきます。

```
# mv simplesamlphp-1.XX.XX simplesaml
```

## HTTPS設定
参照先の記事まんまなので簡単にいきます。

mod_sslをインストール

```
# yum -y install mod_ssl
```

秘密鍵・証明書等作成

```
# 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:（同じパスフレーズ）

# 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) []:空白
Organization Name (eg, company) [Internet Widgits Pty Ltd]:空白
Organizational Unit Name (eg, section) []:空白
Common Name (eg, YOUR name) []:設定したhostname
Email Address []:空白

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

# 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:（上記で指定したパスフレーズ）

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

Enter pass phrase for server.key.back:（パスフレーズ）
writing RSA key
```

ここまでで秘密鍵と(オレオレ)証明書ができました。
さらに設定ファイルを編集

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

```
Listen 443 https

(中略)

<VirtualHost _default_:443>
SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/www/simplesaml/config # 追記

# General setup for the virtual host, inherited from global configuration
DocumentRoot "/var/www/simplesaml/www" # 編集

Alias /simplesaml "/var/www/simplesaml/www" # 追記

ServerName <設定したhostname>:443 # 編集

(中略)

#   SSL Protocol support:
# List the enable protocol levels with which clients will be able to
# connect.  Disable SSLv2 access by default:
SSLProtocol -all +TLSv1.2　# 編集

(中略)

#   Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate.  If
# 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/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/server.key

(中略)

# 最後に追記
<Directory /var/www/simplesaml/www>
    <IfModule mod_authz_core.c>
        Require all granted
    </IfModule>
</Directory>
</VirtualHost>
```

simplesamlディレクトリを置いた場所が/var/www/でない場合や、秘密鍵などを違うディレクトリに置いた、違う名前にしたような場合は適宜変更してください。
最後にapacheを再起動

```
# systemctl restart httpd
```

https://<設定したhostname>/simplesamlにアクセスしてSimpleSAMLphpの設定ページが表示されたらOK。
<img width="717" alt="スクリーンショット 2019-05-29 17.48.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404657/a3d375c7-6a40-80df-13a8-215f6de409e5.png">

## 設定ページが表示されない場合
httpsではなくhttpでアクセスしていませんか？筆者も間違えてhttpでアクセスして表示されないという壁に直面しましたが、当時全く気が付かなかったので別の方法で対処しましたので以下に記します。参考までに。

### httpd.confを編集
ssl.confはhttps(443ポートアクセス)の設定ファイルであり、/simplesamlが見つかりませんというエラーの場合ここで解決されることが多い。/simplesamlはエイリアスを設定しているのでこのエイリアス設定をhttp(80番ポートアクセス)の設定ファイルに書けばよいという寸法(?)

```
# vi /etc/httpd/conf/httpd.conf
```

```:httpd.conf
(設定ファイルの末尾に以下を追記)

Alias /simplesaml /var/www/simplesaml/www
<Directory /var/www/simplesaml/www>
    <IfModule mod_authz_core.c>
        Require all granted
    </IfModule>
</Directory>
```

Apacheを再起動して再びブラウザアクセスしてみると(おそらく)表示できると思います。

ここまでできたら次はSPとIdPの構築になりますが長くなってきたので次の記事で書こうと思います。~~出来次第リンクを貼ります。~~

(2020/05/22 追記)
リンクずっと貼ってませんでした……。
後編はこちら https://qiita.com/come340/items/c0813e4201396b0ae137