自己管理GitLabインスタンス用のSAML SSO

このページでは、インスタンス全体のSAMLシングルサインオン(SSO) を自己管理GitLabインスタンス用に設定する方法を説明します。

GitLabをSAMLサービスプロバイダーとして動作するように設定することができます(SP) 。これにより、GitLabはOktaのようなSAMLアイデンティティプロバイダ(IdP)からのアサーションを消費してユーザーを認証することができます。

GitLab.comでSAMLを設定するには、SAML SSO for GitLab.comグループを参照してください。

詳細については

GitLab の SAML サポートの設定

Linux package (Omnibus)
  1. GitLab がHTTPS で設定されていることを確認します。
  2. 共通設定を構成して、シングルサインオンプロバイダとしてsaml 。これにより、既存のGitLabアカウントを持っていないユーザーのための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. オプション。/etc/gitlab/gitlab.rbに以下の設定を追加することで、メールアドレスが一致する SAML ユーザーを GitLab の内部ユーザーと自動的にリンクさせることができます:

    gitlab_rails['omniauth_auto_link_saml_user'] = true
    

    あるいは、既存のユーザーに対して OmniAuth を有効にすることで、SAML ID を既存の GitLab アカウントに手動でリンクすることもできます。

  5. SAML ユーザーが変更できないように、以下の属性を設定します:

    • NameID.
    • Email omniauth_auto_link_saml_user と併用した場合。

    ユーザがこれらの属性を変更できる場合、他の作成者としてサインインできます。これらの属性を変更できないようにする方法については、SAML IdP のドキュメントを参照。

  6. /etc/gitlab/gitlab.rb を編集し、プロバイダ設定を追加します:

    gitlab_rails['omniauth_providers'] = [
      {
        name: "saml",
        label: "Provider name", # optional label for login button, defaults to "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アカウントを持っていないユーザーのための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: true
    
  5. オプション。gitlab_values.yamlに以下の設定を追加することで、メールアドレスが一致する SAML ユーザーを GitLab の内部ユーザーと自動的にリンクさせることができます:

    global:
      appConfig:
        omniauth:
          autoLinkSamlUser: true
    

    あるいは、既存のユーザーに対して OmniAuth を有効にすることで、SAML ID を既存の GitLab アカウントに手動でリンクすることもできます。

  6. SAML ユーザーが変更できないように、以下の属性を設定します:

    • NameID.
    • Email omniauth_auto_link_saml_user と併用した場合。

    ユーザがこれらの属性を変更できる場合、他の作成者としてサインインできます。これらの属性を変更できないようにする方法については、SAML IdP のドキュメントを参照。

  7. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    name: 'saml'
    label: 'Provider name' # optional label for login button, defaults to "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シークレットを作成します:

    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アカウントを持っていないユーザーのための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. オプション。docker-compose.ymlに以下の設定を追加することで、メールアドレスが一致する SAML ユーザーを GitLab の内部ユーザーと自動的にリンクさせることができます:

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

    あるいは、既存のユーザーに対して OmniAuth を有効にすることで、SAML ID を既存の GitLab アカウントに手動でリンクすることもできます。

  5. SAML ユーザーが変更できないように、以下の属性を設定します:

    • NameID.
    • Email omniauth_auto_link_saml_user と併用した場合。

    ユーザがこれらの属性を変更できる場合、他の作成者としてサインインできます。これらの属性を変更できないようにする方法については、SAML IdP のドキュメントを参照。

  6. docker-compose.yml を編集し、プロバイダ設定を追加します:

    version: "3.6"
    services:
      gitlab:
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['omniauth_providers'] = [
              {
                name: "saml",
                label: "Provider name", # optional label for login button, defaults to "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アカウントを持っていないユーザーのための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. オプション。/home/git/gitlab/config/gitlab.ymlに以下の設定を追加することで、メールアドレスが一致する SAML ユーザーを GitLab の内部ユーザーと自動的にリンクさせることができます:

    production: &base
      omniauth:
        auto_link_saml_user: true
    

    あるいは、既存のユーザーに対して OmniAuth を有効にすることで、SAML ID を既存の GitLab アカウントに手動でリンクすることもできます。

  5. SAML ユーザーが変更できないように、以下の属性を設定します:

    • NameID.
    • Email omniauth_auto_link_saml_user と併用した場合。

    ユーザがこれらの属性を変更できる場合、他の作成者としてサインインできます。これらの属性を変更できないようにする方法については、SAML IdP のドキュメントを参照。

  6. /home/git/gitlab/config/gitlab.yml を編集し、プロバイダ設定を追加します:

    omniauth:
      providers:
        - {
          name: 'saml',
          label: 'Provider name', # optional label for login button, defaults to "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 を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

GitLab を SAML IdP に登録します。

  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 アプリケーションを設定するには、少なくとも以下の情報が必要です:

設定例については、ID プロバイダの設定を参照してください。

IdP には追加の設定が必要な場合があります。詳細は、「IdP の SAML アプリの追加設定」を参照してください。

複数のSAML IdPを使用するためのGitLabの設定

GitLab 14.6で導入されました

GitLab が複数の SAML IdP を使うように設定できるのは、以下の場合です:

  • 各プロバイダーは、args の名前セットと一致する一意の名前セットを持っています。GitLab 14.6以降の既知のイシューを緩和するために、少なくとも1つのプロバイダがsaml
  • プロバイダーの名前が使われます:
    • プロバイダ名に基づくプロパティの OmniAuth 設定。例えば、allowBypassTwoFactorallowSingleSignOnsyncProfileFromProviderのようになります。
    • 既存の各ユーザーを追加の ID として関連付ける場合。
  • assertion_consumer_service_url はプロバイダ名と一致します。
  • strategy_class はプロバイダ名から推測できないため、明示的に設定されます。
note
SAML グループ・メンバシップおよびグループ同期は、複数の IdP をサポートしていません。詳細については、イシュー 386605を参照してください。これには、イシュー 391926で言及されているrequired_groupsも含まれます。

複数の SAML IdP を設定するには、以下の手順に従います:

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb を編集します:

    gitlab_rails['omniauth_providers'] = [
      {
        name: 'saml', # This must match the following name configuration parameter
        label: 'Provider 1' # Differentiate the two buttons and providers in the UI
        args: {
                name: 'saml', # This is mandatory and must match the provider name
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback', # URL must match the name of the provider
                strategy_class: 'OmniAuth::Strategies::SAML',
                ... # Put here all the required arguments similar to a single provider
              },
      },
      {
        name: 'saml_2', # This must match the following name configuration parameter
        label: 'Provider 2' # Differentiate the two buttons and providers in the UI
        args: {
                name: 'saml_2', # This is mandatory and must match the provider name
                assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml_2/callback', # URL must match the name of the provider
                strategy_class: 'OmniAuth::Strategies::SAML',
                ... # Put here all the required arguments similar to a single provider
              },
      }
    ]
    

    どちらのプロバイダからも手動でアカウントを作成しなくても、ユーザが SAML を使用してサインアップできるようにするには、設定に以下の値を追加します:

    gitlab_rails['omniauth_allow_single_sign_on'] = ['saml', 'saml_2']
    
  2. ファイルを保存して GitLab を再設定してください:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. 最初のSAMLプロバイダのKubernetesシークレットとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    name: 'saml' # At least one provider must be named 'saml'
    label: 'Provider 1' # Differentiate the two buttons and providers in the UI
    args:
      name: 'saml' # This is mandatory and must match the provider name
      assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback' # URL must match the name of the provider
      strategy_class: 'OmniAuth::Strategies::SAML' # Mandatory
      ... # Put here all the required arguments similar to a single provider
    
  2. 2番目のSAMLプロバイダのKubernetesシークレットとして使用するために、saml_2.yaml という名前のファイルに以下の内容を記述します:

    name: 'saml_2'
    label: 'Provider 2' # Differentiate the two buttons and providers in the UI
    args:
      name: 'saml_2' # This is mandatory and must match the provider name
      assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml_2/callback' # URL must match the name of the provider
      strategy_class: 'OmniAuth::Strategies::SAML' # Mandatory
      ... # Put here all the required arguments similar to a single provider
    
  3. オプション。同じ手順に従って、追加の SAML プロバイダを設定します。
  4. Kubernetesシークレットを作成します:

    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', # This must match the following name configuration parameter
                label: 'Provider 1' # Differentiate the two buttons and providers in the UI
                args: {
                        name: 'saml', # This is mandatory and must match the provider name
                        assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback', # URL must match the name of the provider
                        strategy_class: 'OmniAuth::Strategies::SAML',
                        ... # Put here all the required arguments similar to a single provider
                      },
              },
              {
                name: 'saml_2', # This must match the following name configuration parameter
                label: 'Provider 2' # Differentiate the two buttons and providers in the UI
                args: {
                        name: 'saml_2', # This is mandatory and must match the provider name
                        assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml_2/callback', # URL must match the name of the provider
                        strategy_class: 'OmniAuth::Strategies::SAML',
                        ... # Put here all the required arguments similar to a single provider
                      },
              }
            ]
    

    どちらのプロバイダからも手動でアカウントを作成しなくても、ユーザが 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', # This must match the following name configuration parameter
            label: 'Provider 1' # Differentiate the two buttons and providers in the UI
            args: {
              name: 'saml', # This is mandatory and must match the provider name
              assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml/callback', # URL must match the name of the provider
              strategy_class: 'OmniAuth::Strategies::SAML',
              ... # Put here all the required arguments similar to a single provider
            },
          }
          - {
            name: 'saml_2', # This must match the following name configuration parameter
            label: 'Provider 2' # Differentiate the two buttons and providers in the UI
            args: {
              name: 'saml_2', # This is mandatory and must match the provider name
              strategy_class: 'OmniAuth::Strategies::SAML',
              assertion_consumer_service_url: 'https://gitlab.example.com/users/auth/saml_2/callback', # URL must match the name of the provider
              ... # Put here all the required arguments similar to a single provider
            },
          }
    

    どちらのプロバイダからも手動でアカウントを作成しなくても、ユーザが SAML を使用してサインアップできるようにするには、設定に以下の値を追加します:

    production: &base
      omniauth:
        allow_single_sign_on: ["saml", "saml_2"]
    
  2. ファイルを保存して GitLab を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

ID プロバイダのセットアップ

GitLabがSAMLをサポートしているということは、様々なIdPを通してGitLabにサインインできるということです。

GitLabは、OktaとGoogleワークスペースIdPの設定に関する以下のコンテンツをガイダンスのためだけに提供しています。これらのIdPの設定についてご質問がある場合は、プロバイダのサポートにお問い合わせください。

Oktaの設定

  1. Okta管理者セクションで「アプリケーション」を選択します。
  2. アプリ画面で、「アプリインテグレーションを作成」を選択し、次の画面で「SAML 2.0」を選択します。
  3. オプション。GitLab Pressからロゴを選択して追加します。ロゴはトリミングしてサイズを変更する必要があります。
  4. SAMLの一般設定を完了します。入力します:
    • "Single sign-on URL":アサーション・コンシューマ・サービスの URL を使用します。
    • "Audience URI":発行者を使用します。
    • NameID.
    • アサーション
  5. フィードバック・セクションで、あなたが顧客であり、内部使用のアプリを作成していることを入力します。
  6. 新しいアプリのプロファイルの上部で、「SAML 2.0 設定手順」を選択します。
  7. Identity Provider Single Sign-On URL に注目してください。この URL を GitLab 設定ファイルのidp_sso_target_url に使用してください。
  8. Oktaからサインアウトする前に、ユーザーとグループがあれば追加してください。

Googleワークスペースを設定します。

前提条件:

  1. 以下の情報を使用し、Google Workspace で独自のカスタム SAML アプリケーションをセットアップする の手順に従ってください。

     標準的な値説明
    SAML アプリ名GitLab他の名前もOK
    ACS URLhttps://<GITLAB_DOMAIN>/users/auth/saml/callbackAssertion Consumer ServiceのURL。
    GITLAB_DOMAINgitlab.example.comGitLabインスタンスのドメイン。
    エンティティIDhttps://gitlab.example.comSAML アプリケーション固有の値。GitLab設定のissuer
    名前 ID 形式EMAIL必須。name_identifier_format としても知られています。
    名前ID主メールアドレスあなたのメールアドレスです。そのアドレスに送られたコンテンツが誰かに届くようにします。
    first_name名前。GitLabと通信するために必要な値です。
    last_name姓。GitLabと通信するために必要な値です。
  2. 以下の SAML 属性マッピングを設定します:

    Google Directory 属性アプリ属性
    基本情報 > Eメールemail
    基本情報 > 姓first_name
    基本情報 > 姓last_name

    この情報の一部は、GitLabでSAMLサポートを設定するときに使うかもしれません。

Google Workspace SAML アプリケーションを設定する際には、以下の情報を記録しておきましょう:

 説明
SSO URL依存Google Identity Providerの詳細。GitLabidp_sso_target_url 設定に設定します。
証明書ダウンロード可能 openssl x509 -in <your_certificate.crt> -noout -fingerprint -sha1 を実行して、idp_cert_fingerprint 設定で使用できる SHA1 フィンガープリントを生成します。

Google Workspace Administrator は、IdP メタデータ、エンティティ ID、SHA-256 フィンガープリントも提供します。しかし、GitLabはGoogleワークスペースSAMLアプリケーションに接続するためにこれらの情報を必要としません。

他のIdPの設定

一部の IdP には、SAML 構成で IdP として使用する方法に関する文書があります。例えば

SAML 構成での IdP の設定について不明な点がある場合は、プロバイダのサポートに問い合わせてください。

アサーションの設定

項目サポートされているデフォルトキー
Eメール(必須) email,mail
氏名name
first_name,firstnamefirstName
苗字 last_name,lastnamelastName

についてはattribute_statements を参照:

  • カスタムアサーション設定例。
  • カスタムユーザ名属性の設定方法

サポートしているアサーションの一覧はOmniAuth SAML gemを参照ください。

SAML グループメンバーシップに基づくユーザーの設定

以下のようなことができます:

  • ユーザーに特定のグループのメンバーであることを要求します。
  • グループのメンバーに基づいて、ユーザーに外部、管理者、監査役のロールを割り当てます。

GitLabはSAMLサインインごとにこれらのグループをチェックし、必要に応じてユーザー属性を更新します。この機能では、ユーザーをGitLabグループに自動的に追加することはできません

これらのグループのサポートは以下に依存します:

グループティアGitLab Enterprise Edition(EE) のみ?
必須はい
外部なし
管理者はい
監査役はい

前提条件:

  • 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 を識別するように設定します:

  • groups_attribute 設定を使って、SAML レスポンスでグループを探す場所。
  • グループ設定を使用した、グループまたはユーザに関する情報。

required_groups 設定を使用して、サインインするためにどのグループメンバーシップが必要かを識別するために GitLab を設定します。

required_groups を設定しないか、設定を空のままにすると、適切な認証があれば誰でもサービスを利用することができます。

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'
        }
      }
    ]
    
  2. ファイルを保存して GitLab を再設定してください:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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シークレットを作成します:

    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
    
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'
              }
            }
    
  2. ファイルを保存して GitLab を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

外部グループ

あなたのIdPは、SAMLレスポンスでグループ情報をGitLabに渡します。このレスポンスを使用するには、GitLab を識別するように設定します:

  • groups_attribute 設定を使って、SAML レスポンスでグループを探す場所。
  • グループ設定を使用した、グループまたはユーザに関する情報。

SAML は、external_groups 設定に基づいて、ユーザを自動的に内部ユーザとして識別できます。

設定例

Linux package (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 chart (Kubernetes)
  1. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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
    
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',
                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
    
Self-compiled (source)
  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 を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

管理者グループ

あなたのIdPは、SAMLレスポンスでグループ情報をGitLabに渡します。このレスポンスを使用するには、GitLab を識別するように設定します:

  • groups_attribute 設定を使って、SAML レスポンスでグループを探す場所。
  • グループ設定を使用した、グループまたはユーザに関する情報。

admin_groups 設定を使用して、GitLab がどのグループがユーザーに管理者アクセスを許可するかを識別するように設定します。

設定例

Linux package (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 chart (Kubernetes)
  1. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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
    
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',
                 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
    
Self-compiled (source)
  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 を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

監査役グループ

GitLab 11.4で導入されました。

あなたのIdPは、SAMLレスポンスでグループ情報をGitLabに渡します。このレスポンスを使用するには、GitLab を識別するように設定します:

  • groups_attribute 設定を使って、SAML レスポンスでグループを探す場所。
  • グループ設定を使用した、グループまたはユーザに関する情報。

auditor_groups 設定を使用して、監査アクセス権を持つユーザーを含むグループを識別するように GitLab を設定します。

設定例

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. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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シークレットを作成します:

    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 を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

SAMLグループ同期の自動管理

GitLab グループメンバーシップの自動管理については、SAML Group Syncをご覧ください。

二要素認証のバイパス

セッションごとに 2 要素認証 (2FA) としてカウントする SAML 認証方法を設定するには、その方法を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. インストール設定を編集して、SAML 認証方法をupstream_two_factor_authn_contexts リストに登録します。

    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. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

      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シークレットを作成します:

      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 を再起動します:

      # For systems running systemd
      sudo systemctl restart gitlab.target
            
      # For systems running SysV init
      sudo service gitlab restart
      

レスポンスシグネチャの検証

IdP は、アサーションが改ざんされていないことを確認するために、SAML 応答に署名する必要があります。

これにより、特定のグループ・メ ンバーシップが必要な場合に、ユーザのなりすましや特権の昇格が防止されます。

テストの拡張idp_cert_fingerprint

idp_cert_fingerprint を使用して応答署名検証を設定します。設定例です:

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'
        }
      }
    ]
    
  2. ファイルを保存して GitLab を再設定してください:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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シークレットを作成します:

    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
    
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'
              }
            }
    
  2. ファイルを保存して GitLab を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

テストの拡張idp_cert

あなたの IdP がidp_cert_fingerprint を使った設定をサポートしていない場合は、代わりにidp_cert を使って GitLab を直接設定することができます。設定例:

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: '-----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 chart (Kubernetes)
  1. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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シークレットを作成します:

    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
    
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: '-----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 を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

レスポンスシグネチャの検証の設定が間違っていると、以下のようなエラーメッセージが表示されるかもしれません:

  • キー検証エラー。
  • ダイジェストの不一致。
  • 指紋の不一致

これらのエラーの解決に関する詳細は、SAML トラブルシューティング・ガイドを参照してください。

SAML 設定のカスタマイズ

ユーザをSAMLサーバにリダイレクトして認証

GitLabの設定にauto_sign_in_with_provider の設定を追加することで、認証のために自動的にSAMLサーバーにリダイレクトさせることができます。これにより、実際にサインインする前に要素を選択する必要がなくなります。

Linux package (Omnibus)
  1. /etc/gitlab/gitlab.rb を編集します:

    gitlab_rails['omniauth_auto_sign_in_with_provider'] = 'saml'
    
  2. ファイルを保存して GitLab を再設定してください:

    sudo gitlab-ctl reconfigure
    
Helm chart (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
    
Self-compiled (source)
  1. /home/git/gitlab/config/gitlab.yml を編集します:

    production: &base
      omniauth:
        auto_sign_in_with_provider: 'saml'
    
  2. ファイルを保存して GitLab を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

サインインを試みるたびに SAML サーバーにリダイレクトされるので、ローカルの認証情報を使ってサインインすることはできません。SAMLユーザーの少なくとも一人が管理者権限を持っていることを確認してください。

note
自動サインイン設定をバイパスするには、サインイン URL に?auto_sign_in=false を追加します(例:https://gitlab.example.com/users/sign_in?auto_sign_in=false.

SAML 応答属性名のマップ

attribute_statements を使用して、SAML レスポンスの属性名を OmniAuthinfo ハッシュのエントリにマップできます。

info この設定は、OmniAuthinfo ハッシュ・スキーマの一部である属性をマップする場合にのみ使用します。

例えば、SAMLResponseEmailAddress という Attribute が含まれている場合、{ email: ['EmailAddress'] } を指定すると、その Attribute がinfo ハッシュの対応するキーにマップされます。URI 名を持つ Attribute もサポートされています。例えば、{ email: ['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress'] }

この設定は、アカウント作成に必要な特定の属性を探す場所を GitLab に伝えるために使います。例えば、IdP がユーザーのメールアドレスをemail ではなくEmailAddress として送信する場合、GitLab に設定で知らせてください:

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',
                attribute_statements: { email: ['EmailAddress'] }
        }
      }
    ]
    
  2. ファイルを保存して GitLab を再設定してください:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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シークレットを作成します:

    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
    
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',
                      attribute_statements: { email: ['EmailAddress'] }
              }
            }
    
  2. ファイルを保存して GitLab を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

ユーザー名の設定

デフォルトでは、SAML レスポンスのメールアドレスのローカル部分が、ユーザーの GitLab ユーザー名を生成するために使われます。

attribute_statementsusername またはnickname を設定し、ユーザーの希望するユーザー名を含む1つ以上のアトリビュートを指定します:

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',
                attribute_statements: { nickname: ['username'] }
        }
      }
    ]
    
  2. ファイルを保存して GitLab を再設定してください:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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シークレットを作成します:

    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',
                         attribute_statements: { nickname: ['username'] }
                 }
               }
            ]
    
  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',
                      attribute_statements: { nickname: ['username'] }
              }
            }
    
  2. ファイルを保存して GitLab を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

これで、SAML レスポンスのusername 属性も GitLab のユーザー名に設定されます。

クロックドリフトを許可

IdPのクロックは、システムのクロックよりもわずかに先にドリフトする可能性があります。わずかなクロック・ドリフトを許容するには、設定でallowed_clock_drift を使用します。パラメータの値は、数値と秒の端数で入力する必要があります。指定された値は、応答が検証される現在時刻に加算されます。

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',
                allowed_clock_drift: 1  # for one second clock drift
        }
      }
    ]
    
  2. ファイルを保存して GitLab を再設定してください:

    sudo gitlab-ctl reconfigure
    
Helm chart (Kubernetes)
  1. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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  # for one second clock drift
    
  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
    
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',
                         allowed_clock_drift: 1  # for one second clock drift
                 }
               }
            ]
    
  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',
                      allowed_clock_drift: 1  # for one second clock drift
              }
            }
    
  2. ファイルを保存して GitLab を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

GitLabのuid

uid を一意の属性に設定する前に、以下の属性を設定して、SAML ユーザが変更できないようにしてください:

  • NameID.
  • Email omniauth_auto_link_saml_user と併用した場合。

ユーザがこれらの属性を変更できる場合、他の作成者としてサインインできます。これらの属性を変更できないようにする方法については、SAML IdP のドキュメントを参照。

既定では、uid は、SAML 応答のname_id として設定されます。uid に対して一意の属性を指定するには、uid_attribute を設定します。以下の例では、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. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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シークレットを作成します:

    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 を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

アサーションの暗号化(オプション)

GitLab では、SAML 2.0 で TLS 暗号化を使用する必要があります。時には、GitLabは追加のアサーション暗号化を必要とします。例えば

  • ロードバランサーで TLS 暗号化を早期に終了する場合。
  • ログに出したくない機密情報をアサーションに含めること。

ほとんどの組織では、このレイヤでの追加の暗号化は必要ありません。

IdP は、GitLab の公開証明書でアサーションを暗号化します。GitLab はその秘密鍵でEncryptedAssertion を復号化します。

note
このインテグレーションでは、アサーションの暗号化とリクエスト署名の両方にcertificateprivate_key の設定を使用します。

SAML インテグレーションはEncryptedAssertion をサポートしています。アサーションを暗号化するには、SAML 設定で GitLab インスタンスの秘密鍵と公開証明書を定義します。

鍵と証明書を定義したら、鍵ファイルの改行コードをすべて\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. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

    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シークレットを作成します:

    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 を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

SAML 認証リクエストに署名する (オプション)

GitLab が SAML 認証リクエストに署名するように設定することができます。GitLab SAML リクエストは SAML リダイレクトバインディングを使うので、この設定はオプションです。

署名を実装するには

  1. GitLab インスタンスで SAML 用の秘密鍵と公開証明書のペアを作成します。
  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,  # enable signature on AuthNRequest
                    want_assertions_signed: true,  # enable the requirement of signed 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 を再設定してください:

      sudo gitlab-ctl reconfigure
      
    Helm chart (Kubernetes)
    1. Kubernetes Secretとして使用するため、saml.yaml という名前のファイルに以下の内容を記述します:

      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
          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. 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
      
    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
                             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,  # enable signature on AuthNRequest
                          want_assertions_signed: true,  # enable the requirement of signed 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 を再起動します:

      # For systems running systemd
      sudo systemctl restart gitlab.target
            
      # For systems running SysV init
      sudo service gitlab restart
      

GitLab を再起動します:

  • 提供された秘密鍵でリクエストに署名します。
  • 受信したリクエストの署名を検証するために、IdP のメタデータに設定された公開 x500 証明書を含めます。

このオプションの詳細については、Ruby SAML gem のドキュメントを参照してください。

Ruby SAML gem は、OmniAuth SAML gemが SAML 認証のクライアント側を実装する際に使用します。

note
SAML リダイレクトバインディングは、SAML POST バインディングとは異なります。POST バインディングでは、仲介者によるリクエストの改ざんを防ぐために署名が必要です。

SAML で作成されたユーザーのパスワード生成

GitLab はSAML を通じて作成されたユーザーのパスワードを生成し、設定します。

SSOやSAMLで認証されたユーザーは、HTTPS上でのGitオペレーションにパスワードを使用してはいけません。これらのユーザーは代わりに

管理者は、SAMLユーザーを既存のGitLabユーザーと自動的にリンクするようにGitLabを設定することができます。詳しくは、GitLabでSAMLサポートを設定するをご覧ください。

ユーザーは手動でSAMLアイデンティティを既存のGitLabアカウントにリンクさせることができます。詳しくは、既存のユーザーのOmniAuthを有効にするをご覧ください。

セルフマネージドインスタンスでのグループ SAML SSO の設定

自己管理インスタンスで複数の SAML IdP を介したアクセスを許可する必要がある場合は、グループ SAML SSO を使用します。

グループ SAML SSO を設定するには、以下の手順に従います:

Linux package (Omnibus)
  1. GitLab がHTTPS で設定されていることを確認します。
  2. /etc/gitlab/gitlab.rb を編集し、OmniAuth とgroup_saml プロバイダを有効にします:

    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. Kubernetes Secretとして使用するため、group_saml.yaml という名前のファイルに以下の内容を記述します:

    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 を再起動します:

    # For systems running systemd
    sudo systemctl restart gitlab.target
       
    # For systems running SysV init
    sudo service gitlab restart
    

マルチテナント・ソリューションとして、自己管理インスタンス上のグループ SAML は、推奨されるインスタンス全体の SAML に比べて制限されます。インスタンスワイドSAMLを利用してください:

IdP 上の SAML アプリの追加設定

IdP で SAML アプリを設定する場合、IdP で以下のような追加設定が必要になることがあります:

項目備考
SAMLプロファイルWebブラウザSSOプロファイルGitLabはSAMLを使ってブラウザからユーザーにサインインします。IdPへの直接のリクエストは行われません。
SAML リクエストバインディングHTTPリダイレクトGitLab (SP) は、base64 エンコードされたSAMLRequest HTTP パラメータを使ってユーザーを IdP にリダイレクトします。
SAML レスポンスのバインディングHTTP POSTIdP から SAML トークンを送信する方法を指定します。ユーザーのブラウザが GitLab に送り返すSAMLResponse を含みます。
SAML レスポンスの署名必須いたずら防止
レスポンスのX.509証明書必須レスポンスに署名し、提供されたフィンガープリントと照合します。
フィンガープリントのアルゴリズムSHA-1GitLab は証明書の SHA-1 ハッシュを使って SAML レスポンスに署名します。
署名アルゴリズムSHA-1/SHA-256/SHA-384/SHA-512応答の署名方法を決定します。ダイジェスト方式とも呼ばれ、SAML 応答で指定できます。
SAML アサーションを暗号化します。オプションIDプロバイダ、ユーザーのブラウザ、GitLabの間でTLSを使用します。
SAML アサーションに署名します。オプションSAML アサーションの整合性を検証します。アクティブな場合、応答全体に署名します。
SAML 要求の署名の確認オプションSAML 応答の署名をチェックします。
デフォルトの RelayStateオプションユーザが IdP で SAML によるサインインに成功した後に到達するベース URL のサブパスを指定します。
NameID 形式永続的 NameID フォーマットの詳細を参照してください。
追加URLオプションプロバイダによっては、他のフィールドに発行者、識別子、またはアサーション・コンシューマ・サービ スの URL を含めることができます。

設定例については、特定のプロバイダに関する注記を参照。

用語解説

用語説明
アイデンティティ・プロバイダ(IdP)OktaやOneLoginなど、ユーザーIDを管理するサービス。
サービスプロバイダ(SP)ユーザーを認証するために、OktaなどのSAML IdPからアサーションを消費します。GitLab を SAML 2.0 SP として設定できます。
アサーション名前やロールなど、ユーザーの身元に関する情報の一部。クレームまたは属性とも呼ばれます。
シングルサインオン(SSO)認証スキームの名前。
アサーション・コンシューマー・サービスURLIdPとの認証に成功した後、ユーザーがリダイレクトされるGitLab上のコールバック。
発行元GitLabがIdPに対して自身を識別する方法。Relying party trust identifier」とも呼ばれます。
証明書フィンガープリントサーバが正しい証明書で通信に署名していることを確認することで、SAML を介した通信がセキュリ ティであることを確認します。証明書サムプリントとも呼ばれます。

トラブルシューティング

SAML のトラブルシューティング・ガイドを参照してください。