Discourse интегрировал DiscourseConnect, который позволяет превратить ваш Discourse в провайдера единого входа (SSO). Вы можете найти его в статье «Использование Discourse в качестве провайдера идентификации (SSO, DiscourseConnect)». Однако предоставляемый им протокол не является стандартным SAML или OAuth.
Поэтому нам необходимо использовать модуль, созданный Полом Б. на форуме Discourse. Этот модуль позволяет подключить 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;
# Должен быть добавлен префикс 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. Например, если вы используете PHP 8.0, вам нужно добавить «8.0» после каждого «php». Например: php8.0-xml.
Перезапустите Nginx, чтобы активировать новое расширение PHP после завершения установки:
sudo systemctl restart Nginx
Затем сгенерируйте соль (salt):
openssl rand -base64 32
Скопируйте эту соль.
Затем откройте файл /var/simplesamlphp/config/config.php.
'auth.adminpassword' => 'ВАШ_ПАРОЛЬ',
'secretsalt' => 'ВАША_СОЛЬ',
'technicalcontact_name' => 'ВАШЕ_ИМЯ',
'technicalcontact_email' => 'ВАШ_EMAIL',
'language.default' => 'ПЕРЕМЕНИТЕ_НА_ВАШ_ЯЗЫК',
'timezone' => 'ПЕРЕМЕНИТЕ_НА_ВАШ_РЕГИОН',
'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 connect provider secrets» и «enable discourse connect provider» в вашем форуме Discourse.
В поле «discourse connect provider secrets» введите ваш домен SAML и секрет SSO.
Затем отредактируйте файл config/authsources.php в папке simplesamlphp:
<?php
$config = [
// Это источник аутентификации, который обрабатывает аутентификацию администратора.
'admin' => [
'core:AdminPassword',
],
// Это источник аутентификации, использующий аутентификацию Discourse.
'discourse-sso' => [
'authdiscourse:Discourse',
'url' => 'https://discourse.your-domain.org',
'secret' => '<ваш-секрет-sso>',
],
];
Вам нужно добавить эту часть в соответствующее место:
'discourse-sso' => [
'authdiscourse:Discourse',
'url' => 'ВАШ_ДОМЕН_DISCOURSE',
'secret' => 'СЕКРЕТ_SSO_DISCOURSE',
],
Чтобы позволить SimpleSAMLphp использовать discourse-sso для аутентификации.
Наконец, откройте https://YOUR_SAML_DOMAIN/simplesaml/module.php/core/authenticate.php?as=discourse-sso
ИЛИ
Откройте https://YOUR_SAML_DOMAIN/simplesaml/, затем нажмите «Authentication» (Аутентификация), а затем «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 /ПУТЬ_К_ВАШЕМУ_СЕРТИФИКАТУ
chmod -R 755 /ПУТЬ_К_ВАШЕМУ_СЕРТИФИКАТУ
Наконец, отредактируйте путь к сертификату и ваш источник аутентификации в файле metadata/saml20-idp-hosted.php.
<?php
$metadata['__DYNAMIC:1__'] = [
/*
* Имя хоста для этого IdP. Это позволяет запускать несколько
* IdP из одной конфигурации. '__DEFAULT__' означает, что этот
* должен использоваться по умолчанию.
*/
'host' => '__DEFAULT__',
/*
* Приватный ключ и сертификат, используемые для подписи ответов.
* Они хранятся в директории cert.
*/
'privatekey' => '/ПУТЬ_К_ВАШЕМУ_КЛЮЧУ',
'certificate' => '/ПУТЬ_К_ВАШЕМУ_СЕРТИФИКАТУ',
/*
* Источник аутентификации, который должен использоваться для аутентификации
* пользователя. Это должно совпадать с одной из записей в config/authsources.php.
* ВНИМАНИЕ: ВАМ НУЖНО ИЗМЕНИТЬ МЕТОД АУТЕНТИФИКАЦИИ НА "discourse-sso"
*/
'auth' => 'discourse-sso',
];
Теперь ваш SimpleSAMLphp использует Discourse в качестве базы данных пользователей, работает как SAML IDP и предоставляет стандартный протокол входа SAML.
ID ID (URI): https://YOUR_SAML_DOMAIN/simplesaml/saml2/idp/metadata.php
URL Target (используется для отправки требования идентификации 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
Или для тех SP, которые позволяют вам напрямую загружать файл метаданных IDP, вы можете скачать метаданные IDP: https://YOUR_SAML_DOMAIN/simplesaml/saml2/idp/metadata.php
Всё готово. Всё должно работать.
Приятного использования~
В следующем руководстве я, возможно, расскажу, как подключить SimpleSAMLphp, работающий на базе Discourse, в качестве способа входа в NextCloud через SAML.
Если что-то было понято неверно, вы можете ответить на этот пост или связаться со мной по адресу admin@rail.moe.