Discourse には、Discourse を SSO プロバイダーとして利用できる DiscourseConnect が統合されています。これは 「Discourse を ID プロバイダー (SSO, DiscourseConnect) として使用する」 という記事で見つけることができます。ただし、提供されるのは標準の SAML または OAuth プロトコルではありません。
そのため、Discourse フォーラムの Paul B. が作成した モジュール を使用する必要があります。これは、DiscourseConnect を SimpleSAMLphp に接続し、SimpleSAMLphp を使用して標準の SAML ログインサービスプロトコルを提供するモジュールです。彼の協力に感謝します。このモジュールは、こちらでも見つけることができます。
さあ、ガイドを始めましょう。
まず、SimpleSAMLphp を設定する必要があります。
まず SimpleSAMLphp をダウンロードします。
wget https://simplesamlphp.org/download?latest
次に解凍します。
tar zxf download?latest
そしてファイルを /var/simplesamlphp に移動します。
sudo cp -a simplesamlphp-1.x.y/. /var/simplesamlphp/
次に、このフォルダを www-data ユーザーに 755 の権限で与えます。
sudo chown -R www-data:www-data /var/simplesamlphp/
sudo chmod -R 755 /var/simplesamlphp/
パスが /var/simplesamlphp でなければならない理由を尋ねるかもしれませんが、公式ドキュメントがそこにあるためです。他の場所に配置する場合は追加の設定が必要です。
次に nginx を設定し、インデックスをそのフォルダの /www にポイントします。apache を使用している場合は、公式ドキュメントで設定を見つけてください。
upstream saml-php-handler {
server unix:/run/php/php8.0-fpm.sock;
}
server {
listen 443 ssl;
server_name YOUR_SAML_DOMAIN;
index index.php;
ssl_certificate YOUR_CERT;
ssl_certificate_key YOUR_KEY;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
location ^~ /simplesaml {
alias /var/simplesamlphp/www;
location ~ ^(?<prefix>/simplesaml)(?<phpfile>.+?\.php)(?<pathinfo>/.*)?$ {
include fastcgi_params;
fastcgi_pass saml-php-handler;
fastcgi_param SCRIPT_FILENAME $document_root$phpfile;
# Must be prepended with the baseurlpath
fastcgi_param SCRIPT_NAME /simplesaml$phpfile;
fastcgi_param PATH_INFO $pathinfo if_not_empty;
}
}
}
次にソースを更新します。
sudo apt update
そしてソフトウェアパッケージをインストールします。
sudo apt install php-xml php-mbstring php-curl php-memcache php-ldap memcached
注意:ここでは、PHP のバージョンに応じてインストールする必要があります。たとえば、php8.0 を使用している場合は、すべての “php” の後に “8.0” を追加する必要があります。例:php8.0-xml
インストールが完了したら、Nginx を再起動して新しい PHP 拡張機能を有効にします。
sudo systemctl restart Nginx
次にソルトを生成します。
openssl rand -base64 32
このソルトをコピーします。
次に /var/simplesamlphp/config/config.php を開きます。
'auth.adminpassword',YOUR_PASSWORD;
'secretsalt',YOUR_SALT;
'technicalcontact_name',YOUR_NAME;
'technicalcontact_email' ,YOUR_EMAIL;
'language.default',CHANGE_TO_YOUR_LANGUAGE;
'timezone',CHANGE_TO_YOUR_AREA;
'enable.saml20-idp' => true,
次に https://YOUR_SAML_DOMAIN/simplesaml を開きます。理論的には、SimpleSAMLphp はこれで動作するはずです。
次に Composer をインストールします。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
sudo mv composer.phar /usr/bin/composer
次に composer を実行できるようになります。
/var/simplesamlphp に移動し、composer.json を編集してバージョンを dev-master に変更します。
これをここで行う理由は、discourse-simplesamlphp モジュールが “dev-master” バージョンを必要としますが、デフォルトバージョンは数値であるため、バージョンを “dev-master” に変更する必要があるからです。
次に、このモジュールのインストールを開始します。
composer require swcc/simplesamlphp-module-authdiscourse dev-master --ignore-platform-reqs
“–ignore-platform-reqs” パラメーターは、PHP バージョンが要件に一致しない場合に発生する問題を回避するためです。
これで、composer が swcc/simplesamlphp-module-authdiscourse をインストールし始めるはずです。
インストールが完了したら、次を入力します。
touch /var/simplesamlphp/modules/authdiscourse/enable
このプラグインを有効にします。
次に、Discourse フォーラムで「discourse connect provider secrets」と「enable discourse connect provider」の 2 つのオプションを有効にします。
「discourse connect provider secrets」に SAML ドメインと sso シークレットを入力します。
次に、simplesamlphp フォルダの config/authsources.php を編集します。
<?php
$config = [
// This is a authentication source which handles admin authentication.
'admin' => [
'core:AdminPassword',
],
// This is the authentication source using the Discourse authentication.
'discourse-sso' => [
'authdiscourse:Discourse',
'url' => 'https://discourse.your-domain.org',
'secret' => '<your-sso-secret>',
],
];
この部分を適切な場所に追加する必要があります。
'discourse-sso' => [
'authdiscourse:Discourse',
'url' => 'YOUR_DISCOURSE_DOMAIN',
'secret' => 'DISCOURSE_SSO_SECRET',
],
SimpleSAMLphp が認証に discourse-sso を使用できるようにします。
最後に、https://YOUR_SAML_DOMAIN/simplesaml/module.php/core/authenticate.php?as=discourse-sso を開きます。
または
https://YOUR_SAML_DOMAIN/simplesaml/ を開き、認証をクリックし、discourse-sso をクリックしてテストします。
正しい情報が返された場合は、SimpleSAMLphp が Discourse に正常に接続されたことを意味します。
次に IDP 設定を構成する必要があります。
まず、IDP 用の証明書を生成する必要があります。
openssl req -newkey rsa:3072 -new -x509 -days 3652 -nodes -out YOUR_SAML_DOMAIN.crt -keyout YOUR_SAML_DOMAIN.pem
ルートディレクトリで生成した場合、新しい証明書がそこに表示されます。
次に、証明書を任意の場所に移動し、www-data ユーザーに 755 の権限を与えます。
chown -R www-data:www-data /YOUR_CERT_PATH
chmod -R 755 /YOUR_CERT_PATH
最後に、metadata/saml20-idp-hosted.php で証明書のパスと認証ソースを編集します。
<?php
$metadata['__DYNAMIC:1__'] = [
/*
* The hostname for this IdP. This makes it possible to run multiple
* IdPs from the same configuration. '__DEFAULT__' means that this one
* should be used by default.
*/
'host' => '__DEFAULT__',
/*
* The private key and certificate to use when signing responses.
* These are stored in the cert-directory.
*/
'privatekey' => '/YOUR_KEY_PATH',
'certificate' => '/YOUR_CERT_PATH',
/*
* The authentication source which should be used to authenticate the
* user. This must match one of the entries in config/authsources.php.
* NOTICE: YOU NEED TO CHANGE THE AUTH METHOD TO "discourse-sso"
*/
'auth' => 'discourse-sso',
];
これで、SimpleSAMLphp は Discourse をユーザーデータベースバックエンドとして使用し、SAML IDP として標準の SAML ログインプロトコルを提供します。
IDP ID (URI): https://YOUR_SAML_DOMAIN/simplesaml/saml2/idp/metadata.php
URL ターゲット (SP 識別要件送信に使用): https://YOUR_SAML_DOMAIN/simplesaml/saml2/idp/SSOService.php
X509 Cert: https://YOUR_SAML_DOMAIN/simplesaml/module.php/saml/idp/certs.php/idp.crt
または、IDP メタデータファイルを直接アップロードできる SP の場合は、IDP メタデータをダウンロードできます: https://YOUR_SAML_DOMAIN/simplesaml/saml2/idp/metadata.php
すべて完了です。すべてが正常に動作するはずです。
お楽しみください〜
次に、Discourse を搭載した SimpleSAMLphp を NextCloud の SAML ログイン方法として接続する方法を紹介するかもしれません。
誤解があった場合は、この投稿に返信する か、admin@rail.moe までご連絡ください。