前書き
SimpleSAMPLphpは、http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-tech-overviewのサポートを提供するオープンソースのPHP認証アプリケーションです。 -2.0.html [SAML 2.0]サービスプロバイダー(SP)またはIDプロバイダー(IdP)として。
_SAML(セキュリティアサーションマークアップ言語)_は、組織とアプリケーション間で認証および承認データを交換するためのXMLベースの安全な通信メカニズムです。 Web SSO(シングルサインオン)の実装によく使用されます。 これにより、複数の組織にわたって複数の認証資格情報を維持する必要がなくなります。 簡単に言えば、ユーザー名とパスワードなどの1つのIDを使用して、複数のアプリケーションにアクセスできます。
SimpleSAMLphpのインスタンスは、LDAPまたはユーザーのデータベースなどのIDプロバイダーである_authentication source_に接続します。 リンクされたサービスプロバイダーから利用できるリソースへのアクセスを許可する前に、この認証ソースに対してユーザーを認証します。
このチュートリアルでは、SimpleSamplPHPをインストールし、認証ソースとしてMySQLデータベースを使用するように設定します。 ユーザーと暗号化されたパスワードをMySQLデータベースに保存し、それらのユーザーを使用してログインできることをテストします。
前提条件
-
https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [Ubuntu 16.04初期サーバーセットアップガイド]に従って、1つのUbuntu 16.04サーバーをセットアップし、sudo non- rootユーザーとファイアウォール。
-
https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-16-に従ってサーバーにインストールされたApache、MySQL、およびPHP 04 [Linux、Apache、MySQL、PHP(LAMPスタック)をUbuntu 16.04にインストールする方法]。
-
サーバーを指すように構成されたドメイン名。 https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean [設定方法ホスト名とDigitalOcean]チュートリアル。
-
`+ ServerName +`ディレクティブを使用してドメイン用に設定された仮想ホスト。 Ubuntu 16.04でApache仮想ホストを設定する方法に従って設定しますドメイン名に1つ。
-
https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu- 16-04 [Ubuntu 16.04でLet’s EncryptでApacheを保護する方法]ガイド。
ステップ1-SimpleSAMLphpのダウンロードとインストール
SimpleSAMLphpのインストールには、いくつかの手順が含まれます。 ソフトウェア自体といくつかの追加コンポーネントと前提条件をダウンロードする必要があります。 また、仮想ホスト構成にいくつかの変更を加える必要があります。
まだログインしていない場合は、サーバーにログインします。
プロジェクトのWebサイトからSimpleSAMLphpをダウンロードします。 SimpleSAMLphpは、常にソフトウェアの最新の安定バージョンを同じURLにリンクします。 これは、次のように入力して最新バージョンを取得できることを意味します。
wget https://simplesamlphp.org/download?latest
これにより、SimpleSAMLphpを含む「+ download?latest 」という圧縮ファイルがダウンロードされます。 ` tar +`コマンドでコンテンツを抽出します:
tar zxf download?latest
ファイルは、「+ simplesamlphp-1。」というラベルが付いた新しいディレクトリに抽出されます。「+」は現在のバージョン番号です。 `+ ls +`コマンドを使用してファイルを特定します:
ls simplesamplphp-1*
ファイル名が表示されます:
Ouptutsimplesamlphp-
次に、 `+ cp `コマンドを使用して、ディレクトリの内容を ` / var / simplesamlphp +`にコピーします。 必ずバージョン番号をご使用のバージョンに置き換えてください。
sudo cp -a simplesamlphp-/. /var/simplesamlphp/
`+ -a +`スイッチは、ファイルのパーミッションがファイルとフォルダーとともにコピーされることを保証します。 ソースファイルの最後にあるドットは、隠しファイルを含むソースディレクトリ内のすべてが宛先ディレクトリにコピーされることを保証します。
SimpleSAMLphpには、XML、マルチバイト文字列、 + curl +
、LDAPで動作するPHP拡張機能など、いくつかの追加のソフトウェアパッケージが必要です。 また、https://memcached.org/ [memcached]も必要です。 パッケージマネージャーを使用してこれらをインストールします。
まず、パッケージリストを更新します。
sudo apt-get update
次に、パッケージをインストールします。
sudo apt-get install php-xml php-mbstring php-curl php-memcache php-ldap memcached
インストールが完了したら、Apacheを再起動して新しいPHP拡張機能を有効にします。
sudo systemctl restart apache2
SimpleSAMLphpがインストールされたので、ファイルを提供するようにApacheを構成しましょう。
ステップ2-SimpleSAMLphpを提供するためのApacheの構成
すでにドメインを構成し、このサーバーを指定し、Let’s EncryptでApacheを保護することでHTTPSで動作するように仮想ホストを設定しました。 それを使用してSimpleSAMLphpを提供します。
Webに表示する必要があるSimpleSAMLphpディレクトリは、 `+ / var / simplesamlphp / www +`のみです。 Webに公開するには、ドメインの仮想ホストSSL Apache構成ファイルを編集します。
仮想ホスト設定ファイルの名前が「+ .conf 」の場合、Let’s EncryptはドメインのHTTPSリクエストを処理する「 -le-ssl.conf 」という新しい設定ファイルを作成します。 次のコマンドでSSL構成ファイルを開き、ファイルを編集します。 必ず `+`を実際のファイル名に置き換えてください:
sudo nano /etc/apache2/sites-available/-le-ssl.conf
ファイルは次のようになりますが、実際のファイルにはより説明的なコメントが含まれている場合があります。
your_domain-le-ssl.conf ’> / etc / apache2 / sites-available / -le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerName
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /etc/letsencrypt/live//fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live//privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
ここでの `+ ServerName `ディレクティブは、この仮想ホスト定義に一致するベースドメインを定義します。 これは、*前提条件*セクションでSSL証明書を設定したドメイン名である必要があります。 ` https:/// simplesaml / * `に一致するすべてのURLのSimpleSAMLphpに制御を与える ` Alias +`ディレクティブを追加しましょう。設定ファイルに次の行を追加します。
your_domain-le-ssl.conf ’> / etc / apache2 / sites-available / -le-ssl.conf
...
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
...
これは、「+ / simplesaml / * 」に一致するすべてのURLがSimpleSAMLphpコントロールを提供する「 / var / simplesamlphp / www +」ディレクトリに送られることを意味します。
次に、 `+ Require all granted `アクセス制御を指定して、 ` / var / simplesamlphp / www +`ディレクトリへのアクセスを許可します。 これにより、SimpleSAMLphpサービスがWeb経由でアクセス可能になります。 設定ファイルに次を追加して、それを行います。
your_domain-le-ssl.conf ’> / etc / apache2 / sites-available / -le-ssl.conf
...
Alias /simplesaml /var/simplesamlphp/www
...
ファイルを保存して閉じます。 変更を有効にするためにApacheを再起動します。
sudo systemctl restart apache2
Apacheがアプリケーションファイルを提供するように構成されたので、SimpleSAMLphpを構成しましょう。
ステップ3-SimpleSAMLphpの構成
次に、 `+ / var / simplesamlphp / config / config.php +`にあるコアSimpleSAMLphp設定にいくつかの変更を加える必要があります。 エディターでファイルを開きます。
nano /var/simplesamlphp/config/config.php
`+ 'auth.adminpassword' `行を見つけて、デフォルト値の `+`をより安全なパスワードに置き換えて、管理者パスワードを設定します。 このパスワードにより、SimpleSAMLphpインストールWebインターフェースのいくつかのページにアクセスできます。
/var/simplesamlphp/config/config.php
. . .
'auth.adminpassword' => '',
. . .
次に、秘密のソルトを設定します。これは、ランダムに生成された文字列でなければなりません。 SimpleSAMLphpの一部では、このソルトを使用して暗号的に安全なハッシュを作成します。 塩がデフォルト値から変更されていない場合、エラーが発生します。
OpenSSLの `+ rand +`関数を使用して、ランダムな文字列を生成し、秘密のソルト文字列として使用できます。 新しいターミナルを開き、サーバーに再度接続し、次のコマンドを実行してこの文字列を生成します。
openssl rand -base64 32
`+ -base64 32 +`オプションは、32文字のBase64エンコード文字列を保証します。
次に、設定ファイルで、「+ 'secretsalt' 」エントリを見つけ、「+」を生成した文字列に置き換えます。
/var/simplesamlphp/config/config.php
. . .
'secretsalt' => '',
. . .
次に、技術連絡先情報を設定します。 この情報は生成されたメタデータで利用可能になり、SimpleSAMLphpは指定された電子メールアドレスに自動生成されたエラーレポートを送信します。 次のセクションを見つけます。
/var/simplesamlphp/config/config.php
. . .
'technicalcontact_name' => '',
'technicalcontact_email' => '',
. . .
「」と「」を適切な値に置き換えます。
次に、使用するタイムゾーンを設定します。 このセクションを見つけます。
/var/simplesamlphp/config/config.php
. . .
'timezone' => ,
. . .
`++`をhttp://php.net/manual/en/timezones.php[PHPのタイムゾーンのこのリスト]の優先タイムゾーンに置き換えます。 値は必ず引用符で囲んでください。
/var/simplesamlphp/config/config.php
. . .
'timezone' => ,
. . .
ファイルを保存して閉じます。 これで、 `+ https:/// simplesaml +`にアクセスして、ブラウザーでサイトにアクセスできるはずです。 ブラウザに次の画面が表示されます。
image:https://assets.digitalocean.com/articles/simplesamplphp_1604/W6KphyN.png [simplesaml web interface]
PHPインストールがSimpleSAMLphpがスムーズに実行するためのすべての要件を満たしていることを確認するには、[構成]タブを選択し、[管理者としてログイン]リンクをクリックします。 次に、手順3で構成ファイルに設定した管理者パスワードを使用します。
ログインすると、SimpleSAMLphpで使用される必須およびオプションのPHP拡張機能と、システムに既にインストールされている拡張機能のリストが表示されます。 セットアップにすべてのPHP拡張機能がインストールされている場合、画面は次のようになります。
image:https://assets.digitalocean.com/articles/simplesamplphp_1604/I8iLFjy.png [インストールされているすべての拡張機能]
不足しているコンポーネントがある場合は、先に進む前にこのチュートリアルを確認し、不足しているコンポーネントをインストールしてください。
また、* SimpleSAMLphpセットアップの正常性チェック*というリンクが表示されます。 このリンクをクリックして、セットアップに適用されるチェックのリストを取得し、成功したかどうかを確認します。
次に、SimpleSAMLphpの認証ソースを構成します。
ステップ4-認証ソースの構成
SimpleSAMLphpをインストールしてセットアップしたので、ユーザーを認証できるように認証ソースを構成しましょう。 MySQLデータベースを使用して、認証対象のユーザー名とパスワードのリストを保存します。
開始するには、MySQL * root *アカウントにログインします。
mysql -u root -p
MySQLルートアカウントパスワードの入力を求められます。 それを提供して続行します。
次に、認証ソースとして機能するデータベースを作成します。 これを「+ auth +」と呼びます。 別の名前を自由に付けてください:
CREATE DATABASE DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
それでは、「+ auth 」データベースのみを操作するための別のMySQLユーザーを作成しましょう。 管理とセキュリティの観点から、1機能のデータベースとアカウントを作成することをお勧めします。 ユーザーに* authuser *という名前を付けます。 次のコマンドを実行してユーザーを作成し、パスワードを設定して、 ` auth +`データベースへのアクセスを許可します。 ここで、新しいデータベースユーザーの強力なパスワードを忘れずに入力してください。
GRANT ALL ON .* TO ''@'localhost' IDENTIFIED BY '';
次に、「+ username」と「+ password _」の2つのフィールドで構成される「+ user use」テーブルを作成します。 セキュリティを強化するために、 `+ MySQL AES_ENCRYPT()+`関数を使用してパスワード文字列を暗号化し、パスワードをプレーンテキストで保存しないようにします。 この関数は、文字列を暗号化し、バイナリ文字列を返します。
CREATE TABLE auth.users(username VARCHAR(30), password VARBINARY(30));
次に、新しく作成したテーブルに3人のユーザーを挿入します。 ここで、 `+ AES_ENCRYPT()+`関数を使用してパスワードフィールドの値を暗号化します。 暗号化キーとして使用される文字列を提供する必要があります。 これを独自の文字列に置き換えてください。複雑なものであれば、任意の文字列を使用できます。
INSERT INTO auth.users(username, password) VALUES
('', AES_ENCRYPT('','')),
('', AES_ENCRYPT('','')),
('', AES_ENCRYPT('',''));
各ユーザーに同じキーを使用し、そのキーを忘れずに使用して、将来追加のユーザーを作成できるようにしてください。 また、SimpleSAMLphp構成でこの秘密キーを使用して、パスワードを解読して、ユーザーが入力したパスワードと比較できるようにします。
MySQLの現在のインスタンスが、最近行った特権の変更を認識できるように、特権をフラッシュする必要があります。
FLUSH PRIVILEGES;
次のように入力して、MySQLプロンプトを終了します。
exit
SimpleSAMLphpでIDプロバイダー機能を有効にするには、 `+ / var / simplesamlphp / config / config.php `ファイルを編集する必要があります。 使用可能なオプションはいくつかありますが、このガイドではSAML 2.0サポートに焦点を当てているため、 ` enable.saml20-idp `オプションを有効にします。 それを行うには、 ` / var / simplesamlphp / config / config.php +`を開き、SAML 2.0サポートを有効にします。
nano /var/simplesamlphp/config/config.php
ファイルのこのセクションを見つけます。
/var/simplesamlphp/config/config.php
...
'enable.saml20-idp' => ,
...
+ false`を
+ true`に置き換えます。 次に、ファイルを保存してエディターを終了します。
IDプロバイダーの機能を有効にしたので、使用する認証モジュールを指定する必要があります。 MySQLデータベースにユーザーテーブルがあるため、SQL認証モジュールを使用します。 authsources構成ファイルを開きます。
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' => '',
'username' => '',
'password' => '',
'query' => 'SELECT FROM users WHERE = :username AND password = :password',
),
...
指定した秘密鍵を「++」の代わりに配置してください。
ファイルを保存して閉じます。 IDプロバイダーをテストしましょう。
ステップ5-SAML 2.0 SPデモを使用したIDプロバイダーのテスト
-
Authentication タブに移動し、 Test configured authentication sources *リンクをクリックして、セットアップしたばかりのMySQL認証ソースをテストできます。 構成済みの認証ソースのリストが表示されます。
image:https://assets.digitalocean.com/articles/simplesamplphp_1604/S5oJ8tr.png [設定された認証ソースのリスト]
これは前の手順で構成したプロバイダーであるため、[* example-sql *]をクリックします。 ユーザー名とパスワードの入力を求めるプロンプトが表示されます。 MySQLユーザーテーブルに挿入した3つのテストユーザーとパスワードの組み合わせのいずれかを入力します。 パスワード「+ user1pass 」で「 user1 +」を試してください。
成功すると、* SAML 2.0 SP Demo Example *ページが表示されます。
image:https://assets.digitalocean.com/articles/simplesamplphp_1604/fjs7Kv1.png [成功したデモページ]
ログインできず、パスワードが正しいことがわかっている場合は、ユーザーを作成したときに `+ AES_ENCRYPT()`関数と ` AES_DECRYPT()+`関数の両方で同じキーを使用したことを確認してくださいユーザーを検索したとき。
SimpleSAMLphp API documentationに従って、SimpleSAMLphpを独自のアプリケーションと統合できるようになりました。
結論
これで、SimpleSAMLphpアプリケーションがUbuntu 16.04 VPSに適切にインストールおよび構成されました。 他のIDおよびサービスプロバイダーを追加する際に、さらに多くの方法を検討できます。 SimpleSAMLphpでは、テーマを介した広範なユーザーインターフェイスのカスタマイズも可能です。 詳細については、https://simplesamlphp.org/docs/1.5/simplesamlphp-theming [theming docs]を参照してください。