🚪

SimpleSAMLphpを利用してSAML認証をセットアップする手順 #1

2022/06/18に公開

この記事では、SimpleSAMLphpを利用してSAML認証をセットアップする手順について紹介します。

はじめに

Webでよく使われる認証の仕組みに SAMLOpenID Connect というものがありまして、これらを使ってシングルサインオンのWebアプリケーションを作ることができます。

そして、こういったWebアプリケーションの開発ではテスト用の認証サーバがあると便利です。

今回は SimpleSAMLphp を利用してSAML認証をセットアップしてみようと思います。

全体像

認証サービスを提供するサーバを「アイデンティティプロバイダ」、アプリケーションを提供するサーバを「サービスプロバイダ」と呼びます。

このセットアップはプライベートネットワークで行います。接続関係は下図のような感じですね。

大まかな処理の流れとしては

  1. PCからSPのサービスへアクセスする
  2. IdPへリダイレクトされる
  3. IdPで認証をパスする
  4. SPのサービスが使えるようになる

といった流れを考えていまして、これができるように進めていきます。

セットアップ

事前にIdPサーバとSPサーバをUbuntu 20.04 Serverで用意しておきます。

IdPのホスト名は idp に、SPのホスト名は sp に設定しました。ちなみにSimpleSAMLphpは、IdPとしてもSPとしても使うことができるので、途中まで作業は共通になります。

それでは作業を見ていきましょう。

IdPとSPで共通の作業

公式ドキュメント SimpleSAMLphp Installation and Configuration に沿って作業します。

インストール

まず、前提で必要になるパッケージをインストールします。

sudo apt install apache2 php
sudo apt install php-intl php-json php-xml php-mbstring php-curl

それから、SimpleSAMLphpの圧縮ファイルをダウンロードして適当な場所に展開します。

コマンドとしては次のような感じです。

wget https://github.com/simplesamlphp/simplesamlphp/releases/download/v1.19.5/simplesamlphp-1.19.5.tar.gz
sudo mv simplesamlphp-1.19.5.tar.gz /var/www/
cd /var/wwww/
sudo tar xzf simplesamlphp-1.19.5.tar.gz
sudo mv simplesamlphp-1.19.5 simplesamlphp

続いて、SimpleSAMLphpのWebインターフェースにアクセスできるように設定していきます。

avahi-daemon

セットアップをプライベートネットワークで行う関係上、このままではIdPやSPのサーバに名前でアクセスできません。

名前でアクセスできるように avahi-daemon をインストールします。

sudo apt install avahi-daemon

これでPCから idp.localsp.local といった名前でアクセスできるようになりました。

ターミナルで ping idp.localping sp.local を実行し、応答を見てみると良いでしょう。

apache2のsslモジュール有効化

apache2のsslモジュールを有効化し、さらに対応する設定ファイルも有効化します。

sudo a2enmod ssl
sudo a2ensite default-ssl.conf

/etc/apache2/sites-enabled/default-ssl.conf に書いてありますけれど、秘密鍵は /etc/ssl/private/ssl-cert-snakeoil.key を、証明書は /etc/ssl/certs/ssl-cert-snakeoil.pem を参照するようになっています。

確認すると仮のファイルが既にありますので、ここではそれを使うことにします。

apache2の設定ファイルを編集

/etc/apache2/sites-enabled/default-ssl.conf に次の設定を追加します。

apacheconf
 <IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        中略
+       SetEnv SIMPLESAMLPHP_CONFIG_DIR /var/www/simplesamlphp/config
+       Alias /simplesaml /var/www/simplesamlphp/www
+       <Directory /var/www/simplesamlphp/www>
+           Require all granted
+       </Directory>
    </VirtualHost>
</IfModule>

SimpleSAMLphpの設定ファイルを編集

SimpleSAMLphpインストールディレクトリの config/config.php を編集します。

変更内容は次のような感じです。

config/config.php
+   'timezone' => 'Asia/Tokyo',
-   'timezone' => null,

+   'secretsalt' => 'secretsalt',
-   'secretsalt' => 'defaultsecretsalt',

+   'auth.adminpassword' => 'password',
-   'auth.adminpassword' => '123',

+   'language.default' => 'ja',
-   'language.default' => 'en',

IdPとSPで異なる作業

ここはIdPとSPで作業内容が異なるので注意して作業しましょう。

IdPの設定

IdPとして構成するため次のように設定します。

config/config.php
+   'baseurlpath' => 'https://idp.local/simplesaml/',
-   'baseurlpath' => 'simplesaml/',

+   'enable.saml20-idp' => true,
-   'enable.saml20-idp' => false,

+       'exampleauth' => true,
-       'exampleauth' => false,

SPの設定

SPも同じく、SPとして構成するため次のように設定します。

config/config.php
+   'baseurlpath' => 'https://sp.local/simplesaml/',
-   'baseurlpath' => 'simplesaml/',

セットアップの終わりに

両方のサーバとも、最後に忘れずapache2を再起動しておきます。

sudo systemctl restart apache2.service

動作確認

ブラウザで https://idp.local/simplesaml/https://sp.local/simplesaml/ にアクセスしてみましょう。

次のような画面が表示されたら成功です。

SimpleSAMLphp設定ページ【ようこそ】
SimpleSAMLphp設定ページ【ようこそ】

最初にアクセスした際、ブラウザで「この接続ではプライバシーが保護されません」と警告されるかも知れません。

この場合、表示された画面の【詳細設定】から【idp.localにアクセスする(安全ではありません)】のように進めば良いです。

IdPの動作確認

IdPに関しては【設定】タブで次のように SAML 2.0 IdP に緑のチェックが入っているのが見て取れると思います。

IdPのSimpleSAMLphp設定ページ【設定】
IdPのSimpleSAMLphp設定ページ【設定】

ユーザの作成

最後に、IdPでテスト用のユーザを作成しておきましょう。

ユーザの作成と言っても難しいことはなくて、 config/authsources.php で次のコメント箇所をコメント解除するだけです。

config/authsources.php
-   /*
    'example-userpass' => [
        'exampleauth:UserPass',

        // Give the user an option to save their username for future login attempts
        // And when enabled, what should the default be, to save the username or not
        //'remember.username.enabled' => false,
        //'remember.username.checked' => false,

        'student:studentpass' => [
            'uid' => ['test'],
            'eduPersonAffiliation' => ['member', 'student'],
        ],
        'employee:employeepass' => [
            'uid' => ['employee'],
            'eduPersonAffiliation' => ['member', 'employee'],
        ],
    ],
-   */

ユーザ名「student」でパスワード「studentpass」のアカウントと、ユーザ名「employee」でパスワード「employeepass」のアカウントが有効になります。

おわりに

少し長くなってしまったので、続きは次回に書きます。

次回はIdPとSPの間で信頼関係を結ぶための作業を行い、さらにSPで認証できることを確かめます。

SimpleSAMLphpを利用してSAML認証をセットアップする手順について紹介しました。どなたかのお役に立てば幸いです。

Discussion