자체 호스팅 GitLab 인스턴스용 SAML SSO

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

이 페이지에서는 자체 호스팅 GitLab 인스턴스에 대한 인스턴스 전체 SAML 단일 로그온(SSO) 설정 방법에 대해 설명합니다.

GitLab을 SAML 서비스 제공자(SP)로 구성하여 Okta와 같은 SAML 식별 공급자(IdP)로부터 주장을 처리하도록 구성할 수 있습니다. 이를 통해 GitLab이 사용자를 인증하기 위해 SAML ID 공급자에서 주장을 사용하도록 인증할 수 있습니다.

GitLab.com에서 SAML을 설정하려면 GitLab.com 그룹용 SAML SSO를 참조하십시오.

자세한 정보:

  • OmniAuth 제공자 설정에 대한 자세한 내용은 OmniAuth 문서를 참조하십시오.
  • 일반적으로 사용되는 용어에 대한 자세한 내용은 용어집을 참조하십시오.

GitLab에서 SAML 지원 구성

Linux package (Omnibus)
  1. GitLab이 HTTPS로 구성되었는지 확인하십시오.
  2. 일반 설정을 구성하여 saml을 단일 로그온 제공자로 추가하십시오. 이는 기존 GitLab 계정이 없는 사용자를 위한 JIT(Just-In-Time) 계정 프로비저닝을 가능하게 합니다.
  3. 사용자가 계정을 수동으로 만들지 않고 SAML을 사용하여 가입할 수 있도록 하려면 /etc/gitlab/gitlab.rb을 편집하십시오:

    gitlab_rails['omniauth_allow_single_sign_on'] = ['saml']
    gitlab_rails['omniauth_block_auto_created_users'] = false
    
  4. 선택 사항. 사용자의 이메일 주소가 일치하는 경우 최초 SAML 로그인을 기존의 GitLab 사용자와 자동으로 연결해야 합니다. 이를 위해 /etc/gitlab/gitlab.rb에 다음 설정을 추가하십시오:

    gitlab_rails['omniauth_auto_link_saml_user'] = true
    

    GitLab 계정의 기본 이메일 주소만 SAML 응답의 이메일과 일치합니다.

    또는 사용자는 기존 사용자를 위한 OmniAuth 활성화를 통해 SAML 식별을 기존의 GitLab 계정에 수동으로 연결할 수 있습니다.

  5. 다음과 같은 속성을 구성하여 SAML 사용자가 변경할 수 없도록 합니다:

    • NameID.
    • omniauth_auto_link_saml_user와 함께 사용되는 Email.

    사용자가 이러한 속성을 변경할 수 있으면, 다른 인가된 사용자로 로그인할 수 있습니다. 이러한 속성을 변경할 수 없도록하려면 SAML IdP 설명서를 참조하십시오.

  6. /etc/gitlab/gitlab.rb을 편집하고 다음과 같이 제공자 구성을 추가하십시오:

    gitlab_rails['omniauth_providers'] = [
      {
        name: "saml",
        label: "Provider name", # 선택적 로그인 버튼 레이블, 기본값은 "Saml"
        args: {
          assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
          idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
          idp_sso_target_url: "https://login.example.com/idp",
          issuer: "https://gitlab.example.com",
          name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
        }
      }
    ]
    

    여기서:

    • assertion_consumer_service_url: GitLab HTTPS 엔드포인트 (GitLab 설치의 HTTPS URL에 /users/auth/saml/callback을 추가하십시오).
    • idp_cert_fingerprint: IdP 값을 입력하십시오. SHA1 지문이어야 합니다. 이러한 값에 대한 자세한 내용은 OmniAuth SAML 문서를 참조하십시오. 다른 구성 설정에 대한 자세한 내용은 IdP에서 SAML 구성을 참조하십시오.
    • idp_sso_target_url: IdP 값 입력하십시오.
    • issuer: IdP에 대응하는 고유한 이름으로 변경하십시오.
    • name_identifier_format: IdP 값 입력하십시오.
  7. 파일을 저장하고 GitLab을 다시 구성하십시오:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. GitLab이 HTTPS로 구성되었는지 확인하십시오.
  2. 일반 설정을 구성하여 saml을 단일 로그온 제공자로 추가하십시오. 이는 기존 GitLab 계정이 없는 사용자를 위한 JIT(Just-In-Time) 계정 프로비저닝을 가능하게 합니다.
  3. Helm 값을 내보냅니다:

    helm get values gitlab > gitlab_values.yaml
    
  4. 사용자가 계정을 수동으로 만들지 않고 SAML을 사용하여 가입할 수 있도록 하려면 gitlab_values.yaml을 편집하십시오:

    global:
      appConfig:
        omniauth:
          enabled: true
          allowSingleSignOn: ["saml"]
          blockAutoCreatedUsers: false
    
  5. 선택 사항. 사용자의 이메일 주소가 일치하는 경우 SAML 사용자를 기존의 GitLab 사용자와 자동으로 연결할 수 있습니다. 이를 위해 gitlab_values.yaml에 다음 설정을 추가하십시오:

    global:
      appConfig:
        omniauth:
          autoLinkSamlUser: true
    

    또는 사용자는 기존 사용자를 위한 OmniAuth 활성화를 통해 SAML 식별을 기존의 GitLab 계정에 수동으로 연결할 수 있습니다.

  6. 다음과 같은 속성을 구성하여 SAML 사용자가 변경할 수 없도록 합니다:

    • NameID.
    • Email when used with omniauth_auto_link_saml_user.

    사용자가 이러한 속성을 변경할 수 있으면, 다른 인가된 사용자로 로그인할 수 있습니다. 이러한 속성을 변경할 수 없도록하려면 SAML IdP 설명서를 참조하십시오.

  7. Globals.html#providers에서 사용되는 saml.yaml 파일에 다음 내용을 넣으십시오:

    name: "saml"
    label: "Provider name" # 선택적 로그인 버튼 레이블, 기본값은 "Saml"
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    

    여기서:

    • assertion_consumer_service_url: GitLab HTTPS 엔드포인트 (GitLab 설치의 HTTPS URL에 /users/auth/saml/callback를 추가하십시오).
    • idp_cert_fingerprint: IdP 값을 입력하십시오. SHA1 지문이어야 합니다. 이러한 값에 대한 자세한 내용은 OmniAuth SAML 문서를 참조하십시오. 다른 구성 설정에 대한 자세한 내용은 IdP에서 SAML 구성을 참조하십시오.
    • idp_sso_target_url: IdP 값 입력하십시오.
    • issuer: IdP에 대응하는 고유한 이름으로 변경하십시오.
    • name_identifier_format: IdP 값 입력하십시오.
  8. Kubernetes Secret으로 사용할 saml.yaml 파일을 만들어십시오:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  9. gitlab_values.yaml을 편집하고 다음 구성을 추가하십시오:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  10. 파일을 저장하고 새 값들을 적용하십시오:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. GitLab이 HTTPS로 구성되었는지 확인하십시오.
  2. 일반 설정을 구성하여 saml을 단일 로그온 제공자로 추가하십시오. 이는 기존 GitLab 계정이 없는 사용자를 위한 JIT(Just-In-Time) 계정 프로비저닝을 가능하게 합니다.
  3. 사용자가 계정을 수동으로 만들지 않고 SAML을 사용하여 가입할 수 있도록 하려면 docker-compose.yml을 편집하십시오:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_allow_single_sign_on'] = ['saml']
            gitlab_rails['omniauth_block_auto_created_users'] = false
    
  4. 선택 사항. 사용자의 이메일 주소가 일치하는 경우 SAML 사용자를 기존의 GitLab 사용자와 자동으로 연결할 수 있습니다. 이를 위해 docker-compose.yml에 다음 설정을 추가하십시오:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_auto_link_saml_user'] = true
    

    또는 사용자는 기존 사용자를 위한 OmniAuth 활성화를 통해 SAML 식별을 기존의 GitLab 계정에 수동으로 연결할 수 있습니다.

  5. 다음과 같은 속성을 구성하여 SAML 사용자가 변경할 수 없도록 합니다:

    • NameID.
    • omniauth_auto_link_saml_user와 함께 사용되는 Email.

    사용자가 이러한 속성을 변경할 수 있으면, 다른 인가된 사용자로 로그인할 수 있습니다. 이러한 속성을 변경할 수 없도록하려면 SAML IdP 설명서를 참조하십시오.

  6. docker-compose.yml을 편집하고 다음과 같이 제공자 구성을 추가하십시오:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
              {
                name: "saml",
                label: "Provider name", # 선택적 로그인 버튼 레이블, 기본값은 "Saml"
                args: {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
                }
              }
            ]
    

    여기서:

    • assertion_consumer_service_url: GitLab HTTPS 엔드포인트 (GitLab 설치의 HTTPS URL에 /users/auth/saml/callback을 추가하십시오).
    • idp_cert_fingerprint: IdP 값을 입력하십시오. SHA1 지문이어야 합니다. 이러한 값에 대한 자세한 내용은 OmniAuth SAML 문서를 참조하십시오. 다른 구성 설정에 대한 자세한 내용은 IdP에서 SAML 구성을 참조하십시오.
    • idp_sso_target_url: IdP 값 입력하십시오.
    • issuer: IdP에 대응하는 고유한 이름으로 변경하십시오.
    • name_identifier_format: IdP 값 입력하십시오.
  7. 파일을 저장하고 GitLab을 다시 시작하십시오:

    docker compose up -d
    
Self-compiled (source)
  1. GitLab이 HTTPS로 구성되었는지 확인하십시오.
  2. 일반 설정을 구성하여 saml을 단일 로그온 제공자로 추가하십시오. 이는 기존 GitLab 계정이 없는 사용자를 위한 JIT(Just-In-Time) 계정 프로비저닝을 가능하게 합니다.
  3. 사용자가 계정을 수동으로 만들지 않고 SAML을 사용하여 가입할 수 있도록 하려면 /home/git/gitlab/config/gitlab.yml을 편집하십시오:

    production: &base
      omniauth:
        enabled: true
        allow_single_sign_on: ["saml"]
        block_auto_created_users: false
    
  4. 선택 사항. 사용자의 이메일 주소가 일치하는 경우 SAML 사용자를 기존의 GitLab 사용자와 자동으로 연결할 수 있습니다. 이를 위해 /home/git/gitlab/config/gitlab.yml에 다음 설정을 추가하십시오:

    production: &base
      omniauth:
        auto_link_saml_user: true
    

    또는 사용자는 기존 사용자를 위한 OmniAuth 활성화를 통해 SAML 식별을 기존의 GitLab 계정에 수동으로 연결할 수 있습니다.

  5. 다음과 같은 속성을 구성하여 SAML 사용자가 변경할 수 없도록 합니다:

    • NameID.
    • omniauth_auto_link_saml_user와 함께 사용되는 Email.

    사용자가 이러한 속성을 변경할 수 있으면, 다른 인가된 사용자로 로그인할

SAML IdP에서 GitLab 등록

  1. 발급자(issuer)에 지정된 응용 프로그램 이름을 사용하여 SAML IdP에 GitLab SP를 등록합니다.

  2. IdP에 구성 정보를 제공하려면 응용 프로그램에 대한 메타데이터 URL을 작성합니다. GitLab의 메타데이터 URL을 작성하려면 GitLab 설치의 HTTPS URL에 users/auth/saml/metadata를 추가합니다. 예를 들면:

    https://gitlab.example.com/users/auth/saml/metadata
    

    IdP는 적어도 email 또는 mail을 사용하여 사용자 이메일 주소를 포함하는 클레임을 제공해야 합니다. 사용 가능한 다른 클레임에 대한 자세한 정보는 클레임 구성을 참조하세요.

  3. 로그인 페이지에 일반 로그인 폼 아래에 SAML 아이콘이 표시됩니다. 아이콘을 선택하여 인증 프로세스를 시작합니다. 인증이 성공하면 GitLab으로 되돌아가서 로그인됩니다.

IdP에서 SAML 구성

IdP에서 SAML 응용 프로그램을 구성하려면 최소한 다음 정보가 필요합니다:

구성 예제는 아이덴티티 제공자 설정을 참조하세요.

IdP에 따라 추가 구성이 필요할 수 있습니다. 자세한 정보는 IdP에서 SAML 앱을 위한 추가 구성을 참조하세요.

여러 SAML IdP를 사용하도록 GitLab 구성

GitLab을 여러 SAML IdP를 사용하도록 구성할 수 있습니다. 이를 위해:

  • 각 제공자에는 args와 일치하는 고유한 이름이 설정되어야 합니다.
  • 제공자의 이름은 다음과 같이 사용됩니다:
    • 제공자 이름을 기반으로 한 OmniAuth 구성에서 속성에 따라 다른 버튼과 제공자를 표시합니다. 예를 들면 allowBypassTwoFactor, allowSingleSignOn, syncProfileFromProvider.
    • 각 기존 사용자에 대한 추가 식별 정보로서 연결됩니다.
  • assertion_consumer_service_url이 제공자 이름과 일치해야 합니다.
  • strategy_class는 제공자 이름에서 추론할 수 없기 때문에 명시적으로 설정되어야 합니다.

참고: 여러 SAML IdP를 구성하는 경우 SAML 그룹 링크가 작동하도록하려면 SAML 응답에 그룹 속성을 포함하도록 모든 SAML IdP를 구성해야 합니다. 자세한 정보는 SAML 그룹 링크를 참조하세요.

다음은 여러 SAML IdP를 설정하는 방법입니다:

::Tabs

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일을 편집합니다:

    gitlab_rails['omniauth_providers'] = [
      {
        name: 'saml', # 다음 이름 구성 매개변수와 일치해야 합니다.
        label: 'Provider 1' # UI에서 두 개의 버튼과 제공자를 구분합니다
        args: {
                name: 'saml', # 이것은 필수이며 제공자 이름과 일치해야 합니다
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback', # URL은 제공자 이름과 일치해야 합니다
                strategy_class: 'OmniAuth::Strategies::SAML',
                ... # 단일 제공자와 유사한 필요한 모든 인수를 여기에 넣습니다
              },
      },
      {
        name: 'saml_2', # 다음 이름 구성 매개변수와 일치해야 합니다.
        label: 'Provider 2' # UI에서 두 개의 버튼과 제공자를 구분합니다
        args: {
                name: 'saml_2', # 이것은 필수이며 제공자 이름과 일치해야 합니다
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml_2/callback', # URL은 제공자 이름과 일치해야 합니다
                strategy_class: 'OmniAuth::Strategies::SAML',
                ... # 단일 제공자와 유사한 필요한 모든 인수를 여기에 넣습니다
              },
      }
    ]
    

    사용자가 두 제공자 중 하나에서 수동으로 계정을 만들 필요 없이 SAML을 사용하여 회원가입할 수 있도록 하려면 구성에 다음 값을 추가합니다:

    gitlab_rails['omniauth_allow_single_sign_on'] = ['saml', 'saml_2']
    
  2. 파일을 저장하고 GitLab을 다시 구성합니다:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. 첫 번째 SAML 제공자를 위한 Kubernetes Secret로 사용할 saml.yaml 파일에 다음 내용을 넣습니다:

    name: 'saml' # 적어도 하나의 제공자는 'saml'이어야 합니다
    label: 'Provider 1' # UI에서 두 개의 버튼과 제공자를 구분합니다
    args:
      name: 'saml' # 이것은 필수이며 제공자 이름과 일치해야 합니다
      assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback' # URL은 제공자 이름과 일치해야 합니다
      strategy_class: 'OmniAuth::Strategies::SAML' # 필수
      ... # 단일 제공자와 유사한 필요한 모든 인수를 여기에 넣습니다
    
  2. 두 번째 SAML 제공자를 위한 Kubernetes Secret로 사용할 saml_2.yaml 파일에 다음 내용을 넣습니다:

    name: 'saml_2'
    label: 'Provider 2' # UI에서 두 개의 버튼과 제공자를 구분합니다
    args:
      name: 'saml_2' # 이것은 필수이며 제공자 이름과 일치해야 합니다
      assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml_2/callback' # URL은 제공자 이름과 일치해야 합니다
      strategy_class: 'OmniAuth::Strategies::SAML' # 필수
      ... # 단일 제공자와 유사한 필요한 모든 인수를 여기에 넣습니다
    
  3. 동일한 단계를 따라 추가 SAML 제공자를 설정합니다.
  4. Kubernetes Secrets를 생성합니다:

    kubectl create secret generic -n <namespace> gitlab-saml \
       --from-file=saml=saml.yaml \
       --from-file=saml_2=saml_2.yaml
    
  5. Helm 값을 내보냅니다:

    helm get values gitlab > gitlab_values.yaml
    
  6. gitlab_values.yaml 파일을 편집합니다:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
              key: saml
            - secret: gitlab-saml
              key: saml_2
    

    사용자가 두 제공자 중 하나에서 수동으로 계정을 만들 필요 없이 SAML을 사용하여 회원가입할 수 있도록 하려면 구성에 다음 값을 추가합니다:

    global:
      appConfig:
        omniauth:
          allowSingleSignOn: ["saml", "saml_2"]
    
  7. 파일을 저장하고 새 값들을 적용합니다:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. docker-compose.yml 파일을 편집합니다:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_allow_single_sign_on'] = ['saml', 'saml1']
            gitlab_rails['omniauth_providers'] = [
              {
                name: 'saml', # 다음 이름 구성 매개변수와 일치해야 합니다.
                label: 'Provider 1' # UI에서 두 개의 버튼과 제공자를 구분합니다
                args: {
                        name: 'saml', # 이것은 필수이며 제공자 이름과 일치해야 합니다
                        assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback', # URL은 제공자 이름과 일치해야 합니다
                        strategy_class: 'OmniAuth::Strategies::SAML',
                        ... # 단일 제공자와 유사한 필요한 모든 인수를 여기에 넣습니다
                      },
              },
              {
                name: 'saml_2', # 다음 이름 구성 매개변수와 일치해야 합니다.
                label: 'Provider 2' # UI에서 두 개의 버튼과 제공자를 구분합니다
                args: {
                        name: 'saml_2', # 이것은 필수이며 제공자 이름과 일치해야 합니다
                        assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml_2/callback', # URL은 제공자 이름과 일치해야 합니다
                        strategy_class: 'OmniAuth::Strategies::SAML',
                        ... # 단일 제공자와 유사한 필요한 모든 인수를 여기에 넣습니다
                      },
              }
            ]
    

    사용자가 두 제공자 중 하나에서 수동으로 계정을 만들 필요 없이 SAML을 사용하여 회원가입할 수 있도록 하려면 구성에 다음 값을 추가합니다:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_allow_single_sign_on'] = ['saml', 'saml_2']
    
  2. 파일을 저장하고 GitLab을 재시작합니다:

    docker compose up -d
    
Self-compiled (source)
  1. /home/git/gitlab/config/gitlab.yml 파일을 편집합니다:

    production: &base
      omniauth:
        providers:
          - {
            name: 'saml', # 다음 이름 구성 매개변수와 일치해야 합니다.
            label: 'Provider 1' # UI에서 두 개의 버튼과 제공자를 구분합니다
            args: {
              name: 'saml', # 이것은 필수이며 제공자 이름과 일치해야 합니다
              assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback', # URL은 제공자 이름과 일치해야 합니다
              strategy_class: 'OmniAuth::Strategies::SAML',
              ... # 단일 제공자와 유사한 필요한 모든 인수를 여기에 넣습니다
            },
          }
          - {
            name: 'saml_2', # 다음 이름 구성 매개변수와 일치해야 합니다.
            label: 'Provider 2' # UI에서 두 개의 버튼과 제공자를 구분합니다
            args: {
              name: 'saml_2', # 이것은 필수이며 제공자 이름과 일치해야 합니다
              strategy_class: 'OmniAuth::Strategies::SAML',
              assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml_2/callback', # URL은 제공자 이름과 일치해야 합니다
              ... # 단일 제공자와 유사한 필요한 모든 인수를 여기에 넣습니다
            },
          }
    

    사용자가 두 제공자 중 하나에서 수동으로 계정을 만들 필요 없이 SAML을 사용하여 회원가입할 수 있도록 하려면 구성에 다음 값을 추가합니다:

    production: &base
      omniauth:
        allow_single_sign_on: ["saml", "saml_2"]
    
  2. 파일을 저장하고 GitLab을 재시작합니다:

    # systemd를 실행 중인 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init를 실행 중인 시스템의 경우
    sudo service gitlab restart
    

Identity Provider 설정

GitLab의 SAML 지원은 다양한 IdP를 통해 GitLab에 로그인할 수 있음을 의미합니다.

GitLab에서는 Okta 및 Google Workspace IdP 설정에 관한 내용을 참고용으로 제공합니다. 이러한 IdP 중 하나의 설정에 관한 궁금한 사항이 있으면 제공업체 지원팀에 문의하십시오.

Okta 설정

  1. Okta 관리자 섹션에서 Applications을 선택합니다.
  2. 앱 화면에서 Create App Integration을 선택한 다음 다음 화면에서 SAML 2.0을 선택합니다.
  3. 선택 사항. GitLab Press에서 로고를 선택하여 추가합니다. 로고를 잘라내고 크기를 조정해야 합니다.
  4. SAML 일반 구성을 완료합니다. 다음을 입력합니다:
    • "Single sign-on URL": Assertion consumer 서비스 URL을 사용합니다.
    • "Audience URI": 발급자를 사용합니다.
    • NameID.
    • Assertions.
  5. 피드백 섹션에 고객이며 내부용 앱을 만들고 있음을 입력합니다.
  6. 새 앱 프로필 상단에서 SAML 2.0 구성 지침을 선택합니다.
  7. Identity Provider Single Sign-On URL을 확인합니다. 이 URL을 GitLab 구성 파일의 idp_sso_target_url로 사용합니다.
  8. Okta에서 로그아웃하기 전에 사용자 및 그룹을(를) 추가했는지 확인하세요.

Google Workspace 설정

전제 조건:

Google Workspace를 설정하려면:

  1. 다음 정보를 사용하고 Google Workspace에서 사용자 지정 SAML 애플리케이션 설정의 지침을 따릅니다.

      일반 값 설명
    SAML 앱 이름 GitLab 기타 이름도 가능합니다.
    ACS URL https://<GITLAB_DOMAIN>/users/auth/saml/callback Assertion Consumer Service URL.
    GITLAB_DOMAIN gitlab.example.com GitLab 인스턴스 도메인.
    Entity ID https://gitlab.example.com 사용자 고유 값 SAML 애플리케이션. GitLab 구성의 issuer로 설정합니다.
    Name ID 포맷 EMAIL 필수 값입니다. name_identifier_format로도 알려져 있습니다.
    Name ID 기본 이메일 주소 이메일 주소입니다. 해당 주소로 전송된 콘텐츠를 받는지 확인합니다.
    이름 first_name 이름입니다. GitLab과의 통신에 필요한 값입니다.
    last_name 성입니다. GitLab과의 통신에 필요한 값입니다.
  2. 다음 SAML 속성 매핑을 설정합니다:

    Google 디렉터리 속성 앱 속성
    기본 정보 > 이메일 email
    기본 정보 > 이름 first_name
    기본 정보 > 성 last_name

이러한 정보 중 일부는 GitLab에서 SAML 지원을 구성하는 데 사용될 수 있습니다.

Google Workspace SAML 애플리케이션을 구성할 때 다음 정보를 기록하세요.

  설명
SSO URL 종속 Google Identity Provider 세부 정보. GitLab idp_sso_target_url 설정에 지정합니다.
인증서 다운로드 가능 openssl x509 -in <your_certificate.crt> -noout -fingerprint -sha1 명령을 실행하여 GitLab idp_cert_fingerprint 설정에 사용할 수 있는 SHA1 지문을 생성합니다.

Google Workspace 관리자는 또한 IdP 메타데이터, Entity ID 및 SHA-256 지문을 제공합니다. 그러나 GitLab에서는 Google Workspace SAML 애플리케이션에 연결하는 데 이 정보가 필요하지 않습니다.

다른 IdP 설정

일부 IdP는 해당 IdP를 SAML 구성의 IdP로 사용하는 방법에 대한 문서를 제공합니다. 예를 들어 다음과 같습니다:

SAML 구성에서 IdP의 설정에 관한 궁금한 사항이 있으면 제공업체 지원팀에 문의하십시오.

Assertions 구성

  • Microsoft Azure/Entra ID 속성 지원은 GitLab 16.7에서 소개되었습니다.

참고: 이러한 속성은 대소문자를 구분합니다.

필드 지원되는 기본 키
이메일 (필수) email, mail, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress, http://schemas.microsoft.com/ws/2008/06/identity/claims/emailaddress
전체 이름 name, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name, http://schemas.microsoft.com/ws/2008/06/identity/claims/name
이름 first_name, firstname, firstName, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname, http://schemas.microsoft.com/ws/2008/06/identity/claims/givenname
last_name, lastname, lastName, http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname, http://schemas.microsoft.com/ws/2008/06/identity/claims/surname

GitLab은 SAML SSO 제공자로부터 SAML 응답을받을 때 속성 name 필드에 다음 값을 찾습니다.

  • "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname"
  • "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname"
  • "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
  • firstname
  • lastname
  • email

GitLab이 SAML 응답을 구문 분석할 수 있도록 이러한 값을 속성 Name 필드에 올바르게 포함해야 합니다. 예를 들어, GitLab은 다음 SAML 응답 조각을 구문 분석할 수 있습니다.

  • 이는 Name 속성이 이전 테이블에서 필요한 값 중 하나로 설정되어 있으므로 허용됩니다.

             <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/givenname">
                 <AttributeValue>Alvin</AttributeValue>
             </Attribute>
             <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/surname">
                 <AttributeValue>Test</AttributeValue>
             </Attribute>
             <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress">
                 <AttributeValue>alvintest@example.com</AttributeValue>
             </Attribute>
    
  • 이는 Name 속성이 이전 테이블에서 값 중 하나와 일치하므로 허용됩니다.

             <Attribute Name="firstname">
                 <AttributeValue>Alvin</AttributeValue>
             </Attribute>
             <Attribute Name="lastname">
                 <AttributeValue>Test</AttributeValue>
             </Attribute>
             <Attribute Name="email">
                 <AttributeValue>alvintest@example.com</AttributeValue>
             </Attribute>
    

그러나 GitLab은 다음 SAML 응답 조각을 구문 분석할 수 없습니다.

  • Name 속성의 값이 이전 테이블에서 지원되지 않는 값이기 때문에 이는 허용되지 않습니다.

             <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/firstname">
                 <AttributeValue>Alvin</AttributeValue>
             </Attribute>
             <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/lastname">
                 <AttributeValue>Test</AttributeValue>
             </Attribute>
             <Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/mail">
                 <AttributeValue>alvintest@example.com</AttributeValue>
             </Attribute>
    
  • FriendlyName에는 지원되는 값이 있더라도 Name 속성이 없기 때문에 이것은 실패합니다.

             <Attribute FriendlyName="firstname" Name="urn:oid:2.5.4.42">
                 <AttributeValue>Alvin</AttributeValue>
             </Attribute>
             <Attribute FriendlyName="lastname" Name="urn:oid:2.5.4.4">
                 <AttributeValue>Test</AttributeValue>
             </Attribute>
             <Attribute FriendlyName="email" Name="urn:oid:0.9.2342.19200300.100.1.3">
                 <AttributeValue>alvintest@example.com</AttributeValue>
             </Attribute>
    

자세한 후원 제안 구성 예제 및 사용자 이름 속성을 구성하는 방법에 대해서는 attribute_statements를 참조하십시오.

지원되는 주장의 전체 목록은 OmniAuth SAML gem을 참조하십시오.

SAML 그룹 구성에 따라 사용자 구성

다음을 수행할 수 있습니다.

  • 특정 그룹의 구성원으로 사용자를 요청합니다.
  • 그룹 구성원에 따라 사용자에게 외부, 관리자 또는 감사자 역할을 할당합니다.

GitLab은 각 SAML 로그인 시 이러한 그룹을 확인하고 필요에 따라 사용자 속성을 업데이트합니다. 이 기능을 사용하면 사용자를 GitLab 그룹에 자동으로 추가할 수는 없습니다. 이러한 그룹에 대한 지원은 다음 사항에 따라 달라집니다.

그룹 티어 GitLab Enterprise Edition (EE) 전용?
필수 Free, Premium, Ultimate
외부 Free, Premium, Ultimate 아니요
관리자 Free, Premium, Ultimate
감사자 Premium, Ultimate

전제 조건:

  • GitLab이 그룹 정보를 찾을 위치를 지정해야 합니다. 이를 위해 IdP 서버가 일반 SAML 응답과 함께 특정 AttributeStatement을 보내도록 하십시오. 예를 들어:

    <saml:AttributeStatement>
      <saml:Attribute Name="Groups">
        <saml:AttributeValue xsi:type="xs:string">Developers</saml:AttributeValue>
        <saml:AttributeValue xsi:type="xs:string">Freelancers</saml:AttributeValue>
        <saml:AttributeValue xsi:type="xs:string">Admins</saml:AttributeValue>
        <saml:AttributeValue xsi:type="xs:string">Auditors</saml:AttributeValue>
      </saml:Attribute>
    </saml:AttributeStatement>
    

    해당 속성의 이름은 사용자가 속한 그룹을 포함해야 합니다. GitLab이 이러한 그룹을 찾을 위치를 지정하려면 SAML 설정에 groups_attribute: 요소를 추가하십시오.

필수 그룹

귀하의 IdP는 SAML 응답에서 그룹 정보를 GitLab에 전달합니다. 이 응답을 사용하려면 GitLab을 구성하여 다음을 식별해야 합니다.

  • SAML 응답에서 그룹을 찾는 위치를 groups_attribute 설정을 사용하여 식별합니다.
  • 그룹 또는 사용자에 대한 정보를 그룹 설정을 사용하여 식별합니다.

required_groups 설정을 사용하여 GitLab을 구성하여 로그인에 필요한 그룹 구성원을 식별합니다.

만약 required_groups를 설정하지 않거나 해당 설정을 비워 둔 경우, 적절한 인증을 한 사용자는 서비스를 사용할 수 있습니다.

groups_attribute에서 지정한 속성이 잘못되거나 누락된 경우 모든 사용자가 차단됩니다.

Linux 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb을 편집합니다.:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        groups_attribute: 'Groups',
        required_groups: ['Developers', 'Freelancers', 'Admins', 'Auditors'],
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
        }
      }
    ]
    
  2. 파일을 저장하고 GitLab을 다시 구성합니다.:

    sudo gitlab-ctl reconfigure
    
Helm 차트 (Kubernetes)
  1. saml.yaml이라는 이름의 파일에 다음 내용을 넣어 Kubernetes Secret로 사용합니다.:

    name: "saml"
    label: "Our SAML Provider"
    groups_attribute: "Groups"
    required_groups: ["Developers", "Freelancers", "Admins", "Auditors"]
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    
  2. Kubernetes Secret을 생성합니다.:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값을 내보냅니다.:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml을 편집합니다.:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일을 저장하고 새로운 값을 적용합니다.:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. docker-compose.yml을 편집합니다.:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
               { name: 'saml',
                 label: 'Our SAML Provider',
                 groups_attribute: 'Groups',
                 required_groups: ['Developers', 'Freelancers', 'Admins', 'Auditors'],
                 args: {
                         assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                         idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                         idp_sso_target_url: 'https://login.example.com/idp',
                         issuer: 'https://gitlab.example.com',
                         name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
                 }
               }
            ]
    
  2. 파일을 저장하고 GitLab을 재시작합니다.:

    docker compose up -d
    
자체 컴파일(소스)
  1. /home/git/gitlab/config/gitlab.yml을 편집합니다.:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              groups_attribute: "Groups",
              required_groups:
                ["Developers", "Freelancers", "Admins", "Auditors"],
              args:
                {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                },
            }
    
  2. 파일을 저장하고 GitLab을 다시 시작합니다.:

    # systemd를 실행 중인 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init을 실행 중인 시스템의 경우
    sudo service gitlab restart
    

외부 그룹

귀하의 IdP는 SAML 응답에서 GitLab으로 그룹 정보를 전달합니다. 이 응답을 사용하려면 GitLab을 구성하여 다음을 식별하도록 합니다.

  • groups_attribute 설정을 사용하여 SAML 응답에서 그룹을 찾을 곳
  • 그룹 설정을 사용하여 그룹 또는 사용자에 대한 정보

SAML은 external_groups 설정을 기반으로 사용자를 자동으로 외부 사용자로 식별할 수 있습니다.

참고: groups_attribute에 지정된 속성이 잘못되거나 누락된 경우 사용자는 표준 사용자로 액세스합니다.

구성 예시:

Linux 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb 편집:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        groups_attribute: 'Groups',
        external_groups: ['Freelancers'],
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
        }
      }
    ]
    
  2. 파일 저장 및 GitLab 재구성:

    sudo gitlab-ctl reconfigure
    
Helm 차트 (Kubernetes)
  1. saml.yaml이라는 파일에 다음 내용을 넣어 Kubernetes Secret로 사용:

    name: "saml"
    label: "Our SAML Provider"
    groups_attribute: "Groups"
    external_groups: ["Freelancers"]
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    
  2. Kubernetes 시크릿 생성:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값을 내보내기:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml 편집:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일 저장 및 새 값 적용:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
도커
  1. docker-compose.yml 편집:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
              { name: 'saml',
                label: 'Our SAML Provider',
                groups_attribute: 'Groups',
                external_groups: ['Freelancers'],
                args: {
                        assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                        idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                        idp_sso_target_url: 'https://login.example.com/idp',
                        issuer: 'https://gitlab.example.com',
                        name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
                }
              }
            ]
    
  2. 파일 저장 및 GitLab 재시작:

    docker compose up -d
    
자체 컴파일 (소스)
  1. /home/git/gitlab/config/gitlab.yml 편집:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              groups_attribute: "Groups",
              external_groups: ["Freelancers"],
              args:
                {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                },
            }
    
  2. 파일 저장 및 GitLab 재시작:

    # systemd를 실행 중인 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init를 실행 중인 시스템의 경우
    sudo service gitlab restart
    

관리자 그룹

귀하의 IdP는 SAML 응답에서 GitLab으로 그룹 정보를 전달합니다. 이 응답을 사용하려면 GitLab을 구성하여 다음을 식별하도록 합니다.

  • groups_attribute 설정을 사용하여 SAML 응답에서 그룹을 찾을 곳
  • 그룹 설정을 사용하여 그룹 또는 사용자에 대한 정보

admin_groups 설정을 사용하여 사용자에게 관리자 액세스를 부여하는 그룹을 식별할 수 있습니다.

groups_attribute에 지정된 속성이 잘못되거나 누락된 경우 사용자는 관리자 액세스를 상실합니다.

구성 예시:

Linux 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb 편집:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        groups_attribute: 'Groups',
        admin_groups: ['Admins'],
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
        }
      }
    ]
    
  2. 파일 저장 및 GitLab 재구성:

    sudo gitlab-ctl reconfigure
    
Helm 차트 (Kubernetes)
  1. saml.yaml이라는 파일에 다음 내용을 넣어 Kubernetes Secret로 사용:

    name: "saml"
    label: "Our SAML Provider"
    groups_attribute: "Groups"
    admin_groups: ["Admins"]
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    
  2. Kubernetes 시크릿 생성:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값을 내보내기:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml 편집:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일 저장 및 새 값 적용:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
도커
  1. docker-compose.yml 편집:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
               { name: 'saml',
                 label: 'Our SAML Provider',
                 groups_attribute: 'Groups',
                 admin_groups: ['Admins'],
                 args: {
                         assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                         idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                         idp_sso_target_url: 'https://login.example.com/idp',
                         issuer: 'https://gitlab.example.com',
                         name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
                 }
               }
            ]
    
  2. 파일 저장 및 GitLab 재시작:

    docker compose up -d
    
자체 컴파일 (소스)
  1. /home/git/gitlab/config/gitlab.yml 편집:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              groups_attribute: "Groups",
              admin_groups: ["Admins"],
              args:
                {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                },
            }
    
  2. 파일 저장 및 GitLab 재시작:

    # systemd를 실행 중인 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init를 실행 중인 시스템의 경우
    sudo service gitlab restart
    

감사자 그룹

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

IdP는 SAML 응답에서 그룹 정보를 GitLab에 전달합니다. 이 응답을 사용하려면 GitLab을 다음과 같이 구성하여야 합니다.

  • groups_attribute 설정을 사용하여 SAML 응답에서 그룹을 찾을 위치를 지정합니다.
  • 그룹 설정을 사용하여 그룹 또는 사용자에 대한 정보를 확인합니다.

GitLab을 구성하여 감사자 액세스가 포함된 사용자를 식별하도록 auditor_groups 설정을 사용하세요.

groups_attribute에 지정된 속성이 잘못되거나 누락된 경우 사용자는 감사자 액세스를 잃게 됩니다.

구성 예시:

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일을 편집합니다:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        groups_attribute: 'Groups',
        auditor_groups: ['Auditors'],
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
        }
      }
    ]
    
  2. 파일을 저장하고 GitLab을 다시 구성합니다:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. saml.yaml이라는 파일에 다음 내용을 넣어 Kubernetes Secret로 사용합니다:

    name: "saml"
    label: "Our SAML Provider"
    groups_attribute: "Groups"
    auditor_groups: ["Auditors"]
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    
  2. Kubernetes Secret을 생성합니다:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값을 내보냅니다:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml 파일을 편집합니다:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일을 저장하고 새로운 값을 적용합니다:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. docker-compose.yml 파일을 편집합니다:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
               { name: 'saml',
                 label: 'Our SAML Provider',
                 groups_attribute: 'Groups',
                 auditor_groups: ['Auditors'],
                 args: {
                         assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                         idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                         idp_sso_target_url: 'https://login.example.com/idp',
                         issuer: 'https://gitlab.example.com',
                         name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
                 }
               }
            ]
    
  2. 파일을 저장하고 GitLab을 다시 시작합니다:

    docker compose up -d
    
Self-compiled (source)
  1. /home/git/gitlab/config/gitlab.yml 파일을 편집합니다:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              groups_attribute: "Groups",
              auditor_groups: ["Auditors"],
              args:
                {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                },
            }
    
  2. 파일을 저장하고 GitLab을 다시 시작합니다:

    # systemd를 실행 중인 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init를 실행 중인 시스템의 경우
    sudo service gitlab restart
    

SAML 그룹 동기화 자동 관리

GitLab 그룹 멤버십을 자동으로 관리하는 방법에 대한 정보는 SAML 그룹 동기화를 참조하십시오.

이중 인증 우회

세션별로 SAML 인증 방법을 이중 인증(2FA)으로 구성하려면 해당 방법을 upstream_two_factor_authn_contexts 목록에 등록하세요.

  1. IdP가 AuthnContext를 반환하도록 확인하세요. 예:

    <saml:AuthnStatement>
        <saml:AuthnContext>
            <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:MediumStrongCertificateProtectedTransport</saml:AuthnContextClassRef>
        </saml:AuthnContext>
    </saml:AuthnStatement>
    
  2. 설치 구성을 편집하여 upstream_two_factor_authn_contexts 목록에 SAML 인증 방법을 등록하세요.

    Linux package (Omnibus)
    1. /etc/gitlab/gitlab.rb 파일을 편집합니다:

      gitlab_rails['omniauth_providers'] = [
        { name: 'saml',
          label: 'Our SAML Provider',
          args: {
                  assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                  idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                  idp_sso_target_url: 'https://login.example.com/idp',
                  issuer: 'https://gitlab.example.com',
                  name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
                  upstream_two_factor_authn_contexts:
                    %w(
                      urn:oasis:names:tc:SAML:2.0:ac:classes:CertificateProtectedTransport
                      urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS
                      urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorIGTOKEN
                    ),
          }
        }
      ]
      
    2. 파일을 저장하고 GitLab을 다시 구성합니다:

      sudo gitlab-ctl reconfigure
      
    Helm chart (Kubernetes)
    1. saml.yaml 파일에 다음 내용을 넣어 Kubernetes Secret로 사용합니다:

      name: "saml"
      label: "Our SAML Provider"
      args:
        assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
        idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
        idp_sso_target_url: "https://login.example.com/idp"
        issuer: "https://gitlab.example.com"
        name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
        upstream_two_factor_authn_contexts:
          - "urn:oasis:names:tc:SAML:2.0:ac:classes:CertificateProtectedTransport"
          - "urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS"
          - "urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorIGTOKEN"
      
    2. Kubernetes Secret을 생성합니다:

      kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
      
    3. Helm 값을 내보냅니다:

      helm get values gitlab > gitlab_values.yaml
      
    4. gitlab_values.yaml 파일을 편집합니다:

      global:
        appConfig:
          omniauth:
            providers:
              - secret: gitlab-saml
      
    5. 파일을 저장하고 새로운 값을 적용합니다:

      helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
      
    Docker
    1. docker-compose.yml 파일을 편집합니다:

      version: "3.6"
      services:
        gitlab:
          environment:
            GITLAB_OMNIBUS_CONFIG: |
              gitlab_rails['omniauth_providers'] = [
                 { name: 'saml',
                   label: 'Our SAML Provider',
                   args: {
                           assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                           idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                           idp_sso_target_url: 'https://login.example.com/idp',
                           issuer: 'https://gitlab.example.com',
                           name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
                           upstream_two_factor_authn_contexts:
                             %w(
                               urn:oasis:names:tc:SAML:2.0:ac:classes:CertificateProtectedTransport
                               urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS
                               urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorIGTOKEN
                             )
                   }
                 }
              ]
      
    2. 파일을 저장하고 GitLab을 다시 시작합니다:

      docker compose up -d
      
    Self-compiled (source)
    1. /home/git/gitlab/config/gitlab.yml 파일을 편집합니다:

      production: &base
        omniauth:
          providers:
            - { name: 'saml',
                label: 'Our SAML Provider',
                args: {
                        assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                        idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                        idp_sso_target_url: 'https://login.example.com/idp',
                        issuer: 'https://gitlab.example.com',
                        name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
                        upstream_two_factor_authn_contexts:
                          [
                            'urn:oasis:names:tc:SAML:2.0:ac:classes:CertificateProtectedTransport',
                            'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorOTPSMS',
                            'urn:oasis:names:tc:SAML:2.0:ac:classes:SecondFactorIGTOKEN'
                          ]
                }
              }
      
    2. 파일을 저장하고 GitLab을 다시 시작합니다:

      # systemd를 실행 중인 시스템의 경우
      sudo systemctl restart gitlab.target
      
      # SysV init를 실행 중인 시스템의 경우
      sudo service gitlab restart
      

응답 서명 유효성 검사

IdP(Identity Provider)는 SAML(Security Assertion Markup Language) 응답에 서명하여 담양이 조작되지 않도록 합니다.

이를 통해 특정 그룹 멤버십이 필요할 때 사용자 위장과 권한 상승을 방지합니다.

idp_cert_fingerprint 사용

idp_cert_fingerprint를 사용하여 응답 서명 유효성을 구성합니다. 구성 예시:

Linux 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일을 편집합니다:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
        }
      }
    ]
    
  2. 파일을 저장하고 GitLab을 다시 구성합니다:

    sudo gitlab-ctl reconfigure
    
Helm 차트 (Kubernetes)
  1. saml.yaml이라는 파일에 다음 내용을 넣어 Kubernetes Secret로 사용합니다:

    name: "saml"
    label: "Our SAML Provider"
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    
  2. Kubernetes Secret을 생성합니다:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값들을 내보냅니다:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml 파일을 편집합니다:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일을 저장하고 새로운 값을 적용합니다:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. docker-compose.yml 파일을 편집합니다:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
               { name: 'saml',
                 label: 'Our SAML Provider',
                 args: {
                         assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                         idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                         idp_sso_target_url: 'https://login.example.com/idp',
                         issuer: 'https://gitlab.example.com',
                         name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
                 }
               }
            ]
    
  2. 파일을 저장하고 GitLab을 다시 시작합니다:

    docker compose up -d
    
자체 컴파일 (소스)
  1. /home/git/gitlab/config/gitlab.yml 파일을 편집합니다:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              args:
                {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                },
            }
    
  2. 파일을 저장하고 GitLab을 다시 시작합니다:

    # systemd를 실행 중인 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init를 실행 중인 시스템의 경우
    sudo service gitlab restart
    

idp_cert 사용

IdP가 idp_cert_fingerprint를 구성하는 것을 지원하지 않는 경우, 대신 직접 idp_cert를 사용하여 GitLab을 구성할 수 있습니다. 구성 예시:

Linux 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일을 편집합니다:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert: '-----BEGIN CERTIFICATE-----
                  <redacted>
                  -----END CERTIFICATE-----',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
        }
      }
    ]
    
  2. 파일을 저장하고 GitLab을 다시 구성합니다:

    sudo gitlab-ctl reconfigure
    
Helm 차트 (Kubernetes)
  1. saml.yaml이라는 파일에 다음 내용을 넣어 Kubernetes Secret로 사용합니다:

    name: "saml"
    label: "Our SAML Provider"
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert: |
        -----BEGIN CERTIFICATE-----
        <redacted>
        -----END CERTIFICATE-----
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    
  2. Kubernetes Secret을 생성합니다:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값들을 내보냅니다:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml 파일을 편집합니다:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일을 저장하고 새로운 값을 적용합니다:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. docker-compose.yml 파일을 편집합니다:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
               { name: 'saml',
                 label: 'Our SAML Provider',
                 args: {
                         assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                         idp_cert: '-----BEGIN CERTIFICATE-----
                           <redacted>
                           -----END CERTIFICATE-----',
                         idp_sso_target_url: 'https://login.example.com/idp',
                         issuer: 'https://gitlab.example.com',
                         name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent'
                 }
               }
            ]
    
  2. 파일을 저장하고 GitLab을 다시 시작합니다:

    docker compose up -d
    
자체 컴파일 (소스)
  1. /home/git/gitlab/config/gitlab.yml 파일을 편집합니다:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              args:
                {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert: "-----BEGIN CERTIFICATE-----
                    <redacted>
                    -----END CERTIFICATE-----",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                },
            }
    
  2. 파일을 저장하고 GitLab을 다시 시작합니다:

    # systemd를 실행 중인 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init를 실행 중인 시스템의 경우
    sudo service gitlab restart
    

응답 서명 유효성을 잘못 구성한 경우 다음과 같은 오류 메시지가 표시될 수 있습니다:

  • 키 유효성 오류.
  • 다이제스트 불일치.
  • 지문 불일치.

이러한 오류를 해결하기 위한 자세한 정보는 SAML 문제 해결 가이드를 참조하세요.

SAML 설정 사용자 정의

SAML 서버로 사용자를 리디렉션하여 인증

여러분은 GitLab 구성에 auto_sign_in_with_provider 설정을 추가하여 SAML 서버로 자동으로 리디렉션되어 인증할 수 있습니다. 이렇게 하면 실제로 로그인하기 전에 요소를 선택해야 하는 필요성이 사라집니다.

::Tabs :::TabTitle Linux 패키지 (Omnibus)

  1. /etc/gitlab/gitlab.rb 파일을 편집하세요:

    gitlab_rails['omniauth_auto_sign_in_with_provider'] = 'saml'
    
  2. 파일을 저장하고 GitLab을 다시 구성하세요:

    sudo gitlab-ctl reconfigure
    
Helm 차트 (Kubernetes)
  1. Helm 값 내보내기:

    helm get values gitlab > gitlab_values.yaml
    
  2. gitlab_values.yaml 파일을 편집하세요:

    global:
      appConfig:
        omniauth:
          autoSignInWithProvider: "saml"
    
  3. 파일을 저장하고 새 값 적용하세요:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. docker-compose.yml 파일을 편집하세요:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_auto_sign_in_with_provider'] = 'saml'
    
  2. 파일을 저장하고 GitLab을 재시작하세요:

    docker compose up -d
    
자체 컴파일 (소스)
  1. /home/git/gitlab/config/gitlab.yml 파일을 편집하세요:

    production: &base
      omniauth:
        auto_sign_in_with_provider: "saml"
    
  2. 파일을 저장하고 GitLab을 다시 시작하세요:

    # systemd를 실행 중인 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init를 실행 중인 시스템의 경우
    sudo service gitlab restart
    

::EndTabs

모든 로그인 시도가 SAML 서버로 리디렉션되므로 로컬 자격 증명을 사용하여 로그인할 수 없습니다. 적어도 하나의 SAML 사용자가 관리자 액세스 권한을 갖도록하세요.

참고: 자동 로그인 설정을 우회하려면 로그인 URL에 ?auto_sign_in=false을 추가하세요. 예: https://gitlab.example.com/users/sign_in?auto_sign_in=false.

SAML 응답 속성 이름 매핑

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

attribute_statements를 사용하여 SAML 응답의 속성 이름을 OmniAuth info 해시 항목에 매핑할 수 있습니다.

참고: OmniAuth info 해시 스키마에 속한 속성만 매핑하는 데에 이 설정을 사용하세요.

예를 들어, SAMLResponseEmailAddress라는 속성이 포함된 경우 해당 속성을 info 해시의 해당 키에 매핑하려면 { email: ['EmailAddress'] }을 지정하세요. URI로 명명된 속성도 지원됩니다. 예를 들어, { email: ['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'] }.

이 설정을 사용하여 GitLab에 계정을 만들 때 필요한 특정 속성을 찾을 위치를 알려줄 수 있습니다. 예를 들어, IdP가 사용자의 이메일 주소를 email이 아닌 EmailAddress로 보내는 경우 설정을 통해 GitLab에 알려주십시오:

::Tabs :::TabTitle Linux 패키지 (Omnibus)

  1. /etc/gitlab/gitlab.rb 파일을 편집하세요:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                attribute_statements: { email: ['EmailAddress'] }
        }
      }
    ]
    
  2. 파일을 저장하고 GitLab을 다시 구성하세요:

    sudo gitlab-ctl reconfigure
    
Helm 차트 (Kubernetes)
  1. saml.yaml이라는 파일에 다음 내용을 넣어 Kubernetes Secret로 사용하세요:

    name: "saml"
    label: "Our SAML Provider"
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
      attribute_statements:
        email: ["EmailAddress"]
    
  2. Kubernetes Secret을 생성하세요:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값을 내보내세요:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml 파일을 편집하세요:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일을 저장하고 새 값 적용하세요:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. docker-compose.yml 파일을 편집하세요:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
               { name: 'saml',
                 label: 'Our SAML Provider',
                 args: {
                         assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                         idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                         idp_sso_target_url: 'https://login.example.com/idp',
                         issuer: 'https://gitlab.example.com',
                         name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                         attribute_statements: { email: ['EmailAddress'] }
                 }
               }
            ]
    
  2. 파일을 저장하고 GitLab을 재시작하세요:

    docker compose up -d
    
자체 컴파일 (소스)
  1. /home/git/gitlab/config/gitlab.yml 파일을 편집하세요:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              args:
                {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                  attribute_statements: { email: ["EmailAddress"] },
                },
            }
    
  2. 파일을 저장하고 GitLab을 다시 시작하세요:

    # systemd를 실행 중인 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init를 실행 중인 시스템의 경우
    sudo service gitlab restart
    

::EndTabs

사용자 이름 설정

기본적으로 SAML 응답의 이메일 주소의 로컬 부분을 사용하여 사용자의 GitLab 사용자 이름을 생성합니다.

사용자가 원하는 사용자 이름을 포함하는 하나 이상의 속성을 지정하려면, username 또는 nicknameattribute_statements에 구성하여 설정하세요:

Linux 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일을 편집합니다:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                attribute_statements: { nickname: ['username'] }
        }
      }
    ]
    
  2. 파일을 저장하고 GitLab을 다시 구성합니다:

    sudo gitlab-ctl reconfigure
    
Helm 차트 (Kubernetes)
  1. 다음 내용을 saml.yaml이라는 파일에 넣어 Kubernetes Secret로 사용하도록 합니다:

    name: "saml"
    label: "Our SAML Provider"
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
      attribute_statements:
        nickname: ["username"]
    
  2. Kubernetes Secret을 생성합니다:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값을 내보냅니다:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml 파일을 편집합니다:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일을 저장하고 새 값들을 적용합니다:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
도커
  1. docker-compose.yml 파일을 편집합니다:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
               { name: 'saml',
                 label: 'Our SAML Provider',
                 groups_attribute: 'Groups',
                 required_groups: ['Developers', 'Freelancers', 'Admins', 'Auditors'],
                 args: {
                         assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                         idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                         idp_sso_target_url: 'https://login.example.com/idp',
                         issuer: 'https://gitlab.example.com',
                         name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                         attribute_statements: { nickname: ['username'] }
                 }
               }
            ]
    
  2. 파일을 저장하고 GitLab을 재시작합니다:

    docker compose up -d
    
자체 컴파일 (소스)
  1. /home/git/gitlab/config/gitlab.yml 파일을 편집합니다:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              groups_attribute: "Groups",
              required_groups:
                ["Developers", "Freelancers", "Admins", "Auditors"],
              args:
                {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                  attribute_statements: { nickname: ["username"] },
                },
            }
    
  2. 파일을 저장하고 GitLab을 재시작합니다:

    # systemd를 사용하는 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init을 사용하는 시스템의 경우
    sudo service gitlab restart
    

이것은 또한 SAML 응답의 username 속성을 GitLab의 사용자 이름으로 설정합니다.

시계 드리프트 허용

IdP의 시계는 시스템 시계보다 약간 앞서 일 수 있습니다. 시간 드리프트를 허용하려면 설정에서 allowed_clock_drift를 사용하십시오. 파라미터의 값은 현재 시간에 추가될 숫자 및 초분의 분수로 입력해야 합니다. 지정된 값은 응답 유효성을 검증하는 현재 시간에 추가됩니다.

Linux 패키지 (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일을 편집합니다:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        groups_attribute: 'Groups',
        required_groups: ['Developers', 'Freelancers', 'Admins', 'Auditors'],
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                allowed_clock_drift: 1  # 1초의 클럭 드리프트를 위해
        }
      }
    ]
    
  2. 파일을 저장하고 GitLab을 다시 구성합니다:

    sudo gitlab-ctl reconfigure
    
Helm 차트 (Kubernetes)
  1. 다음 내용을 saml.yaml이라는 파일에 넣어 Kubernetes Secret로 사용하도록 합니다:

    name: "saml"
    label: "Our SAML Provider"
    groups_attribute: "Groups"
    required_groups: ["Developers", "Freelancers", "Admins", "Auditors"]
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
      allowed_clock_drift: 1 # 1초의 클럭 드리프트를 위해
    
  2. Kubernetes Secret을 생성합니다:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값을 내보냅니다:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml 파일을 편집합니다:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일을 저장하고 새 값들을 적용합니다:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
도커
  1. docker-compose.yml 파일을 편집합니다:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
               { name: 'saml',
                 label: 'Our SAML Provider',
                 groups_attribute: 'Groups',
                 required_groups: ['Developers', 'Freelancers', 'Admins', 'Auditors'],
                 args: {
                         assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                         idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                         idp_sso_target_url: 'https://login.example.com/idp',
                         issuer: 'https://gitlab.example.com',
                         name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                         allowed_clock_drift: 1  # 1초의 클럭 드리프트를 위해
                 }
               }
            ]
    
  2. 파일을 저장하고 GitLab을 재시작합니다:

    docker compose up -d
    
자체 컴파일 (소스)
  1. /home/git/gitlab/config/gitlab.yml 파일을 편집합니다:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              groups_attribute: "Groups",
              required_groups:
                ["Developers", "Freelancers", "Admins", "Auditors"],
              args: {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                  allowed_clock_drift: 1, # 1초의 클럭 드리프트를 위해
                },
            }
    
  2. 파일을 저장하고 GitLab을 재시작합니다:

    # systemd를 사용하는 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init을 사용하는 시스템의 경우
    sudo service gitlab restart
    

uid에 대한 고유 속성 지정하기(선택 사항)

기본적으로 사용자 uid는 SAML 응답에서 NameID 속성으로 설정됩니다. uid에 대해 다른 속성을 지정하려면 uid_attribute를 설정할 수 있습니다.

uid를 고유 속성으로 지정하기 전에 SAML 사용자가 이러한 속성을 변경할 수 없도록 다음 속성을 구성한 것을 확인하세요:

  • NameID.
  • omniauth_auto_link_saml_user와 함께 사용될 경우 이메일.

만약 사용자가 이러한 속성을 변경할 수 있다면, 다른 인가된 사용자로 로그인할 수 있습니다. 이러한 속성을 변경할 수 없도록 설정하는 방법은 SAML IdP 문서를 참조하세요. 다음 예제에서는 SAML 응답에서 uid 속성의 값이 uid_attribute로 설정됩니다.

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일 편집:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                uid_attribute: 'uid'
        }
      }
    ]
    
  2. 파일 저장 및 GitLab 재구성:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. saml.yaml이라는 파일에 다음 내용을 넣어 Kubernetes Secret으로 사용:

    name: "saml"
    label: "Our SAML Provider"
    groups_attribute: "Groups"
    required_groups: ["Developers", "Freelancers", "Admins", "Auditors"]
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
      uid_attribute: "uid"
    
  2. Kubernetes Secret 생성:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값 내보내기:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml 편집:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일 저장 및 새 값 적용:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. docker-compose.yml 파일 편집:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
               { name: 'saml',
                 label: 'Our SAML Provider',
                 groups_attribute: 'Groups',
                 required_groups: ['Developers', 'Freelancers', 'Admins', 'Auditors'],
                 args: {
                         assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                         idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                         idp_sso_target_url: 'https://login.example.com/idp',
                         issuer: 'https://gitlab.example.com',
                         name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                         uid_attribute: 'uid'
                 }
               }
            ]
    
  2. 파일 저장 및 GitLab 재시작:

    docker compose up -d
    
Self-compiled (source)
  1. /home/git/gitlab/config/gitlab.yml 파일 편집:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              groups_attribute: "Groups",
              required_groups:
                ["Developers", "Freelancers", "Admins", "Auditors"],
              args:
                {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                  uid_attribute: "uid",
                },
            }
    
  2. 파일 저장 및 GitLab 재시작:

    # systemd를 사용하는 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init을 사용하는 시스템의 경우
    sudo service gitlab restart
    

주장 암호화(선택 사항)

GitLab에서는 SAML 2.0과 TLS 암호화 사용이 필요합니다. 때로는 GitLab에서 추가 주장 암호화가 필요할 수 있습니다. 예를 들어, 로드 밸런서에서 TLS 암호화를 초기에 해제하거나 로그에 나타나기를 원치 않는 주장에 민감한 세부 정보를 포함하는 경우입니다.

대부분의 조직은 이 계층에서 추가적인 암호화가 필요하지 않을 것입니다.

귀하의 IdP는 GitLab의 공개 인증서로 주장을 암호화하고, GitLab은 자신의 개인 키로 EncryptedAssertion를 해독합니다.

참고: 이 통합은 주장 암호화와 요청 서명을 위해 certificateprivate_key 설정을 사용합니다.

SAML 통합은 EncryptedAssertion을 지원합니다. 주장을 암호화하려면 자신의 GitLab 인스턴스의 개인 키 및 공개 인증서를 SAML 설정에 정의하세요.

키와 인증서를 정의할 때 키 파일의 모든 줄 바꿈을 \n으로 바꿔야 합니다. 이렇게 하면 키 파일이 줄 바꿈이 없는 긴 문자열이 됩니다.

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb 파일 편집:

    gitlab_rails['omniauth_providers'] = [
      { name: 'saml',
        label: 'Our SAML Provider',
        groups_attribute: 'Groups',
        required_groups: ['Developers', 'Freelancers', 'Admins', 'Auditors'],
        args: {
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                idp_sso_target_url: 'https://login.example.com/idp',
                issuer: 'https://gitlab.example.com',
                name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                certificate: '-----BEGIN CERTIFICATE-----\n<redacted>\n-----END CERTIFICATE-----',
                private_key: '-----BEGIN PRIVATE KEY-----\n<redacted>\n-----END PRIVATE KEY-----'
        }
      }
    ]
    
  2. 파일 저장 및 GitLab 재구성:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. saml.yaml이라는 파일에 다음 내용을 넣어 Kubernetes Secret으로 사용:

    name: "saml"
    label: "Our SAML Provider"
    groups_attribute: "Groups"
    required_groups: ["Developers", "Freelancers", "Admins", "Auditors"]
    args:
      assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
      idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
      idp_sso_target_url: "https://login.example.com/idp"
      issuer: "https://gitlab.example.com"
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
      certificate: '-----BEGIN CERTIFICATE-----\n<redacted>\n-----END CERTIFICATE-----'
      private_key: '-----BEGIN PRIVATE KEY-----\n<redacted>\n-----END PRIVATE KEY-----'
    
  2. Kubernetes Secret 생성:

    kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
    
  3. Helm 값 내보내기:

    helm get values gitlab > gitlab_values.yaml
    
  4. gitlab_values.yaml 편집:

    global:
      appConfig:
        omniauth:
          providers:
            - secret: gitlab-saml
    
  5. 파일 저장 및 새 값 적용:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. docker-compose.yml 파일 편집:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
               { name: 'saml',
                 label: 'Our SAML Provider',
                 groups_attribute: 'Groups',
                 required_groups: ['Developers', 'Freelancers', 'Admins', 'Auditors'],
                 args: {
                         assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                         idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                         idp_sso_target_url: 'https://login.example.com/idp',
                         issuer: 'https://gitlab.example.com',
                         name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                         certificate: '-----BEGIN CERTIFICATE-----\n<redacted>\n-----END CERTIFICATE-----',
                         private_key: '-----BEGIN PRIVATE KEY-----\n<redacted>\n-----END PRIVATE KEY-----'
                 }
               }
            ]
    
  2. 파일 저장 및 GitLab 재시작:

    docker compose up -d
    
Self-compiled (source)
  1. /home/git/gitlab/config/gitlab.yml 파일 편집:

    production: &base
      omniauth:
        providers:
          - {
              name: "saml",
              label: "Our SAML Provider",
              groups_attribute: "Groups",
              required_groups:
                ["Developers", "Freelancers", "Admins", "Auditors"],
              args:
                {
                  assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                  idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                  idp_sso_target_url: "https://login.example.com/idp",
                  issuer: "https://gitlab.example.com",
                  name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                  certificate: '-----BEGIN CERTIFICATE-----\n<redacted>\n-----END CERTIFICATE-----',
                  private_key: '-----BEGIN PRIVATE KEY-----\n<redacted>\n-----END PRIVATE KEY-----',
                },
            }
    
  2. 파일 저장 및 GitLab 재시작:

    # systemd를 사용하는 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init을 사용하는 시스템의 경우
    sudo service gitlab restart
    

SAML 인증 요청 서명 (선택 사항)

GitLab을 구성하여 SAML 인증 요청에 서명할 수 있습니다. 이 구성은 선택 사항입니다. 왜냐하면 GitLab SAML 요청은 SAML 리디렉트 바인딩을 사용하기 때문입니다.

서명을 구현하려면:

  1. GitLab 인스턴스용 개인 킷 및 공개 인증서 쌍을 생성합니다.
  2. 설정에서 구성의 security 섹션에 서명 설정을 구성합니다. 예:

    Linux package (Omnibus)
    1. /etc/gitlab/gitlab.rb를 편집합니다:

      gitlab_rails['omniauth_providers'] = [
        { name: 'saml',
          label: 'Our SAML Provider',
          args: {
                  assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                  idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                  idp_sso_target_url: 'https://login.example.com/idp',
                  issuer: 'https://gitlab.example.com',
                  name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                  certificate: '-----BEGIN CERTIFICATE-----\n<redacted>\n-----END CERTIFICATE-----',
                  private_key: '-----BEGIN PRIVATE KEY-----\n<redacted>\n-----END PRIVATE KEY-----',
                  security: {
                    authn_requests_signed: true,  # AuthNRequest에 서명을 활성화합니다
                    want_assertions_signed: true,  # 서명된 어설션을 요구하는 활성화합니다
                    want_assertions_encrypted: false,  # 암호화된 어설션을 요구하는 활성화합니다
                    metadata_signed: false,  # 메타데이터에 서명을 활성화합니다
                    signature_method: 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
                    digest_method: 'http://www.w3.org/2001/04/xmlenc#sha256',
                  }
          }
        }
      ]
      
    2. 파일을 저장하고 GitLab을 다시 구성합니다:

      sudo gitlab-ctl reconfigure
      
    Helm 차트 (Kubernetes)
    1. 다음 내용을 saml.yaml이라는 파일에 넣어 Kubernetes Secret로 사용합니다:

      name: "saml"
      label: "Our SAML Provider"
      args:
        assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback"
        idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8"
        idp_sso_target_url: "https://login.example.com/idp"
        issuer: "https://gitlab.example.com"
        name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
        certificate: '-----BEGIN CERTIFICATE-----\n<redacted>\n-----END CERTIFICATE-----'
        private_key: '-----BEGIN PRIVATE KEY-----\n<redacted>\n-----END PRIVATE KEY-----'
        security:
          authn_requests_signed: true # AuthNRequest에 서명을 활성화합니다
          want_assertions_signed: true # 서명된 어설션을 요구하는 활성화합니다
          want_assertions_encrypted: false # 암호화된 어설션을 요구하는 활성화합니다
          metadata_signed: false # 메타데이터에 서명을 활성화합니다
          signature_method: "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
          digest_method: "http://www.w3.org/2001/04/xmlenc#sha256"
      
    2. Kubernetes Secret을 생성합니다:

      kubectl create secret generic -n <namespace> gitlab-saml --from-file=provider=saml.yaml
      
    3. Helm 값을 내보냅니다:

      helm get values gitlab > gitlab_values.yaml
      
    4. gitlab_values.yaml을 편집합니다:

      global:
        appConfig:
          omniauth:
            providers:
              - secret: gitlab-saml
      
    5. 파일을 저장하고 새 값 적용합니다:

      helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
      
    Docker
    1. docker-compose.yml을 편집합니다:

      version: "3.6"
      services:
        gitlab:
          environment:
            GITLAB_OMNIBUS_CONFIG: |
              gitlab_rails['omniauth_providers'] = [
                 { name: 'saml',
                   label: 'Our SAML Provider',
                   args: {
                           assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback',
                           idp_cert_fingerprint: '43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8',
                           idp_sso_target_url: 'https://login.example.com/idp',
                           issuer: 'https://gitlab.example.com',
                           name_identifier_format: 'urn:oasis:names:tc:SAML:2.0:nameid-format:persistent',
                           certificate: '-----BEGIN CERTIFICATE-----\n<redacted>\n-----END CERTIFICATE-----',
                           private_key: '-----BEGIN PRIVATE KEY-----\n<redacted>\n-----END PRIVATE KEY-----',
                           security: {
                             authn_requests_signed: true,  # enable signature on AuthNRequest
                             want_assertions_signed: true,  # enable the requirement of signed assertion
                             want_assertions_encrypted: false,  # enable the requirement of encrypted assertion 
                             metadata_signed: false,  # enable signature on Metadata
                             signature_method: 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
                             digest_method: 'http://www.w3.org/2001/04/xmlenc#sha256',
                           }
                   }
                 }
              ]
      
    2. 파일을 저장하고 GitLab을 재시작합니다:

      docker compose up -d
      
    Self-compiled (source)
    1. /home/git/gitlab/config/gitlab.yml을 편집합니다:

      production: &base
        omniauth:
          providers:
            - {
                name: "saml",
                label: "Our SAML Provider",
                args:
                  {
                    assertion_consumer_service_url: "https://gitlab.example.com/users/auth/saml/callback",
                    idp_cert_fingerprint: "43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8",
                    idp_sso_target_url: "https://login.example.com/idp",
                    issuer: "https://gitlab.example.com",
                    name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
                    certificate: '-----BEGIN CERTIFICATE-----\n<redacted>\n-----END CERTIFICATE-----',
                    private_key: '-----BEGIN PRIVATE KEY-----\n<redacted>\n-----END PRIVATE KEY-----',
                    security: {
                        authn_requests_signed: true, # AuthNRequest에 서명을 활성화합니다
                        want_assertions_signed: true, # 서명된 어설션을 요구하는 활성화합니다
                        want_assertions_encrypted: false, # 암호화된 어설션을 요구하는 활성화합니다
                        metadata_signed: false, # 메타데이터에 서명을 활성화합니다
                        signature_method: "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
                        digest_method: "http://www.w3.org/2001/04/xmlenc#sha256",
                      },
                  },
              }
      
    2. 파일을 저장하고 GitLab을 재시작합니다:

      # systemd가 실행 중인 시스템인 경우
      sudo systemctl restart gitlab.target
      
      # SysV init가 실행 중인 시스템인 경우
      sudo service gitlab restart
      

그런 다음 GitLab은:

  • 제공된 개인 킷으로 요청에 서명합니다.
  • 설정된 공용 x500 인증서를 메타데이터에 포함하여 IdP에서 수신된 요청의 서명을 유효성 검사합니다.

이 옵션에 대한 자세한 정보는 Ruby SAML gem 문서를 참조하세요.

Ruby SAML gem은 OmniAuth SAML gem에서 SAML 인증의 클라이언트 측을 구현하는 데 사용됩니다.

참고: SAML 리디렉트 바인딩은 SAML POST 바인딩과 다릅니다. POST 바인딩에서 서명이 필요하여 중간자가 요청을 손상시키지 못하도록 합니다.

SAML을 통해 생성된 사용자의 비밀번호 생성

GitLab은 SAML을 통해 생성된 사용자의 비밀번호를 생성하고 설정합니다.

SSO 또는 SAML로 인증된 사용자는 HTTPS를 통한 Git 작업에 대해 비밀번호를 사용해서는 안 됩니다. 대신 이러한 사용자들은 다음을 할 수 있습니다:

기존 사용자를 위한 SAML 신원 연결

관리자는 GitLab을 구성하여 SAML 사용자를 자동으로 기존 GitLab 사용자와 연결할 수 있습니다. 자세한 정보는 GitLab에서 SAML 지원 구성을 참조하세요.

사용자는 자신의 SAML 신원을 기존의 GitLab 계정에 수동으로 연결할 수 있습니다. 자세한 정보는 기존 사용자를 위한 OmniAuth 활성화를 참조하세요.

자체 관리형 인스턴스에서 그룹 SAML SSO 구성

Tier: 프리미엄, 얼티메이트 Offering: Self-managed, GitLab Dedicated

자체 관리형 인스턴스에서 여러 SAML IdP를 통해 액세스를 허용해야 하는 경우 그룹 SAML SSO를 사용하세요.

그룹 SAML SSO 구성 방법:

Linux package (Omnibus)
  1. GitLab이 HTTPS로 구성되었는지 확인하세요.
  2. OmniAuth 및 group_saml 프로바이더를 활성화하도록 /etc/gitlab/gitlab.rb를 편집하세요:

    gitlab_rails['omniauth_enabled'] = true
    gitlab_rails['omniauth_providers'] = [{ name: 'group_saml' }]
    
  3. 파일을 저장하고 GitLab을 다시 구성하세요:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. GitLab이 HTTPS로 구성되었는지 확인하세요.
  2. group_saml.yaml이라는 이름의 파일에 다음 내용을 넣어 Kubernetes 시크릿으로 사용하세요:

    name: "group_saml"
    
  3. Kubernetes 시크릿을 생성하세요:

    kubectl create secret generic -n <namespace> gitlab-group-saml --from-file=provider=group_saml.yaml
    
  4. Helm 값을 내보내세요:

    helm get values gitlab > gitlab_values.yaml
    
  5. gitlab_values.yaml를 편집하여 OmniAuth 및 group_saml 프로바이더를 활성화하세요:

    global:
      appConfig:
        omniauth:
          enabled: true
          providers:
            - secret: gitlab-group-saml
    
  6. 파일을 저장하고 새 값들을 적용하세요:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    
Docker
  1. GitLab이 HTTPS로 구성되었는지 확인하세요.
  2. docker-compose.yml을 편집하여 OmniAuth 및 group_saml 프로바이더를 활성화하세요:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_enabled'] = true
            gitlab_rails['omniauth_providers'] = [{ name: 'group_saml' }]
    
  3. 파일을 저장하고 GitLab을 다시 시작하세요:

    docker compose up -d
    
Self-compiled (source)
  1. GitLab이 HTTPS로 구성되었는지 확인하세요.
  2. /home/git/gitlab/config/gitlab.yml을 편집하여 OmniAuth 및 group_saml 프로바이더를 활성화하세요:

    production: &base
      omniauth:
        enabled: true
        providers:
          - { name: "group_saml" }
    
  3. 파일을 저장하고 GitLab을 다시 시작하세요:

    # systemd를 실행 중인 시스템의 경우
    sudo systemctl restart gitlab.target
    
    # SysV init을 실행 중인 시스템의 경우
    sudo service gitlab restart
    

자체 관리형 인스턴스에서 그룹 SAML은 권장되는 인스턴스 전체 SAML과 비교하여 한계가 있습니다. 다음을 활용하려면 인스턴스 전체 SAML을 사용하세요:

IdP에서 SAML 앱을 위한 추가 구성

IdP에서 SAML 앱을 구성할 때 IdP에는 다음과 같은 추가 구성이 필요할 수 있습니다.

필드 참고
SAML 프로필 웹 브라우저 SSO 프로필 GitLab은 사용자를 브라우저를 통해 로그인하도록 SAML을 사용합니다. IdP에 직접적인 요청은 이루어지지 않습니다.
SAML 요청 바인딩 HTTP 리디렉션 GitLab(SP)은 사용자를 귀하의 IdP로 SAMLRequest HTTP 매개변수를 BASE64로 인코딩하여 리디렉트합니다.
SAML 응답 바인딩 HTTP POST 귀하의 IdP가 SAML 토큰을 보내는 방법을 지정합니다. 사용자의 브라우저가 GitLab에 다시 제출하는 SAMLResponse가 포함됩니다.
SAML 응답 서명 필수 변조 방지
응답의 X.509 인증서 필수 응답에 서명을 하고 제공된 지문에 대해 응답을 확인합니다.
지문 알고리즘 SHA-1 GitLab은 SAML 응답에 대한 서명을 하기 위해 인증서의 SHA-1 해시를 사용합니다.
서명 알고리즘 SHA-1/SHA-256/SHA-384/SHA-512 응답이 서명되는 방법을 결정합니다. 다이제스트 방법으로도 알려져 있으며 SAML 응답에서 지정될 수 있습니다.
SAML 주장 암호화 선택 사항 귀하의 IdP 및 사용자의 브라우저, 그리고 GitLab 사이에 TLS를 사용합니다.
SAML 주장 서명 선택 사항 SAML 주장의 무결성을 확인합니다. 활성화되면 전체 응답을 서명합니다.
SAML 요청 서명 확인 선택 사항 SAML 응답의 서명을 확인합니다.
기본 RelayState 선택 사항 성공적으로 SAML을 통해 귀하의 IdP에서 로그인한 사용자가 기본 URL의 하위 경로를 지정합니다.
NameID 형식 지속적 NameID 형식 세부사항 참조
추가 URL 선택 사항 일부 공급자에서 다른 필드에 발행자, 식별자 또는 주장 컨슈머 서비스 URL을 포함할 수 있습니다.

특정 제공업체에 대한 구성 예시에 대해서는 특정 제공업체에 대한 노트를 참조하세요.

용어집

용어 설명
Identity provider (IdP) Okta 또는 OneLogin과 같이 사용자 ID를 관리하는 서비스입니다.
Service provider (SP) 사용자를 인증하기 위해 SAML IdP(예: Okta)에서 assertions을 사용하는 서비스입니다. GitLab을 SAML 2.0 SP로 구성할 수 있습니다.
Assertion 사용자 ID에 대한 정보로, 이름이나 역할과 같은 정보를 포함합니다. claim이나 attribute로도 알려져 있습니다.
Single Sign-On (SSO) 인증 체계의 이름입니다.
Assertion consumer service URL 사용자가 IdP로 성공적으로 인증한 후 GitLab으로 리디렉션되는 콜백입니다.
Issuer GitLab이 IdP에 자신을 식별하는 방법입니다. “Relying party trust identifier”로도 알려져 있습니다.
Certificate fingerprint SAML을 통한 통신이 올바른 인증서로 서명되었는지 확인하여 안전한지 확인합니다. 인증서 썸프린트로도 알려져 있습니다.

문제 해결

SAML 문제 해결 가이드를 참조하세요.