Ubuntu16.04でSAML認証用にSimpleSAMLphpをインストールおよび構成する方法
序章
SimpleSAMLphp は、サービスプロバイダー(SP)またはIDプロバイダー(IdP)として SAML2.0をサポートするオープンソースのPHP認証アプリケーションです。
SAML(Security Assertion Markup Language)は、組織とアプリケーション間で認証および承認データを交換するための安全なXMLベースの通信メカニズムです。 これは、Web SSO(シングルサインオン)を実装するためによく使用されます。 これにより、複数の組織間で複数の認証資格情報を維持する必要がなくなります。 簡単に言うと、ユーザー名やパスワードなどの1つのIDを使用して、複数のアプリケーションにアクセスできます。
SimpleSAMLphpのインスタンスは、LDAPやユーザーのデータベースなどのIDプロバイダーである認証ソースに接続します。 リンクされたサービスプロバイダーから利用可能になったリソースへのアクセスを許可する前に、この認証ソースに対してユーザーを認証します。
このチュートリアルでは、SimpleSamplPHPをインストールし、認証ソースとしてMySQLデータベースを使用するように構成します。 ユーザーと暗号化されたパスワードをMySQLデータベースに保存し、それらのユーザーを使用してログインできることをテストします。
前提条件
- Ubuntu16.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu16.04サーバー。これには、sudo非rootユーザーとファイアウォールが含まれます。
- Ubuntu 16.04 にLinux、Apache、MySQL、PHP(LAMPスタック)をインストールする方法に従って、サーバーにインストールされたApache、MySQL、およびPHP。
- サーバーを指すように構成されたドメイン名。 DigitalOcean チュートリアルでホスト名を設定する方法に従って、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。
- を使用してドメイン用に構成された仮想ホスト
ServerName
指令。 Ubuntu 16.04でApache仮想ホストを設定する方法に従って、ドメイン名にApache仮想ホストを設定します。 - Ubuntu 16.04でLet’sEncryptを使用してApacheを保護する方法ガイドに従って、構成したドメインに設定されたLet’sEncrypt証明書。
ステップ1—SimpleSAMLphpのダウンロードとインストール
SimpleSAMLphpのインストールには、いくつかの手順が含まれます。 ソフトウェア自体と、いくつかの追加コンポーネントおよび前提条件をダウンロードする必要があります。 また、仮想ホストの構成にいくつかの変更を加える必要があります。
まだログインしていない場合は、サーバーにログインします。
プロジェクトのWebサイトからSimpleSAMLphpをダウンロードします。 SimpleSAMLphpは、常に最新の安定バージョンのソフトウェアを同じURLにリンクします。 これは、次のように入力することで最新バージョンを取得できることを意味します。
- wget https://simplesamlphp.org/download?latest
これにより、という圧縮ファイルがダウンロードされます download?latest
SimpleSAMLphpが含まれています。 で内容を抽出します tar
指図:
- tar zxf download?latest
ファイルは、というラベルの付いた新しいディレクトリに抽出されます simplesamlphp-1.x.y
、 どこ x.y
現在のバージョン番号です。 使用 ls
ファイルを識別するコマンド:
- ls
ファイル名が表示されます。
Ouptutsimplesamlphp-1.14.14
次に、ディレクトリの内容をにコピーします /var/simplesamlphp
を使用して cp
指図。 必ずバージョン番号をお持ちのバージョンに置き換えてください。
- sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/
The -a
スイッチは、ファイルのアクセス許可がファイルおよびフォルダーと一緒にコピーされることを保証します。 ソースファイルの最後にあるドットは、隠しファイルを含むソースディレクトリ内のすべてのものが宛先ディレクトリにコピーされることを保証します。
注:別の場所にファイルをインストールする必要がある場合は、いくつかのファイルを更新する必要があります。 詳細については、SimpleSAMLphpの公式インストールドキュメントを参照してください。
SimpleSAMLphpに必要な追加のソフトウェアパッケージがいくつかあります。これには、XML、マルチバイト文字列、 curl
、およびLDAP。 また、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に公開するには、ドメインの仮想ホストSSLApache構成ファイルを編集します。
仮想ホスト構成ファイルの名前が your_domain.conf
、Let’s Encryptは、という新しい設定ファイルを作成しました your_domain-le-ssl.conf
ドメインのHTTPSリクエストを処理します。 次のコマンドでSSL構成ファイルを開き、ファイルを編集します。 必ず交換してください your_domain
ファイルの実際の名前:
- sudo nano /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経由でアクセスできるようになります。 これを行うには、構成ファイルに以下を追加します。
...
Alias /simplesaml /var/simplesamlphp/www
<Directory /var/simplesamlphp/www/>
Require all granted
</Directory>
...
ファイルを保存して閉じます。 変更を有効にするには、Apacheを再起動します。
- sudo systemctl restart apache2
Apacheがアプリケーションファイルを提供するように構成されたので、SimpleSAMLphpを構成しましょう。
ステップ3—SimpleSAMLphpを構成する
次に、にあるコアSimpleSAMLphp構成にいくつかの変更を加える必要があります。 /var/simplesamlphp/config/config.php
. エディターでファイルを開きます。
- nano /var/simplesamlphp/config/config.php
を見つけて管理者パスワードを設定します 'auth.adminpassword'
行とデフォルト値の置換 123
より安全なパスワードで。 このパスワードを使用すると、SimpleSAMLphpインストールWebインターフェイスの一部のページにアクセスできます。
. . .
'auth.adminpassword' => 'your_admin_password',
. . .
次に、ランダムに生成された文字列である秘密のソルトを設定します。 SimpleSAMLphpの一部は、このソルトを使用して暗号的に安全なハッシュを作成します。 ソルトがデフォルト値から変更されていない場合、エラーが発生します。
OpenSSLを使用できます rand
シークレットソルト文字列として使用するランダム文字列を生成する関数。 新しい端末を開き、サーバーに再度接続し、次のコマンドを実行してこの文字列を生成します。
- openssl rand -base64 32
The -base64 32
オプションは、32文字の長さのBase64エンコード文字列を保証します。
次に、構成ファイルで、 'secretsalt'
エントリと置換 defaultsecretsalt
生成した文字列を使用して:
. . .
'secretsalt' => 'your_generated_salt',
. . .
次に、技術的な連絡先情報を設定します。 この情報は生成されたメタデータで利用可能になり、SimpleSAMLphpは自動的に生成されたエラーレポートを指定した電子メールアドレスに送信します。 次のセクションを見つけます。
. . .
'technicalcontact_name' => 'Administrator',
'technicalcontact_email' => '[email protected]',
. . .
交換 Administrator
と [email protected]
適切な値で。
次に、使用するタイムゾーンを設定します。 このセクションを見つけます:
. . .
'timezone' => null,
. . .
交換 null
このPHPのタイムゾーンのリストからの優先タイムゾーンを使用します。 値は必ず引用符で囲んでください。
. . .
'timezone' => 'America/New_York',
. . .
ファイルを保存して閉じます。 これで、にアクセスしてブラウザでサイトにアクセスできるようになります。 https://your_domain/simplesaml
. ブラウザに次の画面が表示されます。
PHPインストールがSimpleSAMLphpをスムーズに実行するためのすべての要件を満たしていることを確認するには、構成タブを選択し、管理者としてログインリンクをクリックします。 次に、手順3で構成ファイルに設定した管理者パスワードを使用します。
ログインすると、SimpleSAMLphpで使用される必須およびオプションのPHP拡張機能のリストと、それらのどれがシステムにすでにインストールされているかが表示されます。 セットアップにすべてのPHP拡張機能がインストールされている場合、画面は次のようになります。
不足しているコンポーネントがある場合は、先に進む前に、このチュートリアルを確認し、不足しているコンポーネントをインストールしてください。
SimpleSAMLphpセットアップの健全性チェックというリンクも表示されます。 このリンクをクリックして、セットアップに適用されたチェックのリストを取得し、それらが成功したかどうかを確認します。
SimpleSAMLphpの認証ソースの構成に移りましょう。
ステップ4—認証ソースの構成
SimpleSAMLphpをインストールしてセットアップしたので、ユーザーを認証できるように認証ソースを構成しましょう。 MySQLデータベースを使用して、認証対象のユーザー名とパスワードのリストを保存します。
開始するには、MySQL rootアカウントにログインします。
- mysql -u root -p
MySQLルートアカウントのパスワードの入力を求められます。 続行するためにそれを提供します。
次に、認証ソースとして機能するデータベースを作成します。 それを呼びます auth
. 別の名前を付けてください。
- CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
次に、別のMySQLユーザーを作成して、 auth
データベース。 管理とセキュリティの観点から、1つの機能を持つデータベースとアカウントを作成することをお勧めします。 ユーザーにauthuserという名前を付けます。 次のコマンドを実行して、ユーザーを作成し、パスワードを設定して、ユーザーにアクセスを許可します。 auth
データベース。 ここで、新しいデータベースユーザーに強力なパスワードを入力することを忘れないでください。
- GRANT ALL ON auth.* TO 'authuser'@'localhost' IDENTIFIED BY 'your_mysql_auth_user_password';
次に、 users
テーブル。2つのフィールドで構成されます。 username
と password
. いくつかの追加のセキュリティのために、私たちはを使用するつもりです MySQL AES_ENCRYPT()
パスワードをプレーンテキストで保存しないように、パスワード文字列を暗号化する関数。 この関数は文字列を暗号化し、バイナリ文字列を返します。
- CREATE TABLE auth.users(username VARCHAR(30), password VARBINARY(30));
次に、新しく作成したテーブルに3人のユーザーを挿入します。 ここで使用します AES_ENCRYPT()
パスワードフィールドの値を暗号化する関数。 暗号化キーとして使用される文字列を提供する必要があります。 複雑である限り、これを独自の文字列に置き換えるようにしてください。任意の文字列を使用できます。
- INSERT INTO auth.users(username, password) VALUES
- ('user1', AES_ENCRYPT('user1pass','your_secret_key')),
- ('user2', AES_ENCRYPT('user2pass','your_secret_key')),
- ('user3', AES_ENCRYPT('user3pass','your_secret_key'));
各ユーザーに同じキーを使用し、後で追加のユーザーを作成するために再び使用できるように、必ずキーを覚えておいてください。 また、SimpleSAMLphp構成でこの秘密鍵を使用して、パスワードを復号化し、ユーザーが入力したパスワードと比較できるようにします。
MySQLの現在のインスタンスが、最近行った特権の変更を認識できるように、特権をフラッシュする必要があります。
- FLUSH PRIVILEGES;
次のように入力して、MySQLプロンプトを終了します。
- exit
SimpleSAMLphpでIDプロバイダー機能を有効にするには、 /var/simplesamlphp/config/config.php
ファイル。 利用可能なオプションはいくつかありますが、このガイドはSAML 2.0のサポートに焦点を当てているため、 enable.saml20-idp
オプション。 これを行うには、 /var/simplesamlphp/config/config.php
SAML2.0サポートを有効にします。
- nano /var/simplesamlphp/config/config.php
ファイルの次のセクションを見つけます。
...
'enable.saml20-idp' => false,
...
交換 false
と true
. 次に、ファイルを保存してエディターを終了します。
IDプロバイダー機能が有効になったので、使用する認証モジュールを指定する必要があります。 MySQLデータベースにusersテーブルがあるため、SQL認証モジュールを使用します。 authsources構成ファイルを開きます。
- nano /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()
クエリでパスワードを暗号化するために使用したのと同じキーを機能させます。
ファイルのセクションを変更して、データベース接続の詳細とクエリを指定します。
...
'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では、テーマ設定による広範なユーザーインターフェイスのカスタマイズも可能です。 詳細については、テーマドキュメントを参照してください。