SAML 문제 해결

Tier: Free, Premium, Ultimate Offering: GitLab.com, Self-Managed, GitLab Dedicated

이 페이지에는 다음을 사용할 때 발생할 수 있는 문제에 대한 가능한 해결 방법이 포함되어 있습니다:

SAML 디버깅 도구

SAML 응답은 base64로 인코딩되므로 다음과 같은 브라우저 플러그인을 추천합니다.

특히 다음을 주의 깊게 살펴보세요:

  • 사용자 로그인을 식별하는 데 사용하는 NameID. 사용자가 이전에 로그인한 경우 이것은 저장된 값과 일치해야 합니다.
  • 확인 응답 서명에 필요한 X509Certificate의 존재 여부.
  • 잘못 구성된 경우 오류를 일으킬 수 있는 SubjectConfirmationConditions.

SAML 응답 생성

SAML 응답을 생성하여 아이덴티티 제공자를 사용하여 로그인을 시도하는 동안 assertion 디렉터리에 전송된 속성 이름 및 값을 미리 확인할 수 있습니다.

SAML 응답 생성 방법:

  1. 브라우저 디버깅 도구 중 하나를 설치합니다.
  2. 새 브라우저 탭을 엽니다.
  3. SAML 추적기 콘솔을 엽니다:
    • Chrome: 페이지의 컨텍스트 메뉴에서 검사를 선택한 다음 열린 개발자 콘솔에서 SAML 탭을 선택합니다.
    • Firefox: 브라우저 툴바에 위치한 SAML 추적기 아이콘을 선택합니다.
  4. SAML 추적기가 열린 상태로 동일한 브라우저 탭에서 GitLab 단일 로그인 URL로 이동합니다.
  5. 인증을 선택하거나 로그인을 시도합니다. SAML 응답이 추적기 콘솔에 표시됩니다. 예시 SAML 응답과 비슷합니다.
  6. SAML 추적기에서 내보내기 아이콘을 선택하여 응답을 JSON 형식으로 저장합니다.

GitLab SAML 테스트

SAML을 문제 해결하기 위해 다음 중 하나를 사용할 수 있습니다:

구성 검증

편의를 위해 지원팀이 사용하는 예시 자료를 포함했습니다. 이 자료는 SAML 앱 구성을 확인하는 데 도움이 될 수 있지만, 제3자 제품의 현재 상태를 정확하게 반영하지는 않습니다.

지문 계산

idp_cert_fingerprint을 사용하는 경우 SHA1 지문이어야 합니다. SHA1 지문을 계산하려면 인증서 파일을 다운로드한 후 다음을 실행합니다:

openssl x509 -in <filename.crt> -noout -fingerprint -sha1

filename.crt를 인증서 파일의 이름으로 대체합니다.

SSO 인증서 업데이트

아이덴티티 제공자에 사용되는 인증서가 변경된 경우(예: 인증서 업데이트 또는 갱신 시), 인증서 지문을 업데이트해야 합니다. 인증서 지문은 아이디얼리 제공자 UI에서 찾을 수 있습니다. 아이디얼리 제공자 UI에서 인증서를 얻을 수 없는 경우 지문 계산 문서의 단계에 따릅니다.

SAML 응답을 위한 Rails 로그 검색

Tier: Free, Premium, Ultimate Offering: Self-Managed, GitLab Dedicated

base64로 인코딩된 SAML 응답을 production_json.log에서 찾을 수 있습니다. 이 응답은 아이덴티티 제공자로부터 전송되며 GitLab에서 소비하는 사용자 정보가 포함되어 있습니다. SAML 통합에서의 많은 오류는 이 응답을 디코딩하고 GitLab 구성 파일의 SAML 설정과 비교함으로써 해결할 수 있습니다.

예를 들어, 이 SAML 응답은 그룹용 SAML의 경우 다음과 같은 필터로 검색하여 찾을 수 있어야 합니다:

  • json.meta.caller_id: Groups::OmniauthCallbacksController#group_saml
  • json.meta.user 또는 json.username: username
  • json.method: POST
  • json.path: /groups/GROUP-PATH/-/saml/callback

관련 로그 항목에서 json.params는 다음을 포함해야 합니다:

  • "key": "SAMLResponse""value": (전체 SAML 응답)",
  • "key": "RelayState""value": "/group-path", 그리고
  • "key": "group_id""value": "group-path".

또한, 관련 로그 항목에서 SAML 그룹 동기화를 구성한 경우 다음 필터로 디코딩된 SAML 응답을 확인해야 합니다:

  • json.class: GroupSamlGroupSyncWorker
  • json.args: <user ID> 또는 <group ID>

관련 로그 항목에서:

  • json.args<userID>, <group ID>, [그룹 링크 ID 1, 그룹 링크 ID 2, ..., 그룹 링크 ID N] 형식입니다.
  • json.extra.group_saml_group_sync_worker.stats.* 필드는 그룹 동기화 실행이 사용자의 멤버십을 추가, 제거 또는 변경한 횟수를 보여줍니다.

일부 경우에는 SAML 응답이 길 경우 "key": "truncated""value":"..."를 받을 수 있습니다. 이 경우 SAML 디버깅 도구 또는 그룹 소유자로 하여금 그룹 SSO 설정 페이지에서 “SAML 구성 확인” 버튼을 선택하여 SAML 응답의 사본을 얻을 수 있습니다.

사람이 읽을 수 있는 형식으로 SAML 응답을 보려면 base64 디코더를 사용하세요. SAML 응답을 온라인으로 붙여넣지 않고 디코딩하려면 브라우저 콘솔을 사용할 수 있습니다:

atob(decodeURI("<paste_SAML_response_here>"))

MacOS에서는 다음을 실행하여 클립보드 데이터를 디코딩할 수 있습니다:

pbpaste | base64 -D

출력으로 SAML 응답을 XML 형식으로 얻어야 합니다.

구성 오류

유효하지 않은 대상

이 오류는 아이덴티티 제공자가 SAML 요청의 유효한 보내는 측 및 수신 측으로서 GitLab을 인식하지 못하는 것을 의미합니다. 다음을 확인하세요:

  • GitLab 콜백 URL을 일치하는 아이덴티티 제공자 서버의 승인된 대상에 추가합니다.
  • issuer 문자열에 후행 공백을 피합니다.

키 유효성 오류, 다이제스트 불일치 또는 지문 불일치

이러한 오류는 모두 SAML 인증서에서 발생합니다. SAML 요청은 반드시 지문, 인증서 또는 유효성 검증기를 사용하여 유효성을 검사해야 합니다.

이 요구 사항에 대한 확인사항은 다음과 같습니다:

  • 지문을 사용하는 경우 올바른 SHA1 지문이어야 합니다. 올바른 SHA1 지문을 사용하는지 확인하려면:
    1. 인증서 파일을 다시 다운로드합니다.
    2. 지문 계산을 수행합니다.
    3. 지문을 idp_cert_fingerprint에 제공된 값과 비교합니다. 값은 동일해야 합니다.
  • 설정에서 인증서가 제공되지 않은 경우 지문 또는 지문 유효성 검증기를 제공해야 하며 서버에서의 응답에는 반드시 인증서(<ds:KeyInfo><ds:X509Data><ds:X509Certificate>)가 있어야 합니다.
  • 설정에서 인증서가 제공된 경우 요청에 반드시 인증서가 있어야 하는 필요가 없어집니다. 이 경우 지문 또는 지문 유효성 검증기는 선택 사항입니다.

위의 시나리오 중 하나도 해당하지 않으면 요청이 위에서 언급된 오류 중 하나로 실패합니다.

누락된 클레임 또는 이메일을 비워 둘 수 없음 오류

아이덴티티 제공자 서버는 GitLab에서 계정을 만들거나 로그인 정보를 기존 계정과 일치시키기 위해 특정 정보를 전달해야 합니다. 이메일은 전달되어야 하는 최소한의 정보입니다. 아이덴티티 제공자 서버가 이 정보를 제공하지 않으면 모든 SAML 요청이 실패합니다.

이 정보가 제공되었는지 확인하세요.

이 오류의 다른 원인은 아이덴티티 제공자가 올바른 정보를 전송하고 있지만 해당 속성이 OmniAuth info 해시의 이름과 일치하지 않을 때 발생할 수 있습니다. 이 경우 SAML 구성에서 attribute_statements을 설정하여 SAML 응답의 속성 이름을 해당하는 OmniAuth info 해시 이름에 매핑해야 합니다.

사용자 로그인 베너 오류 메시지

메시지: “SAML 인증 실패: 외부 UID가 이미 사용 중입니다”

이 오류는 GitLab 사용자로 로그인했지만 SAML 아이덴티티를 이미 다른 GitLab 사용자에 연결한 경우를 나타냅니다. 로그아웃한 후 SAML을 사용하여 다시 로그인하면 연결된 사용자 계정으로 GitLab에 로그인됩니다.

SAML 로그인 시 해당 GitLab 사용자로 사용하는 것을 원하지 않는다면 GitLab 계정을 SAML 앱에서 연결 해제할 수 있습니다.

메시지: “SAML 인증 실패: 사용자가 이미 사용 중입니다”

로그인한 사용자가 이미 다른 아이덴티티에 SAML을 연결했거나 NameID 값이 변경됐을 수 있습니다. 가능한 원인과 해결 방법은 다음과 같습니다.

원인 해결 방법
특정 아이덴티티 제공자에 대해 하나의 사용자에게 여러 SAML 아이덴티티를 연결하려고 시도했습니다. 사용할 아이덴티티를 변경하세요. 이를 위해 먼저 이전 SAML 아이덴티티를이 GitLab 계정에서 연결해제해야 합니다.
NameID는 사용자가 SSO 식별을 요청할 때마다 변경됩니다. NameID 확인을 통해 확인하세요. NameIDTransient 형식으로 설정되어 있지 않고 연속된 요청에서 NameID가 변경되고 있는지 확인하세요.

메시지: “SAML 인증 실패: 이메일이 이미 사용 중입니다”

원인 해결 방법
GitLab에 해당 이메일 주소를 가진 사용자 계정이 이미 있지만 해당 사용자의 계정에 SAML 아이덴티티가 연결되어 있지 않습니다. 사용자는 사용자 계정을 연결해야 합니다.

사용자 계정은 다음 중 하나의 방법으로 생성됩니다:

  • 사용자 등록
  • OAuth를 통한 로그인
  • SAML을 통한 로그인
  • SCIM 프로비저닝

메시지: “SAML 인증 실패: 외부 UID가 이미 사용 중입니다, 사용자가 이미 사용 중입니다”

동시에 이러한 오류를 받으면 아이덴티티 제공자가 제공한 NameID 대문자화가 해당 사용자의 이전 값과 완전히 일치하지 않았음을 의미합니다.

개별 사용자에 대해 이 문제를 해결하려면 해당 사용자의 식별자를 변경해야 합니다. GitLab.com의 경우 사용자는 GitLab 계정에서 SAML 연결을 해제해야 합니다.

메시지: “SAML 계정을 연결하기 위한 요청은 승인되어야 합니다”

GitLab 계정과 연결을 시도하는 사용자가 아이덴티티 제공자의 SAML 앱 내에서 사용자로 추가되었는지 확인하세요.

또는 SAML 응답에는 서비스 제공자에 의해 시작될 것을 기대하는 samlp:Response 태그 내에서 InResponseTo 속성이 누락될 수 있습니다. 이 경우 아이덴티티 제공자 관리자는 로그인이 서비스 제공자에 의해 시작되었음을 보장해야 합니다.

메시지: “해당 이메일 주소와 이미 연결된 GitLab 계정이 있습니다. 기존 자격 증명으로 조직 계정을 연결하려면 기존 자격 증명으로 로그인하세요”

Tier: Premium, Ultimate Offering: GitLab.com

사용자가 기존 GitLab.com 계정에 매뉴얼으로 SAML을 연결하려고 시도할 때 이 메시지를 볼 수 있습니다.

이 문제를 해결하려면 사용자가 올바른 GitLab 암호를 사용하여 로그인하는지 확인해야 합니다. 다음 중 모두에 해당되는 경우 사용자는 먼저 비밀번호를 재설정해야 합니다.

  • 계정이 SCIM으로 프로비저닝됨
  • 처음으로 사용자 이름과 암호로 로그인 중

메시지: “SAML Name ID 및 이메일 주소가 사용자 계정과 일치하지 않습니다”

Tier: Premium, Ultimate Offering: GitLab.com

사용자는 “SAML Name ID 및 이메일 주소가 사용자 계정과 일치하지 않습니다. 관리자에게 문의하세요.”라는 오류를 받을 수 있습니다. 이는 다음과 같은 상황을 의미합니다:

  • SAML에서 보낸 NameID 값이 기존 SAML 아이덴티티의 extern_uid 값과 일치하지 않습니다. NameID와 extern_uid 모두 대소문자를 구별합니다. 자세한 정보는 사용자 SAML 아이덴티티 관리를 참조하세요.
  • SAML 응답에 이메일 주소가 포함되지 않았거나 이메일 주소가 사용자의 GitLab 이메일 주소와 일치하지 않았습니다.

이 문제를 해결하기 위해 GitLab 그룹 소유자가 SAML API를 사용하여 사용자의 SAML extern_uid를 업데이트해야 합니다. extern_uid 값은 SAML 아이덴티티 제공자 (IdP)에서 보내는 Name ID 값과 일치해야 합니다. IdP 구성에 따라 이 값은 생성된 고유 ID, 이메일 주소 또는 기타 값일 수 있습니다.

메시지: “응답에서 인증서 요소 누락 (ds:x509certificate) 및 설정에서 인증서가 제공되지 않음”

이 오류는 IdP가 SAML 응답에 X.509 인증서를 포함하는 방식으로 구성되지 않았음을 나타냅니다. 응답에 X.509 인증서를 포함해야 합니다.

이 문제를 해결하려면 IdP를 구성하여 SAML 응답에 X.509 인증서를 포함하도록 설정하세요.

더 많은 정보는 IdP에 대한 SAML 앱의 추가 구성에 대한 문서를 참조하세요.

기타 사용자 로그인 문제

NameID 확인

문제 해결 시 인증된 사용자는 자신의 사용자에 이미 연결된 NameID를 확인하기 위해 https://gitlab.com/api/v4/user을 방문하고 신분 정보에서 extern_uid를 확인할 수 있습니다.

온프레미스의 경우, 관리자는 사용자 API를 사용하여 동일한 정보를 볼 수 있습니다.

SAML을 사용하는 그룹의 경우 적절한 권한이 있는 역할의 그룹 구성원은 SAML 디버깅 도구를 사용하여 메시지를 디코딩하여 사용자를 식별할 수 있습니다.

로그인 “루프”에 갇혔습니다

GitLab 싱글 사인온 URL (GitLab.com의 경우) 또는 인스턴스 URL(온프레미스의 경우)이 아이덴티티 제공자의 SAML 앱의 “로그인 URL” (또는 유사한 필드)로 구성되었는지 확인하세요.

GitLab.com의 경우, 사용자가 기존 GitLab.com 계정에 SAML을 연결해야 할 때GitLab 싱글 사인온 URL을 제공하고 처음 로그인할 때 SAML 앱을 사용하지 말라는 지시를 제공해야 합니다.

사용자가 404를 받는 경우

Tier: Premium, Ultimate Offering: GitLab.com

사용자가 로그인 후 404를 받으면, IP 제한이 구성되어 있는지 확인하세요. IP 제한 설정은 다음과 같이 구성됩니다:

그룹의 SAML SSO가 유료 기능이므로 구독 만료로 인해 GitLab.com에서 SAML SSO를 사용하여 로그인하면 404 오류가 발생할 수 있습니다. SAML을 사용하여 로그인하려고 할 때 모든 사용자가 404를 받으면, 이 SAML SSO 네임스페이스에서 사용 중인 활성 구독이 있는지 확인하세요. GitLab.com 구독 보기에서 확인할 수 있습니다.

설정을 확인할 때 “구성 확인”을 사용하고 404를 받으면, 올바른 SHA-1 생성된 지문을 사용했는지 확인하세요.

사용자가 처음으로 로그인하려고 시도하고 GitLab 단일 로그인 URL이 구성되지 않았다면, 404가 표시될 수 있습니다. 사용자 액세스 섹션에 기술된대로, 그룹 소유자가 사용자에게 URL을 제공해야 합니다.

최상위 그룹이 이메일 도메인에 의한 회원 제한이 있는 경우, 허용되지 않는 이메일 도메인을 사용하는 사용자가 SSO로 로그인하려고 할 때 404를 받을 수 있습니다. 사용자에게는 여러 개의 계정이 있을 수 있으며, 그들의 SAML 아이디는 회사 도메인과 다른 이메일 주소를 가진 개인 계정에 연결될 수 있습니다. 이를 확인하려면 다음을 확인하세요:

  • 최상위 그룹이 이메일 도메인에 의한 회원 제한이 있는지 확인합니다.
  • 최상위 그룹의 Audit Events에서:
    • 해당 사용자에 대해 GROUP_SAML 인증으로 로그인함 동작을 볼 수 있어야 합니다.
    • 사용자의 사용자 이름이 SAML SSO에 구성한 사용자 이름과 동일한지 확인합니다.

사용자가 IdP에 로그인한 후 모든 사용자가 404를 받으면:

  • assertion_consumer_service_url을 확인합니다:

  • 사용자가 소속된 그룹이 많아서 발생하는 404와 관련이 있는지 확인합니다 (그룹 동기화).

일부 사용자가 IdP에 로그인한 후 404를 받으면, 사용자가 그룹에 추가된 후 바로 제거되는지 확인하세요. 다른 경우에는 사용자가 성공적으로 로그인하지만 최상위 그룹의 구성원으로 표시되지 않을 수 있습니다:

  • 사용자가 SAML 식별 공급자 및 (구성된 경우) SCIM에 추가되었는지 확인합니다.
  • SCIM API를 사용하여 사용자의 SCIM 식별의 ‘active’ 속성이 ‘true’인지 확인합니다. active 속성이 false인 경우, 다음 중 하나를 수행하여 문제를 해결할 수 있습니다:

    • 사용자의 SCIM 식별 공급자에서 사용자 동기화를 트리거합니다. 예를 들어, Azure에는 “요청 시 공급” 옵션이 있습니다.
    • 사용자를 SCIM 식별 공급자에서 제거한 다음 다시 추가합니다.
    • 사용자에게 가능하다면 계정의 연결을 끊은 후 계정을 다시 링크합니다.
    • 단일 SCIM API를 사용하여 그룹의 SCIM 토큰을 사용하여 사용자의 SCIM 식별을 업데이트합니다. 만약 당신이 당신의 그룹의 SCIM 토큰을 모른다면, 토큰을 재설정하고 SCIM 식별 공급자 애플리케이션을 새 토큰으로 업데이트합니다. 예시 요청:

      curl --request PATCH "https://gitlab.example.com/api/scim/v2/groups/test_group/Users/f0b1d561c-21ff-4092-beab-8154b17f82f2" --header "Authorization: Bearer <SCIM_TOKEN>" --header "Content-Type: application/scim+json" --data '{ "Operations": [{"op":"Replace","path":"active","value":"true"}] }'
      

로그인 후 500 에러

Tier: Free, Premium, Ultimate Offering: Self-Managed, GitLab Dedicated

SAML 로그인 페이지로부터 GitLab에서 “500 에러”가 표시되는 경우, 다음 사항을 확인하세요:

  • GitLab이 SAML 사용자의 이메일 주소를 가져올 수 없는 경우입니다. 신원 공급자가 사용자의 이메일 주소를 포함하는 클레임을 email 또는 mail 클레임 네임으로 제공하는지 확인합니다.
  • gitlab.rb 파일에 설정된 인증서 identity provider_cert_fingerprint 또는 identity provider_cert 파일이 올바른지 확인하세요.
  • gitlab.rb 파일이 identity provider_cert_fingerprint를 활성화하고 있고 identity provider_cert가 제공되고 있는지, 또는 그 반대의 경우입니다.

로그인 후 422 에러

Tier: Free, Premium, Ultimate Offering: Self-Managed, GitLab Dedicated

SAML 로그인 페이지로부터 GitLab에서 “422 에러”가 표시되는 경우, 신원 공급자의 Assertion Consumer Service (ACS) URL이 잘못 구성되어 있을 수 있습니다.

ACS URL이 올바른지 확인하고, 여전히 에러가 있는 경우 다른 문제를 검토하세요.

허용되지 않는 이메일로 인한 422 에러

“Email is not allowed for sign-up. Please use your regular email address.”라는 422 에러가 발생할 수 있습니다.

이 메시지는 도메인 허용 디렉터리 또는 거부 디렉터리 설정에서 도메인을 추가하거나 제거해야 함을 나타낼 수 있습니다.

이 워크어라운드를 구현하려면:

  1. 왼쪽 사이드바에서 가장 아래에서 Admin Area를 선택합니다.
  2. Settings > General을 선택합니다.
  3. Sign-up restrictions를 확장합니다.
  4. Allowed domains for sign-upsDenied domains for sign-ups에 알맞게 도메인을 추가하거나 제거합니다.
  5. Save changes를 선택합니다.

SAML을 통해 로그인 시 사용자가 차단됨

Tier: Free, Premium, Ultimate Offering: Self-Managed, GitLab Dedicated

사용자가 SAML을 통해 로그인할 때 차단되는 가장 가능성이 높은 이유는 다음과 같습니다:

  • 설정에서 gitlab_rails['omniauth_block_auto_created_users'] = true로 설정되어 있으며, 이 사용자가 처음으로 로그인할 때입니다.
  • required_groups이 구성되어 있지만 사용자가 해당 그룹의 구성원이 아닐 경우입니다.

Google Workspace 문제 해결 팁

Google Workspace SAML 앱 오류 메시지에 대한 문서는 Google에서 로그인 중에 오류를 보고하는 경우 디버깅하는 데 도움이 됩니다. 특히 다음과 같은 403 오류에 특별한 주의를 기울이세요:

  • app_not_configured
  • app_not_configured_for_user

메시지: “멤버의 이메일 주소가 SAML 계정에 연결되지 않았습니다”

Tier: Premium, Ultimate Offering: GitLab.com

이 오류는 GitLab.com 그룹(또는 그룹 내 프로젝트 또는 하위 그룹)에 사용자를 초대하려고 할 때 SAML SSO 강제가 활성화된 상태에서 나타납니다.

그룹에 사용자를 초대한 후에 이 메시지를 보게 되면:

  1. 사용자가 SAML 식별 공급자에 추가되었는지 확인하세요.
  2. 사용자에게 SAML을 기존의 GitLab.com 계정에 연결하도록 요청하세요. 그렇지 않은 경우 사용자에게 식별 공급자 대시보드를 통해 GitLab.com에 액세스하거나 매뉴얼으로 가입하고 새 계정에 SAML을 연결하도록 요청하세요.
  3. 사용자가 최상위 그룹의 멤버인지 확인하세요.

또한 로그인 후 404를 수신하는 사용자의 문제 해결도 참조하세요.

메시지: SAML 응답에 이메일 주소가 포함되지 않았습니다. SAML 식별 공급자가 해당 속성을 보내도록 구성되지 않았거나 식별 공급자 디렉터리에 사용자의 이메일 주소 값이 포함되어 있지 않을 수 있습니다

이 오류는 SAML 응답에 사용자의 이메일 주소가 email 또는 mail 속성으로 포함되지 않은 경우에 나타납니다. SAML 식별 공급자가 지원되는 메일 속성을 보내도록 구성되어 있는지 확인하세요.

예시:

<Attribute Name="email">
  <AttributeValue>user@example.com‹/AttributeValue>
</Attribute>

http://schemas.xmlsoap.org/ws/2005/05/identity/claimshttp://schemas.microsoft.com/ws/2008/06/identity/claims/와 같은 구문으로 시작하는 속성 이름은 GitLab 16.7부터 기본적으로 지원됩니다.

<Attribute Name="http://schemas.microsoft.com/ws/2008/06/identity/claims/emailaddress">
  <AttributeValue>user@example.com‹/AttributeValue>
</Attribute>