🦌

App ServiceでSimpleSAMLphpを構築する

2024/12/12に公開

はじめに

本記事では、AzureのPaaSサービスであるAzure App Serviceを利用して、SimpleSAMLphpを構築する手順を解説します。
なお、本記事ではSimpleSAMLphpをテストや検証目的での利用を想定しており、本番環境での使用は想定していませんのでご注意ください。

SimpleSAMLphp

SimpleSAMLphpは、PHP言語で開発された認証処理用のアプリケーションです。
本記事では、SAML認証におけるIdP(Identity Provider)側の設定方法について説明します。
SAMLの詳細な説明は本記事では割愛しますが、これはSSO(Single Sign-On)の実現方法の一つです。SSOにより、ユーザーは一度の認証で複数のアプリケーションやサービスにアクセスできるようになります。
https://simplesamlphp.org/

システム構成

構築手順

App Serviceの構築

ここでは詳細なApp Serviceの構築手順は割愛します。
ランタイム スタックがPHPであれば問題ないと思います。
App ServiceはGitHubと連携することで、CI/CDを活用した簡単なデプロイが可能です。
本記事ではこのデプロイ方法を採用します。

SimpleSAMLphpの構築

Github上にSimpleSAMLphp用のリポジトリを作成します。
リポジトリ作成後、「デプロイ」→「デプロイ センター」→「設定」と進み、ソースとしてGitHubを選択します。
その後、作成したリポジトリとブランチを選択してください。
次に、SimpleSAMLphpの最新バージョンをダウンロードします。
公式サイトから直接ダウンロードするか、以下のコマンドを使用してGitHubからクローンすることができます。

git clone git@github.com:simplesamlphp/simplesamlphp.git

認証に必要な証明書を作成する必要があります。以下のコマンドを実行して、自己署名証明書を生成します。

cd simplesamlphp/cert
openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out server.crt -keyout server.pem -subj "/CN=idp.local"

Nginxの設定

Simple SAML phpのドキュメントに従って、以下のように設定をします。

server {
    #proxy_cache cache;
	  #proxy_cache_valid 200 1s;
    listen 8080;
    listen [::]:8080;
    root /home/site/wwwroot;
    index  index.php index.html index.htm;
    server_name  example.com www.example.com;
    port_in_redirect off;

    ssl_certificate /home/site/wwwroot/simplesaml/cert/server.crt;
    ssl_certificate_key /home/site/wwwroot/simplesaml/cert/server.pem;
    ssl_protocols          TLSv1.3 TLSv1.2;
    ssl_ciphers            EECDH+AESGCM:EDH+AESGCM;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location / {
        index  index.php index.html index.htm hostingstart.html;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /html/;
    }

    # Disable .git directory
    location ~ /\.git {
        deny all;
        access_log off;
        log_not_found off;
    }

    # Add locations of phpmyadmin here.
    location ^~ /simplesaml {
      alias /home/site/wwwroot/simplesaml/public;

      location ~^(?<prefix>/simplesaml)(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
          include fastcgi_params;
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_param HTTP_PROXY "";
          fastcgi_param SCRIPT_FILENAME $document_root$phpfile;

          fastcgi_param SCRIPT_NAME /simplesaml$phpfile;
          fastcgi_param PATH_INFO $pathinfo if_not_empty;
          fastcgi_index index.php;
          fastcgi_connect_timeout         300;
          fastcgi_send_timeout           3600;
          fastcgi_read_timeout           3600;
          fastcgi_buffer_size 128k;
          fastcgi_buffers 4 256k;
          fastcgi_busy_buffers_size 256k;
          fastcgi_temp_file_write_size 256k;
      }
    }
}

なお、App Serviceではインスタンスの再起動時にNginxの設定が初期化される仕様となっています。
そのため、以下のようなシェルスクリプトを作成し、App Serviceの「設定」→「構成」→「全般設定」のスタートアップ コマンドに設定することをお勧めします。

cp /home/site/wwwroot/nginx/default /etc/nginx/sites-available/default
nginx -s reload

https://learn.microsoft.com/ja-jp/azure/app-service/tutorial-php-mysql-app#5---change-site-root

IdPの設定

SimpleSAMLphpの設定ファイルを作成します。

以下のコマンドを実行して、デフォルトの設定ファイルをコピーします。これらのファイルは後ほど環境に合わせて編集する必要があります。

# simplesamlphp
cp config/config.php.dist config/config.php
cp config/authsources.php.dist config/authsources.php
cp metadata/saml20-idp-hosted.php.dist metadata/saml20-idp-hosted.php
cp metadata/saml20-idp-remote.php.dist metadata/saml20-idp-remote.php
cp metadata/saml20-sp-remote.php.dist metadata/saml20-sp-remote.php

config/config.phpを次のように更新します。

baseurlpathを設定します。これはSimpleSAMLphpのベースURLを指定するもので、App Serviceの規定のドメインを使用します。

    'baseurlpath' => 'https://[App Serviceの規定のドメイン]/simplesaml/',

SAMLのIdP機能を有効化します。

    'enable.saml20-idp' => true,

SimpleSAMLphpのデモ用認証モジュールを有効にします。

	          'exampleauth' => true,

SimpleSAMLphpの管理画面のパスワードを設定することができます。

        'auth.adminpassword' => 'xxx[任意のパスワード]',

また、タイムゾーンと言語設定も日本向けに設定します。

    'timezone' => 'Asia/Tokyo',
	  ...
    'language.default' => 'ja',

次にconfig/authsources.phpを更新します。

次の記述箇所をコメントアウトを解除し、テスト用のユーザーアカウントが作成され、SAMLの認証テストに使用できるようにします。


    '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,

        'users' => [
            'student:studentpass' => [
                'uid' => ['test'],
                'eduPersonAffiliation' => ['member', 'student'],
            ],
            'employee:employeepass' => [
                'uid' => ['employee'],
                'eduPersonAffiliation' => ['member', 'employee'],
            ],
        ],
    ],

最後にmetadata/saml20-idp-hosted.phpを更新します。

$metadata['https://[App Serviceの規定のドメイン]'] = [
...

SimpleSAMLphpの管理画面

以下のURLにアクセスして、管理画面にログインします。

  • https://[App Serviceの規定のドメイン]/simplesaml/admin/

ModulesやYour PHP installationが画面の通りになっていたら問題ないです。

「Test」タブからexample-userpassを選択し、ユーザー名とパスワードを入力してログインテストを実行できますので、正常にログインできることを確認してください。

テスト用のアカウントとしては、先ほどauthsources.phpで設定した「student/studentpass」または「employee/employeepass」が使用できます。

「連携」タブからIdPのメタデータを確認することができます。このURLは、SPとの連携設定時に必要となります。
このメタデータは、SimpleSAMLphp以外のSPシステムとの連携設定にも使用できます。
ただし、その場合は「Trusted entities」に連携するSPシステムを登録する必要があります。SPシステムのメタデータをmetadata/saml20-sp-remote.phpに記述することで、SPシステムとの連携が可能になります。

これでSimpleSAMLphpのIdPとしての基本的なセットアップは完了です。この環境を使用して、SPシステムとの連携テストや認証フローの検証を行うことができます。

補足

オープンソースソフトウェアの性質上やむを得ませんが、直近のコミットで発生した構文エラーの特定に時間がかかってしまいました。

https://github.com/simplesamlphp/simplesamlphp/commit/07532065742c7b04d21665359f7d5763d995f26c

また、SimpleSAMLphpのキャッシュディレクトリの権限設定がなく、エラーが発生する場合があります。そのため、以下のコマンドを実行してキャッシュディレクトリの権限を適切に設定する必要があります。

mkdir -p /var/cache/simplesamlphp/core
chown -R www-data:www-data /var/cache/simplesamlphp
chmod -R 755 /var/cache/simplesamlphp

まとめ

以上が、Azure App ServiceでSimpleSAMLphpを構築する基本的な手順となります。
この構成を利用することで、テスト環境でのSAML認証の検証が可能となります。本記事がどなたかのお役に立てば幸いです。

GitHubで編集を提案

Discussion