Настройте DiscourseConnect (DiscourseSSO) для SimpleSAMLphp, используя ваш форум Discourse в качестве SAML-провайдера идентификации (IDP)

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.

11 лайков

Спасибо за это руководство! Я действительно очень заинтересован в переходе на эту систему! Раньше я не до конца понимал, как это настроить, но, когда появится возможность, обязательно попробую.

Привет, кто-нибудь пробовал это недавно? У меня запущен Discourse 3.3 и simpleSAMLphp 2.2.1, но у меня не получается заставить это работать. Я нахожусь на этапе тестирования. Ссылка больше не работает, но я нашёл опцию тестирования в админ-панели simplesaml. Однако я получаю здесь это исключение:

SimpleSAML\Error\Error: UNHANDLEDEXCEPTION
Backtrace:
3 src/SimpleSAML/Error/ExceptionHandler.php:35 (SimpleSAML\Error\ExceptionHandler::customExceptionHandler)
2 vendor/symfony/error-handler/ErrorHandler.php:535 (Symfony\Component\ErrorHandler\ErrorHandler::handleException)
1 vendor/symfony/error-handler/ErrorHandler.php:627 (Symfony\Component\ErrorHandler\ErrorHandler::handleFatalError)
0 [builtin] (N/A)
Caused by: Symfony\Component\ErrorHandler\Error\FatalError: Compile Error: Declaration of SimpleSAML\Module\authdiscourse\Auth\Source\Discourse::authenticate(&$state) must be compatible with SimpleSAML\Auth\Source::authenticate(array &$state): void
Backtrace:
0 modules/authdiscourse/lib/Auth/Source/Discourse.php:73 (N/A)

Я несколько раз проверил все шаги, но модуль не обновлялся уже 4 года, и я боюсь, что он больше не совместим. Кто-нибудь всё ещё использует это?

Так какой же протокол использует DiscourseConnect? Я пытался использовать OAuth2-клиент, но понял, что параметры немного отличаются :frowning:

1 лайк