SAML Single Sign-On: 기술 문서

plans-img Enterprise, Professional 플랜에서 사용 가능

deployment-img Cloudself-hosted 배포판

레거시 Mattermost Enterprise Edition E20에서 사용 가능

보안 주장 표시 언어(Security Assertion Markup Language, SAML)는 OneLogin과 같은 신원 제공자(Identity Provider, IdP)가 Mattermost와 같은 서비스 제공자(Service Provider, SP)에게 인가 자격 증명을 전달할 수 있게 하는 오픈 표준입니다.

더 간단히 말해, 하나의 자격 증명 집합으로 여러 다른 사이트에 로그인할 수 있습니다. SAML 신원 제공자 계정을 사용하면 동일한 계정으로 Mattermost 및 다른 사이트에 안전하게 로그인할 수 있습니다.

주요 이점은 관리자가 SAML 신원 제공자 자격 증명으로 사용자가 액세스할 수 있는 사이트를 제어함으로써 사용자 관리를 중앙 집중화하는 데 도움이 된다는 것입니다.

Mattermost는 싱글 사인온 URL을 사용하여 신원 제공자의 구성 정보를 검색하는 데 사용할 수 있습니다. 이는 IdP 메타데이터 URL을 생성하기 위한 단일 사인온 URL을 사용합니다. IdP 메타데이터 XML 파일에는 IdP 인증서, 엔터티 ID, 리디렉트 URL 및 로그아웃 URL이 포함되어 있습니다.

이 URL을 사용하면 SAML SSO URL과 신원 제공자 발급자 URL 필드가 구성 프로세스에서 자동으로 채워지며, 신원 제공자 공개 인증서도 서버에서 다운로드되어 로컬로 설정됩니다.

현재 이 기능은 Okta 및 Microsoft ADFS 서버 2012 및 2016에서 지원됩니다. OneLogin 지원은 향후 릴리스에서 추가될 예정입니다.

자세한 단계는 Okta와 SAML 구성 , Windows Server 2012용 Microsoft ADFS와 SAML 구성 , Microsoft Windows Server 2016을 사용한 Microsoft ADFS와 SAML 구성 문서를 참조하십시오.

SAML 제공자

신원 제공자(IdP) : 신원 제공자는 인증을 수행합니다. 사용자가 로그인을 클릭하면 신원 제공자가 사용자를 확인하고 적절한 권한 부여로 서비스 제공자에게 데이터를 전송합니다.

예시: OneLogin, Okta, Microsoft Active Directory (ADFS) 또는 Azure.

서비스 제공자(SP) : 서비스 제공자는 IdP로부터 인증과 권한 부여 정보를 받습니다. 이 정보를 받으면 사용자에게 시스템 액세스를 부여하고 사용자를 로그인합니다.

예시: Mattermost, Zendesk, Zoom, Salesforce.

SAML 요청 (AuthNRequest)

Mattermost가 SP에서 시작된 SAML 요청 흐름을 시작할 때, IdP로 HTTP-Redirect 바인딩 요청을 생성하여 XML 페이로드를 base64 문자열로 포함합니다.

bM441nuRIzAjKeMM8RhegMFjZ4L4xPBHhAfHYqgnYDQnSxC++Qn5IocWuzuBGz7JQmT9C57nxjxgbFIatiqUCQN17aYrLn/mWE09C5mJMYlcV68ibEkbR/JKUQ+2u/N+mSD4/C/QvFvuB6BcJaXaz0h7NwGhHROUte6MoGJKMPE=

AuthNRequests는 Mattermost에서 서명될 수도 있으며, 이 경우 XML 페이로드는 다음과 유사합니다.

<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:samlsig="https://www.w3.org/2000/09/xmldsig#" ID="_u5mpjadp1fdozfih4cj8ap4brh" Version="2.0" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" AssertionConsumerServiceURL="http://localhost:8065/login/sso/saml" IssueInstant="2019-06-08T16:00:31Z">
    <saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">https://www.okta.com/exkoxukx1D8OIfY03356</saml:Issuer>
    <samlsig:Signature Id="Signature1">
        <samlsig:SignedInfo>
            <samlsig:CanonicalizationMethod Algorithm="https://www.w3.org/2001/10/xml-exc-c14n#"></samlsig:CanonicalizationMethod>
            <samlsig:SignatureMethod Algorithm="https://www.w3.org/2000/09/xmldsig#rsa-sha1"></samlsig:SignatureMethod>
            <samlsig:Reference URI="#_u5mpjadp1fdozfih4cj8ap4brh">
                <samlsig:Transforms>
                    <samlsig:Transform Algorithm="https://www.w3.org/2000/09/xmldsig#enveloped-signature"></samlsig:Transform>
                </samlsig:Transforms>
                <samlsig:DigestMethod Algorithm="https://www.w3.org/2000/09/xmldsig#sha1"></samlsig:DigestMethod>
                <samlsig:DigestValue></samlsig:DigestValue>
            </samlsig:Reference>
        </samlsig:SignedInfo>
        <samlsig:SignatureValue></samlsig:SignatureValue>
        <samlsig:KeyInfo>
            <samlsig:X509Data>
                <samlsig:X509Certificate>MIIFmzCCA4OgAwIBAgIJAIusvV3gZIwiMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRIwEAYDVQQHDAlQYWxvIEFsdG8xEzARBgNVBAoMCk1hdHRlcm1vc3QxDzANBgNVBAsMBkRldk9wczEZMBcGA1UEAwwQYmFzZS5leGFtcGxlLmNvbTAeFw0xOTA2MDcxMjQ0MTdaFw0yOTA2MDQxMjQ0MTdaMGIxCzAJBgNVBAYTAlVTMRIwEAYDVQQHDAlQYWxvIEFsdG8xEzARBgNVBAoMCk1hdHRlcm1vc3QxDzANBgNVBAsMBkRldk9wczEZMBcGA1UEAwwQYmFzZS5leGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALAfDj+RyByszTOPRL4b+cilNF/3PB1I0CG3TNzgllgy5CwRGHLKn5/t8rPsJoWLKOUGenzVdXWuoVi3jyl5FZ1N60CBbXfmSWk20dSIkcYCcYEgs1BTBqKKYFw2dV4M0oppzNtlq7A0Glpg/gpaR/2TXEPAhOsUfORC2qAdJt9ev0AQjp5V0TkIKMZz8oo33Coi38TG5r/LG+ihRbpWzO7j9Rc2S5I6bczvG4wOg7nVKG+B5XBvuU9PjSqgxpd/F/fYf+ggAEru58E+VM4veCRV8vSPbBqDG4FMPV6DiA+tH/70n6zuPCS3soxX00kjKtP80QD6UgzvM2NN7PHiNlf0Zj6VCU3VdjEnypg7dzlHJuyyaAaTD5nSfkecamEoJpq7kaUB7uTmBHELRUhOOy24f54HnP72vnxicZL8cWsOkJwQAqIGzBxQ7J0uX4Os71WrV2YIur8QVk6KN6MBPxfiCh3xO/R+cycgx0aMrWZoyzOzP7NCTM5MNE41C48xeGviyCtUID4xiBow+xo6IDUaiCoUVJhz579ore8ic70a19DD0qHy4SpBvrUwCO54kvkgn6HjYlLC/k8nFM9F9W9wVAQD/QwIjd7EtLZLGgbU61Jv3q4kZxxq270hogCRY0lmI3RxkedGHhetF7kaizrikW5zJQEeido/ir37HhX5AgMBAAGjVDBSMBIGA1UdEwEB/wQIMAYBAf8CAQAwPAYDVR0RBDUwM4IQbG9ncy5leGFtcGxlLmNvbYITbWV0cmljcy5leGFtcGxlLmNvbYcEwKgAAYcEfwAAATANBgkqhkiG9w0BAQsFAAOCAgEAH1O91BABHXZjrU7v1OwG+GbU/4TYZqBXXNxax++OFSRCkEEoNKGg49R6J7lY4lrm12zBlw+oGSyjIOerzi39/dcxDkKpzyhGvEN4mExbDlybmdCVrHPeWgZl7uwqn4Bj1xiu97M6eMthgxJE7KVNDGDHthGL0/fTlONIh3qS7Far33hLHJJKy3+lC1MDB8cNltV3mf/ctHCx5Wa0bfZId0MJgd/seP0WU1HCf3kIxhnhsnOYs32xu7EGiM4/lgnquVd/q/f99ueSaDSHrep373/w2ce9iF3U0qcLd2iP8ayF/daGeW1dVPL9R10Oe4BpRjMkjlLwhZdjJeKSg9GBa2GXUEn1Ru9vpSw/C10no3Qx/6ZHweYbSmJ6hBg4T0nDBp6iVS1eQULNXxDuDWb26U0ESOO5jK8ATywuc45o0bqdvD1XOrGYGfGnofx7ofRWwKHWfltvxurnbsyo2vH6nM6K41K2DpVdyQOKAGvKe/oCWfdi+WyBQJGWcIp2OTC1XyWHv7JsY3lo04+islkHEcqJyd8Rf8GWmRHdXz0WzGiZbxWzAuvRRWnzM31VAws8kQBHTBwIJlJoGX4AXfEvPi+NTxkntf8cQdJucK9ZZbP4ycXHULO4LneyJoJ9Q7nxX11xWv7BDWxxclOXy6tyUkg9Fjb7pQ/HCVvGhRzilVU=</samlsig:X509Certificate>
            </samlsig:X509Data>
        </samlsig:KeyInfo>
    </samlsig:Signature>
</samlp:AuthnRequest>

SAML 응답

IdP에서 SP로 보내는 다양한 유형의 SAML 응답이 있습니다. 응답에는 사용자의 NameID 및 속성을 포함한 Assertion이 포함됩니다.

아래는 다양한 유형의 응답에 대한 표입니다. SAML 어설션을 서명하지만 SAML 응답 자체는 서명되지 않은 경우를 제외하고 각 응답 유형이 완전히 지원됩니다:

서명된 SAML 응답

서명된 SAML 어설션

암호화된 SAML 어설션

Mattermost에서 지원됨

아니요

아니요

아니요

아니요

아니요

부분적으로, 어설션 서명의 유효성 검사가 지원되지 않음

아니요

아니요

부분적으로, 어설션 서명의 유효성 검사가 지원되지 않음

아니요

아니요

아니요

아니요

아니요

각 유형의 XML 응답에 대한 예시는 OneLogin SAML response examples 를 참조하세요.

AD/LDAP와의 SAML 동기화의 기술적 설명

활성화된 경우, AD/LDAP와의 SAML 동기화는 다음 단계로 발생합니다:

  1. “Mattermost 데이터베이스에서 Users.AuthServiceldap 로 설정된 모든 현재 LDAP 사용자 가져오기. 이는 다음과 같은 Mattermost 데이터베이스에 대한 SQL 쿼리입니다: SELECT * FROM Users WHERE AuthService = 'ldap' .

  2. “Mattermost 데이터베이스에서 Users.AuthServicesaml 로 설정된 모든 현재 SAML 사용자 가져오기. 이는 다음과 같은 Mattermost 데이터베이스에 대한 SQL 쿼리입니다: SELECT * FROM Users WHERE AuthService = 'saml' .

  3. LdapSettings.UserFilter 로 정의된 LDAP 서버에서 현재 LDAP 사용자 모두 가져오기. 이는 LDAP 서버에 대한 LDAP 쿼리 입니다. 사용자는 LdapSettings.MaxPageSize 에 의해 정의된 배치로 검색됩니다.

  4. “LDAP 속성 업데이트. 단계 1에서 검색된 각 기존 Mattermost 사용자에 대해 단계 3에서 가져온 LDAP 사용자 목록과 일치하는지 시도합니다. 일치하는지 확인하려면, Mattermost 사용자의 Users.AuthData 필드를 LdapSettings.IdAttribute LDAP 설정과 비교합니다.

  • 사용자의 어떤 속성이 변경되면 해당 속성은 LDAP 서버에서 복사되고 사용자는 업데이트된 것으로 표시됩니다.

  • 해당하는 LdapSettings.IdAttribute 를 찾을 수 없는 경우 사용자는 LDAP 서버에서 삭제된 것으로 가정되며, Users.DeleteAt 필드를 유효한 타임스탬프로 설정하여 Mattermost에서 비활성화됩니다.

  1. SAML 속성 업데이트. 단계 2에서 검색된 각 기존 Mattermost 사용자에 대해 단계 3에서 가져온 LDAP 사용자 목록과 일치하는지 시도합니다. 일치하는지 확인하려면, SamlSettings.EmailLdapSettings.EmailAttribute LDAP 설정과 비교합니다.

  • 사용자의 어떤 속성이 변경되면 해당 속성은 LDAP 서버에서 복사되고 사용자는 업데이트된 것으로 표시됩니다.

  • 해당하는 LdapSettings.EmailAttribute 를 찾을 수 없는 경우 사용자는 LDAP 서버에서 삭제된 것으로 가정되며, Users.DeleteAt 필드를 유효한 타임스탬프로 설정하여 Mattermost에서 비활성화됩니다.

자주 묻는 질문

Mattermost가 사용하는 SAML 메타데이터 XML 파일을 어떻게 얻을 수 있나요?

/api/v4/saml/metadata 에서 Mattermost RESTful API 엔드포인트를 호출하여 XML 파일을 얻을 수 있습니다.

기타 유용한 SAML API 호출은 API reference 를 참조하세요.

API를 사용하여 사용자 속성을 업데이트할 수 있나요?

아니요. Mattermost가 사용자 인증에 SAML을 사용하도록 구성된 경우, 다음 사용자 속성 변경은 API를 통해 수행할 수 없습니다: 성, 이름, 직책, 닉네임, 이메일, 프로필 이미지 또는 사용자 이름. SAML은 이러한 사용자 속성에 대한 권위 있는 출처여야 합니다.

Mattermost에서 사용자의 ObjectGUID가 ADFS에서 본 것과 다른 이유는 무엇인가요?

Active Directory Object-Guid 속성 (LDAP 디스플레이 이름 objectGUID )은 서로 다른 방식으로 표시될 수 있는 16 바이트 배열입니다. 그러나 Microsoft만이 ObjectGUID의 인코딩을 변경합니다. 다른 모든 회사는 서로 다른 기본(base) (8진수, 10진수, 16진수) 를 제외하고 동일한 상태를 유지합니다. 다음과 같습니다:

  1. ldapsearch 리눅스 명령어는 base 64로 표시합니다: Hrz/HqNKnU+lCNTYHx9Ycw== . 이는 LDIF 파일에서도 사용되는 형식입니다.

  2. Mattermost에서 사용하는 LDAP Golang 패키지 는 각 바이트를 역슬래시로 구분한 16진수(base 16) 배열로 값을 생성합니다: \1e\bc\ff\1e\a3\4a\9d\4f\a5\08\d4\d8\1f\1f\58\73

  1. Windows Powershell은 값이 다음과 같이 표시됩니다: 1effbc1e-4aa3-4f9d-a508-d4d81f1f5873