Ubuntu18.04でSAML認証用にSimpleSAMLphpをインストールおよび構成する方法
序章
SimpleSAMLphp は、サービスプロバイダー(SP)またはIDプロバイダー(IdP)として SAML2.0をサポートするオープンソースのPHP認証アプリケーションです。
SAML(Security Assertion Markup Language)は、組織とアプリケーション間で認証および承認データを交換するための安全なXMLベースの通信メカニズムです。 これは、Web SSO(シングルサインオン)を実装するためによく使用されます。 これにより、複数の組織間で複数の認証資格情報を維持する必要がなくなります。 簡単に言うと、ユーザー名やパスワードなどの1つのIDを使用して、複数のアプリケーションにアクセスできます。
SimpleSAMLphpのインスタンスは、LDAPやユーザーのデータベースなどのIDプロバイダーである認証ソースに接続します。 リンクされたサービスプロバイダーから利用可能になったリソースへのアクセスを許可する前に、この認証ソースに対してユーザーを認証します。
このチュートリアルでは、SimpleSamlPHPをインストールし、認証ソースとしてMySQLデータベースを使用するように構成します。 ユーザーと暗号化されたパスワードをMySQLデータベースに保存し、それらのユーザーを使用してログインできることをテストします。
前提条件
- Ubuntu18.04初期サーバーセットアップガイドに従ってセットアップされた1つのUbuntu18.04サーバー(sudo非rootユーザーとファイアウォールを含む)。
- Ubuntu 18.04 にLinux、Apache、MySQL、PHP(LAMPスタック)をインストールする方法に従って、サーバーにインストールされたApache、MySQL、およびPHP。
- サーバーを指すように構成されたドメイン名。 共通ドメインレジストラからDigitalOceanネームサーバーをポイントする方法チュートリアルに従って、ドメインをDigitalOceanドロップレットにポイントする方法を学ぶことができます。
ServerName
ディレクティブを使用してドメイン用に構成された仮想ホスト。 Ubuntu 18.04でApache仮想ホストを設定する方法に従って、ドメイン名にApache仮想ホストを設定します。- Ubuntu 18.04でLet’sEncryptを使用してApacheを保護する方法ガイドに従って、構成したドメインに設定されたLet’sEncrypt証明書。
ステップ1—SimpleSAMLphpのダウンロードとインストール
SimpleSAMLphpのインストールには、いくつかの手順が含まれます。 ソフトウェア自体と、いくつかの追加コンポーネントおよび前提条件をダウンロードする必要があります。 また、仮想ホストの構成にいくつかの変更を加える必要があります。
まだログインしていない場合は、サーバーにログインします。
プロジェクトのWebサイトからSimpleSAMLphpをダウンロードします。 SimpleSAMLphpは、常に最新の安定バージョンのソフトウェアを同じURLにリンクします。 これは、次のように入力することで最新バージョンを取得できることを意味します。
- wget https://simplesamlphp.org/download?latest
これにより、SimpleSAMLphpを含むdownload?latest
という圧縮ファイルがダウンロードされます。 tar
コマンドを使用してコンテンツを抽出します。
- tar zxf download?latest
ファイルはsimplesamlphp-1.x.y
というラベルの付いた新しいディレクトリに抽出されます。ここで、x.y
は現在のバージョン番号です。 ls
コマンドを使用して、ファイルを識別します。
- ls
ファイル名が表示されます。
Ouptutsimplesamlphp-1.18.5
次に、cp
コマンドを使用して、ディレクトリの内容を/var/simplesamlphp
にコピーします。 必ずバージョン番号をお持ちのバージョンに置き換えてください。
- sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/
-a
スイッチは、ファイルのアクセス許可がファイルおよびフォルダーと一緒にコピーされることを保証します。 ソースファイルの最後にあるドットは、隠しファイルを含むソースディレクトリ内のすべてのものが宛先ディレクトリにコピーされることを保証します。
注:別の場所にファイルをインストールする必要がある場合は、いくつかのファイルを更新する必要があります。 詳細については、SimpleSAMLphpの公式インストールドキュメントを参照してください。
SimpleSAMLphpに必要な追加のソフトウェアパッケージがいくつかあります。これには、XML、マルチバイト文字列、curl
、およびLDAPを処理するためのPHP拡張機能が含まれます。 また、memcachedも必要です。 パッケージマネージャーを使用してこれらをインストールします。
まず、パッケージリストを更新します。
- sudo apt update
次に、パッケージをインストールします。
- sudo apt 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は、ドメインのHTTPS要求を処理するyour_domain-le-ssl.conf
という名前の新しい構成ファイルを作成しました。 次のコマンドで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>
ここでの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経由でアクセスできるようになります。 これを行うには、構成ファイルに以下を追加します。
...
Alias /simplesaml /var/simplesamlphp/www
<Directory /var/simplesamlphp/www/>
Require all granted
</Directory>
...
ファイルを保存して閉じます。 変更を有効にするには、Apacheを再起動します。
- sudo systemctl restart apache2
Apacheがアプリケーションファイルを提供するように構成されたので、SimpleSAMLphpを構成しましょう。
ステップ3—SimpleSAMLphpを構成する
次に、/var/simplesamlphp/config/config.php
にあるコアSimpleSAMLphp構成にいくつかの変更を加える必要があります。 エディターでファイルを開きます。
- nano /var/simplesamlphp/config/config.php
'auth.adminpassword'
行を見つけ、デフォルト値の123
をより安全なパスワードに置き換えて、管理者パスワードを設定します。 このパスワードを使用すると、SimpleSAMLphpインストールWebインターフェイスの一部のページにアクセスできます。
. . .
'auth.adminpassword' => 'your_admin_password',
. . .
次に、ランダムに生成された文字列である秘密のソルトを設定します。 SimpleSAMLphpの一部は、このソルトを使用して暗号的に安全なハッシュを作成します。 ソルトがデフォルト値から変更されていない場合、エラーが発生します。
OpenSSL rand
関数を使用して、秘密のソルト文字列として使用するランダムな文字列を生成できます。 新しい端末を開き、サーバーに再度接続し、次のコマンドを実行してこの文字列を生成します。
- openssl rand -base64 32
-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拡張機能のリストが表示されます。 predis/predis
を除くすべての拡張機能がインストールされていることを確認してください。
不足している必要なコンポーネントがある場合は、先に進む前に、このチュートリアルを確認し、不足しているコンポーネントをインストールしてください。
SimpleSAMLphpセットアップの健全性チェックというリンクも表示されます。 このリンクをクリックして、セットアップに適用されたチェックのリストを取得し、それらが成功したかどうかを確認します。
SimpleSAMLphpの認証ソースの構成に移りましょう。
ステップ4—認証ソースの構成
SimpleSAMLphpをインストールしてセットアップしたので、ユーザーを認証できるように認証ソースを構成しましょう。 MySQLデータベースを使用して、認証対象のユーザー名とパスワードのリストを保存します。
開始するには、MySQL rootアカウントにログインします。
- mysql -u root -p
MySQLルートアカウントのパスワードの入力を求められます。 続行するためにそれを提供します。
次に、認証ソースとして機能するデータベースを作成します。 これをauth
と呼びます。 別の名前を付けてください。
- CREATE DATABASE auth DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
次に、auth
データベースを排他的に操作する別のMySQLユーザーを作成しましょう。 管理とセキュリティの観点から、1つの機能を持つデータベースとアカウントを作成することをお勧めします。 ユーザーにauthuserという名前を付けます。 次のコマンドを実行してユーザーを作成し、パスワードを設定して、auth
データベースへのアクセスを許可します。 ここで、新しいデータベースユーザーに強力なパスワードを入力することを忘れないでください。
- GRANT ALL ON auth.* TO 'authuser'@'localhost' IDENTIFIED BY 'your_mysql_auth_user_password';
次に、users
テーブルを作成します。このテーブルは、username
とpassword
の2つのフィールドで構成されます。 セキュリティを強化するために、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
ファイルのこのセクションを見つけて、false
をtrue
に置き換えます。 :
...
'enable.saml20-idp' => 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つのテストユーザーとパスワードの組み合わせのいずれかを入力します。 パスワードuser1pass
を使用してuser1
を試してください。
試行が成功すると、 SAML2.0SPデモの例ページが表示されます。
ログインできず、パスワードが正しいことがわかっている場合は、ユーザー作成時のAES_ENCRYPT()
機能と、作成時のAES_DECRYPT()
機能の両方で同じキーを使用したことを確認してください。ユーザーを検索しました。
SimpleSAMLphp APIドキュメントに従って、SimpleSAMLphpを独自のアプリケーションと統合できるようになりました。
結論
これで、SimpleSAMLphpアプリケーションがUbuntu18.04VPSに適切にインストールおよび構成されました。 SimpleSAMLphpでは、テーマ設定による広範なユーザーインターフェイスのカスタマイズも可能です。 詳細については、テーマドキュメントを参照してください。