序章

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

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

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

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

前提条件

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

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

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

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

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

これにより、という圧縮ファイルがダウンロードされます download?latest SimpleSAMLphpが含まれています。 で内容を抽出します tar 指図:

  1. tar zxf download?latest

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

  1. ls

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

Ouptut
simplesamlphp-1.14.14

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

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

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

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

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

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

  1. sudo apt-get update

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

  1. sudo apt-get 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は、という新しい設定ファイルを作成しました your_domain-le-ssl.conf ドメインのHTTPSリクエストを処理します。 次のコマンドで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>

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

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

  Alias /simplesaml /var/simplesamlphp/www

...

これは、すべてのURLが一致することを意味します domain_name/simplesaml/* に向けられます /var/simplesamlphp/www SimpleSAMLphpコントロールを提供するディレクトリ。

次に、へのアクセスを許可します /var/simplesamlphp/www ディレクトリを指定して Require all granted そのためのアクセス制御。 これにより、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を構成する

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

  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

The -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. ブラウザに次の画面が表示されます。

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

ログインすると、SimpleSAMLphpで使用される必須およびオプションのPHP拡張機能のリストと、それらのどれがシステムにすでにインストールされているかが表示されます。 セットアップにすべてのPHP拡張機能がインストールされている場合、画面は次のようになります。

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

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;

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

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

次に、 users テーブル。2つのフィールドで構成されます。 usernamepassword. いくつかの追加のセキュリティのために、私たちはを使用するつもりです 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.phpSAML2.0サポートを有効にします。

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

ファイルの次のセクションを見つけます。

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

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

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認証ソースをテストできます。 すでに構成されている認証ソースのリストが表示されます。

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

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

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

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

結論

これで、SimpleSAMLphpアプリケーションがUbuntu16.04VPSに適切にインストールおよび構成されました。 他のIDおよびサービスプロバイダーを追加することで、より多くの手段を探索できます。 SimpleSAMLphpでは、テーマ設定による広範なユーザーインターフェイスのカスタマイズも可能です。 詳細については、テーマドキュメントを参照してください。