序章

SimpleSAMLphp は、サービスプロバイダー(SP)またはIDプロバイダー(IdP)として SAML2.0をサポートするオープンソースのPHP認証アプリケーションです。

SAML(Security Assertion Markup Language)は、組織とアプリケーション間で認証および承認データを交換するための安全なXMLベースの通信メカニズムです。 これは、Web SSO(シングルサインオン)を実装するためによく使用されます。 これにより、複数の組織間で複数の認証資格情報を維持する必要がなくなります。 簡単に言うと、ユーザー名やパスワードなどの1つのIDを使用して、複数のアプリケーションにアクセスできます。

SimpleSAMLphpのインスタンスは、LDAPやユーザーのデータベースなどのIDプロバイダーである認証ソースに接続します。 リンクされたサービスプロバイダーから利用可能になったリソースへのアクセスを許可する前に、この認証ソースに対してユーザーを認証します。

このチュートリアルでは、SimpleSamlPHPをインストールし、認証ソースとしてMySQLデータベースを使用するように構成します。 ユーザーと暗号化されたパスワードをMySQLデータベースに保存し、それらのユーザーを使用してログインできることをテストします。

前提条件

ステップ1—SimpleSAMLphpのダウンロードとインストール

SimpleSAMLphpのインストールには、いくつかの手順が含まれます。 ソフトウェア自体と、いくつかの追加コンポーネントおよび前提条件をダウンロードする必要があります。 また、仮想ホストの構成にいくつかの変更を加える必要があります。

まだログインしていない場合は、サーバーにログインします。

プロジェクトのWebサイトからSimpleSAMLphpをダウンロードします。 SimpleSAMLphpは、常に最新の安定バージョンのソフトウェアを同じURLにリンクします。 これは、次のように入力することで最新バージョンを取得できることを意味します。

  1. wget https://simplesamlphp.org/download?latest

これにより、SimpleSAMLphpを含むdownload?latestという圧縮ファイルがダウンロードされます。 tarコマンドを使用してコンテンツを抽出します。

  1. tar zxf download?latest

ファイルはsimplesamlphp-1.x.yというラベルの付いた新しいディレクトリに抽出されます。ここで、x.yは現在のバージョン番号です。 lsコマンドを使用して、ファイルを識別します。

  1. ls

ファイル名が表示されます。

Ouptut
simplesamlphp-1.18.5

次に、cpコマンドを使用して、ディレクトリの内容を/var/simplesamlphpにコピーします。 必ずバージョン番号をお持ちのバージョンに置き換えてください。

  1. sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/

-aスイッチは、ファイルのアクセス許可がファイルおよびフォルダーと一緒にコピーされることを保証します。 ソースファイルの最後にあるドットは、隠しファイルを含むソースディレクトリ内のすべてのものが宛先ディレクトリにコピーされることを保証します。

注:別の場所にファイルをインストールする必要がある場合は、いくつかのファイルを更新する必要があります。 詳細については、SimpleSAMLphpの公式インストールドキュメントを参照してください。

SimpleSAMLphpに必要な追加のソフトウェアパッケージがいくつかあります。これには、XML、マルチバイト文字列、curl、およびLDAPを処理するためのPHP拡張機能が含まれます。 また、memcachedも必要です。 パッケージマネージャーを使用してこれらをインストールします。

まず、パッケージリストを更新します。

  1. sudo apt update

次に、パッケージをインストールします。

  1. sudo apt install php-xml php-mbstring php-curl php-memcache php-ldap memcached

インストールが完了したら、Apacheを再起動して、新しいPHP拡張機能をアクティブにします。

  1. sudo systemctl restart apache2

SimpleSAMLphpがインストールされたので、ファイルを提供するようにApacheを構成しましょう。

ステップ2—SimpleSAMLphpを提供するようにApacheを構成する

すでにドメインを構成し、このサーバーをポイントし、Let’s EncryptでApacheを保護することにより、HTTPSで動作するように仮想ホストを設定しました。 SimpleSAMLphpを提供するためにそれを使用しましょう。

Webに表示する必要がある唯一のSimpleSAMLphpディレクトリは/var/simplesamlphp/wwwです。 Webに公開するには、ドメインの仮想ホストSSLApache構成ファイルを編集します。

仮想ホストの構成ファイルの名前がyour_domain.confの場合、Let’s Encryptは、ドメインのHTTPS要求を処理するyour_domain-le-ssl.confという名前の新しい構成ファイルを作成しました。 次のコマンドでSSL構成ファイルを開き、ファイルを編集します。 your_domainをファイルの実際の名前に置き換えてください。

  1. sudo nano /etc/apache2/sites-available/your_domain-le-ssl.conf

ファイルは次のようになりますが、実際のファイルにはより説明的なコメントが含まれている場合があります。

/etc/apache2/sites-available/<^>your_domain<^>-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName your_domain

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

SSLCertificateFile /etc/letsencrypt/live/your_domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your_domain/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

ここでのServerNameディレクティブは、この仮想ホスト定義に一致する必要があるベースドメインを定義します。 これは、前提条件セクションでSSL証明書を設定したドメイン名である必要があります。 https://your_domain/simplesaml/*に一致するすべてのURLのSimpleSAMLphpを制御するAliasディレクティブを追加しましょう。 これを行うには、構成ファイルに次の行を追加します。

...
[label /etc/apache2/sites-available/your_domain-le-ssl.conf]
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html

  Alias /simplesaml /var/simplesamlphp/www

...

これは、domain_name/simplesaml/*に一致するすべてのURLが/var/simplesamlphp/wwwディレクトリに転送されてSimpleSAMLphpが制御できることを意味します。

次に、Require all grantedアクセス制御を指定して、/var/simplesamlphp/wwwディレクトリへのアクセスを許可します。 これにより、SimpleSAMLphpサービスにWeb経由でアクセスできるようになります。 これを行うには、構成ファイルに以下を追加します。

/etc/apache2/sites-available/<^>your_domain<^>-le-ssl.conf
...
  Alias /simplesaml /var/simplesamlphp/www
  <Directory /var/simplesamlphp/www/>
      Require all granted
  </Directory>
...

ファイルを保存して閉じます。 変更を有効にするには、Apacheを再起動します。

  1. sudo systemctl restart apache2

Apacheがアプリケーションファイルを提供するように構成されたので、SimpleSAMLphpを構成しましょう。

ステップ3—SimpleSAMLphpを構成する

次に、/var/simplesamlphp/config/config.phpにあるコアSimpleSAMLphp構成にいくつかの変更を加える必要があります。 エディターでファイルを開きます。

  1. nano /var/simplesamlphp/config/config.php

'auth.adminpassword'行を見つけ、デフォルト値の123をより安全なパスワードに置き換えて、管理者パスワードを設定します。 このパスワードを使用すると、SimpleSAMLphpインストールWebインターフェイスの一部のページにアクセスできます。

/var/simplesamlphp/config/config.php
. . .
'auth.adminpassword'        => 'your_admin_password',
. . .

次に、ランダムに生成された文字列である秘密のソルトを設定します。 SimpleSAMLphpの一部は、このソルトを使用して暗号的に安全なハッシュを作成します。 ソルトがデフォルト値から変更されていない場合、エラーが発生します。

OpenSSL rand関数を使用して、秘密のソルト文字列として使用するランダムな文字列を生成できます。 新しい端末を開き、サーバーに再度接続し、次のコマンドを実行してこの文字列を生成します。

  1. openssl rand -base64 32

-base64 32オプションは、32文字の長さのBase64エンコード文字列を保証します。

次に、構成ファイルで'secretsalt'エントリを見つけ、defaultsecretsaltを生成した文字列に置き換えます。

/var/simplesamlphp/config/config.php
. . .
'secretsalt' => 'your_generated_salt',
. . .

次に、技術的な連絡先情報を設定します。 この情報は生成されたメタデータで利用可能になり、SimpleSAMLphpは自動的に生成されたエラーレポートを指定した電子メールアドレスに送信します。 次のセクションを見つけます。

/var/simplesamlphp/config/config.php
. . .
'technicalcontact_name'     => 'Administrator',
'technicalcontact_email'    => '[email protected]',
. . .

Administrator[email protected]を適切な値に置き換えます。

次に、使用するタイムゾーンを設定します。 このセクションを見つけます:

/var/simplesamlphp/config/config.php
. . .
'timezone' => null,
. . .

nullを、このPHPのタイムゾーンリストの優先タイムゾーンに置き換えます。 値は必ず引用符で囲んでください。

/var/simplesamlphp/config/config.php
. . .
'timezone' => 'America/New_York',
. . .

ファイルを保存して閉じます。 これで、https://your_domain/simplesamlにアクセスして、ブラウザでサイトにアクセスできるようになります。 ブラウザに次の画面が表示されます。

simplesaml web interface

PHPインストールがSimpleSAMLphpをスムーズに実行するためのすべての要件を満たしていることを確認するには、構成タブを選択し、管理者としてログインリンクをクリックします。 次に、手順3で構成ファイルに設定した管理者パスワードを使用します。

ログインすると、SimpleSAMLphpで使用される必須およびオプションのPHP拡張機能のリストが表示されます。 predis/predisを除くすべての拡張機能がインストールされていることを確認してください。

All extensions installed

不足している必要なコンポーネントがある場合は、先に進む前に、このチュートリアルを確認し、不足しているコンポーネントをインストールしてください。

SimpleSAMLphpセットアップの健全性チェックというリンクも表示されます。 このリンクをクリックして、セットアップに適用されたチェックのリストを取得し、それらが成功したかどうかを確認します。

SimpleSAMLphpの認証ソースの構成に移りましょう。

ステップ4—認証ソースの構成

SimpleSAMLphpをインストールしてセットアップしたので、ユーザーを認証できるように認証ソースを構成しましょう。 MySQLデータベースを使用して、認証対象のユーザー名とパスワードのリストを保存します。

開始するには、MySQL rootアカウントにログインします。

  1. mysql -u root -p

MySQLルートアカウントのパスワードの入力を求められます。 続行するためにそれを提供します。

次に、認証ソースとして機能するデータベースを作成します。 これをauthと呼びます。 別の名前を付けてください。

  1. CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

次に、authデータベースを排他的に操作する別のMySQLユーザーを作成しましょう。 管理とセキュリティの観点から、1つの機能を持つデータベースとアカウントを作成することをお勧めします。 ユーザーにauthuserという名前を付けます。 次のコマンドを実行してユーザーを作成し、パスワードを設定して、authデータベースへのアクセスを許可します。 ここで、新しいデータベースユーザーに強力なパスワードを入力することを忘れないでください。

  1. GRANT ALL ON auth.* TO 'authuser'@'localhost' IDENTIFIED BY 'your_mysql_auth_user_password';

次に、usersテーブルを作成します。このテーブルは、usernamepasswordの2つのフィールドで構成されます。 セキュリティを強化するために、MySQL AES_ENCRYPT()関数を使用してパスワード文字列を暗号化し、パスワードをプレーンテキストで保存しないようにします。 この関数は文字列を暗号化し、バイナリ文字列を返します。

  1. CREATE TABLE auth.users(username VARCHAR(30), password VARBINARY(30));

次に、新しく作成したテーブルに3人のユーザーを挿入します。 ここで、AES_ENCRYPT()関数を使用して、パスワードフィールドの値を暗号化します。 暗号化キーとして使用される文字列を提供する必要があります。 複雑である限り、これを独自の文字列に置き換えるようにしてください。任意の文字列を使用できます。

  1. INSERT INTO auth.users(username, password) VALUES
  2. ('user1', AES_ENCRYPT('user1pass','your_secret_key')),
  3. ('user2', AES_ENCRYPT('user2pass','your_secret_key')),
  4. ('user3', AES_ENCRYPT('user3pass','your_secret_key'));

各ユーザーに同じキーを使用し、後で追加のユーザーを作成するために再び使用できるように、必ずキーを覚えておいてください。 SimpleSAMLphp構成でもこの秘密鍵を使用して、パスワードを復号化し、ユーザーが入力したパスワードと比較できるようにします。

MySQLの現在のインスタンスが、最近行った特権の変更を認識できるように、特権をフラッシュする必要があります。

  1. FLUSH PRIVILEGES;

次のように入力して、MySQLプロンプトを終了します。

  1. exit

SimpleSAMLphpでIDプロバイダー機能を有効にするには、/var/simplesamlphp/config/config.phpファイルを編集する必要があります。 利用可能なオプションはいくつかありますが、このガイドはSAML 2.0のサポートに焦点を当てているため、enable.saml20-idpオプションを有効にします。 これを行うには、/var/simplesamlphp/config/config.phpを開き、SAML2.0サポートを有効にします。

  1. nano /var/simplesamlphp/config/config.php

ファイルのこのセクションを見つけて、falsetrueに置き換えます。 :

/var/simplesamlphp/config/config.php
...
'enable.saml20-idp' => true,
...

次に、ファイルを保存してエディターを終了します。

IDプロバイダー機能が有効になったので、使用する認証モジュールを指定する必要があります。 MySQLデータベースにusersテーブルがあるため、SQL認証モジュールを使用します。 authsources構成ファイルを開きます。

  1. nano /var/simplesamlphp/config/authsources.php

コメントアウトされている次のブロックを見つけます。

/var/simplesamlphp/config/authsources.php
...
    /*
    'example-sql' => array(
        'sqlauth:SQL',
        'dsn' => 'pgsql:host=sql.example.org;port=5432;dbname=simplesaml',
        'username' => 'simplesaml',
        'password' => 'secretpassword',
        'query' => 'SELECT uid, givenName, email, eduPersonPrincipalName FROM users WHERE uid = :username AND password = SHA2(CONCAT((SELECT salt FROM users WHERE uid = :username), :password),256);',
    ),
    */
...

このコードは、SimpleSAMLphpがusersというデータベーステーブルでユーザーを検索するために使用できるデータベース接続とクエリを定義します。 コメントを外し、クエリを変更して、MySQLのAES_DECRYPT()関数を使用してテーブルからユーザーを検索する必要があります。 AES_DECRYPT()関数に、クエリでパスワードを暗号化するために使用したのと同じキーを提供する必要があります。

ファイルのセクションを変更して、データベース接続の詳細とクエリを指定します。

/var/simplesamlphp/config/authsources.php
...
    'example-sql' => array(
        'sqlauth:SQL',
        'dsn' => 'mysql:host=localhost;port=5432;dbname=auth',
        'username' => 'authuser',
        'password' => 'your_mysql_auth_user_password',
        'query' => 'SELECT username FROM users WHERE username = :username AND AES_DECRYPT(password,"your_secret_key") = :password',
    ),
...

your_secret_keyの代わりに指定した秘密鍵を必ず配置してください。

ファイルを保存して閉じます。 IDプロバイダーをテストしてみましょう。

ステップ5— SAML2.0SPデモを使用したIDプロバイダーのテスト

認証タブに移動し、構成済み認証ソースのテストリンクをクリックすると、設定したMySQL認証ソースをテストできます。 すでに構成されている認証ソースのリストが表示されます。

The list of configured authentication sources

example-sql をクリックします。これは、前の手順で構成したプロバイダーです。 ユーザー名とパスワードを入力するためのプロンプトが表示されます。 MySQLユーザーテーブルに挿入した3つのテストユーザーとパスワードの組み合わせのいずれかを入力します。 パスワードuser1passを使用してuser1を試してください。

試行が成功すると、 SAML2.0SPデモの例ページが表示されます。

The successful Demo page

ログインできず、パスワードが正しいことがわかっている場合は、ユーザー作成時のAES_ENCRYPT()機能と、作成時のAES_DECRYPT()機能の両方で同じキーを使用したことを確認してください。ユーザーを検索しました。

SimpleSAMLphp APIドキュメントに従って、SimpleSAMLphpを独自のアプリケーションと統合できるようになりました。

結論

これで、SimpleSAMLphpアプリケーションがUbuntu18.04VPSに適切にインストールおよび構成されました。 SimpleSAMLphpでは、テーマ設定による広範なユーザーインターフェイスのカスタマイズも可能です。 詳細については、テーマドキュメントを参照してください。