Help us learn about your current experience with the documentation. Take the survey.

Geo 与单点登录 (SSO)

  • 版本:Premium, Ultimate
  • 产品:GitLab Self-Managed

本文档仅讨论 Geo 特有的 SSO 注意事项和配置。有关通用身份验证的更多信息,请参阅 GitLab 身份验证与授权

配置实例级范围的 SAML

前提条件

实例级范围的 SAML 必须已在您的主 Geo 站点上正常运行。

您只需在主站点上配置 SAML。在辅助站点的 gitlab.rb 文件中配置 gitlab_rails['omniauth_providers'] 不会生效。辅助站点将通过在主站点上配置的 SAML 提供商进行身份验证。根据辅助站点的 URL 类型,主站点上可能需要进行额外配置

确定您的辅助站点使用的 URL 类型

配置实例级范围 SAML 的方式会因您的辅助站点配置而异。请确定您的辅助站点使用的是:

  • 统一 URL,即 external_url 与主站点的 external_url 完全相同。
  • 独立 URL 并启用了代理。在 GitLab 15.1 及更高版本中,代理默认启用。
  • 独立 URL 并禁用了代理。

使用统一 URL 的 SAML

如果您已在主站点上正确配置了 SAML,那么它应该无需额外配置即可在辅助站点上工作。

使用独立 URL 且启用代理的 SAML

启用代理后,只有当您的 SAML 身份提供商 (IdP) 允许为一个应用配置多个回调 URL 时,SAML 才能用于登录辅助站点。请联系您的 IdP 提供商支持团队以确认是否支持此功能。

如果辅助站点使用的 external_url 与主站点不同,那么您需要配置您的 SAML 身份提供商 (IdP) 以允许辅助站点的 SAML 回调 URL。例如,配置 Okta 的步骤如下:

  1. 登录 Okta
  2. 前往 Okta 管理员面板 > 应用程序 > 您的应用名称 > 常规
  3. SAML 设置 中,选择 编辑
  4. 常规设置 中,选择 下一步 以进入 SAML 设置
  5. SAML 设置 > 常规 中,确保 单点登录 URL 是您主站点的 SAML 回调 URL。例如,https://gitlab-primary.example.com/users/auth/saml/callback。如果不是,请在此字段中输入您主站点的 SAML 回调 URL。
  6. 选择 显示高级设置
  7. 其他可请求的 SSO URL 中,输入您辅助站点的 SAML 回调 URL。例如,https://gitlab-secondary.example.com/users/auth/saml/callback。您可以将 索引 设置为任意值。
  8. 选择 下一步,然后选择 完成

您不得在主站点 gitlab.rb 文件的 gitlab_rails['omniauth_providers'] 中的 SAML 提供商配置里指定 assertion_consumer_service_url。例如:

gitlab_rails['omniauth_providers'] = [
  {
    name: "saml",
    label: "Okta", # optional label for login button, defaults to "Saml"
    args: {
      idp_cert_fingerprint: "B5:AD:AA:9E:3C:05:68:AD:3B:78:ED:31:99:96:96:43:9E:6D:79:96",
      idp_sso_target_url: "https://<dev-account>.okta.com/app/dev-account_gitlabprimary_1/exk7k2gft2VFpVFXa5d1/sso/saml",
      issuer: "https://<gitlab-primary>",
      name_identifier_format: "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent"
    }
  }
]

此配置将导致:

  • 您的两个站点都将使用 /users/auth/saml/callback 作为其断言消费者服务 (ACS) URL。
  • URL 的主机将被设置为相应站点的主机。

您可以通过访问每个站点的 /users/auth/saml/metadata 路径来检查这一点。例如,访问 https://gitlab-primary.example.com/users/auth/saml/metadata 可能会返回:

<md:EntityDescriptor ID="_b9e00d84-d34e-4e3d-95de-122e3c361617" entityID="https://gitlab-primary.example.com"
  xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
  <md:SPSSODescriptor AuthnRequestsSigned="false" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://gitlab-primary.example.com/users/auth/saml/callback"    index="0" isDefault="true"/>
    <md:AttributeConsumingService index="1" isDefault="true">
      <md:ServiceName xml:lang="en">Required attributes</md:ServiceName>
      <md:RequestedAttribute FriendlyName="Email address" Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
      <md:RequestedAttribute FriendlyName="Full name" Name="name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
      <md:RequestedAttribute FriendlyName="Given name" Name="first_name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
      <md:RequestedAttribute FriendlyName="Family name" Name="last_name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
    </md:AttributeConsumingService>
  </md:SPSSODescriptor>
</md:EntityDescriptor>

访问 https://gitlab-secondary.example.com/users/auth/saml/metadata 可能会返回:

<md:EntityDescriptor ID="_bf71eb57-7490-4024-bfe2-54cec716d4bf" entityID="https://gitlab-primary.example.com"
  xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
  xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">
  <md:SPSSODescriptor AuthnRequestsSigned="false" WantAssertionsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol">
    <md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat>
    <md:AssertionConsumerService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://gitlab-secondary.example.com/users/auth/saml/callback"    index="0" isDefault="true"/>
    <md:AttributeConsumingService index="1" isDefault="true">
      <md:ServiceName xml:lang="en">Required attributes</md:ServiceName>
      <md:RequestedAttribute FriendlyName="Email address" Name="email" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
      <md:RequestedAttribute FriendlyName="Full name" Name="name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
      <md:RequestedAttribute FriendlyName="Given name" Name="first_name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
      <md:RequestedAttribute FriendlyName="Family name" Name="last_name" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic" isRequired="false"/>
    </md:AttributeConsumingService>
  </md:SPSSODescriptor>
</md:EntityDescriptor>

md:AssertionConsumerService 字段的 Location 属性指向 gitlab-secondary.example.com

在您的 SAML IdP 配置为允许辅助站点的 SAML 回调 URL 后,您应该能够在主站点和辅助站点上都使用 SAML 登录。

使用独立 URL 且禁用代理的 SAML

如果您已在主站点上正确配置了 SAML,那么它应该无需额外配置即可在辅助站点上工作。

OpenID Connect

如果您使用 OpenID Connect (OIDC) OmniAuth 提供商,在大多数情况下,它应该可以正常工作:

  • 使用统一 URL 的 OIDC:如果您已在主站点上正确配置了 OIDC,那么它应该无需额外配置即可在辅助站点上工作。
  • 使用独立 URL 且禁用代理的 OIDC:如果您已在主站点上正确配置了 OIDC,那么它应该无需额外配置即可在辅助站点上工作。
  • 使用独立 URL 且启用代理的 OIDC:使用独立 URL 且启用代理的 Geo 不支持 OpenID Connect。更多信息,请参阅 issue 396745

LDAP

如果您在站点上使用 LDAP,您还应该在每个辅助站点上设置辅助 LDAP 服务器。否则,用户将无法在辅助站点上使用 HTTP 基本身份验证通过 HTTP(s) 执行 Git 操作。但是,用户仍然可以使用 SSH 和个人访问令牌来使用 Git。

所有辅助站点可以共享一个 LDAP 服务器,但这可能会导致额外的延迟问题。此外,还需考虑在灾难恢复场景中,如果某个辅助站点被提升为站点,可用的 LDAP 服务器是哪个。

请查阅您的 LDAP 服务文档,了解如何在您的 LDAP 服务中设置复制的说明。该过程因所使用的软件或服务而异。例如,OpenLDAP 提供了这份复制文档