DiscourseConnect(DiscourseSSO)를 SimpleSAMLphp에 설정하고, Discourse 포럼을 SAML IDP(Identity Provider)로 사용하세요

Discourse에는 DiscourseConnect가 통합되어 있어 Discourse를 SSO 제공자로 전환할 수 있습니다. 자세한 내용은 “Using Discourse as an identity provider (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

설치가 완료된 후 새로운 PHP 확장을 활성화하려면 Nginx를 재시작합니다:

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” 두 옵션을 활성화합니다.

"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/을 열고 인증(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 /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 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

또는 IDP 메타데이터 파일을 직접 업로드할 수 있는 SP의 경우, IDP 메타데이터를 다운로드할 수 있습니다: https://YOUR_SAML_DOMAIN/simplesaml/saml2/idp/metadata.php

모든 작업이 완료되었습니다. 이제 모든 것이 정상 작동해야 합니다.

즐기세요~

다음에는 Discourse 기반 SimpleSAMLphp를 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개의 좋아요