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로 연락해 주세요.