SAML OmniAuth提供者

可以将GitLab配置为SAML 2.0服务提供者(SP)。这允许GitLab使用来自SAML 2.0身份提供者(IdP)(如Microsoft ADFS)的断言来对用户进行身份验证。

首先在GitLab中配置SAML 2.0支持,然后在你的SAML IdP中注册GitLab应用程序:

  1. 确保GitLab配置了HTTPS。看到使用HTTPS的指令。

  2. 在GitLab服务器上,打开配置文件。

    综合包:

    sudo编辑/etc/gitlab/gitlab.rb

    从源代码安装:

    cd/home/git/gitlabsudo- ugit- h编辑配置/ gitlab.yml
  3. 看到初始OmniAuth配置用于初始设置。

  4. 为了允许您的用户使用SAML注册,而不必首先手动创建帐户,不要忘记向您的配置中添加以下值:

    综合包:

    gitlab_rails“omniauth_allow_single_sign_on”saml的gitlab_rails“omniauth_block_auto_created_users”

    从源代码安装:

    allow_single_sign_onsaml”block_auto_created_users
  5. 您还可以通过添加以下设置自动将SAML用户与现有的GitLab用户链接,如果他们的电子邮件地址匹配:

    综合包:

    gitlab_rails“omniauth_auto_link_saml_user”真正的

    从源代码安装:

    auto_link_saml_user真正的
  6. 添加提供者配置:

    综合包:

    gitlab_rails“omniauth_providers”名称:saml的参数:assertion_consumer_service_url:“https://gitlab.example.com/users/auth/saml/callback”idp_cert_fingerprint:“43:51:43:a1: b5: fc: 8 b: b7:0a: 3: a9: b1:0f: 66:73: a8的idp_sso_target_url:“https://login.example.com/idp”发行机构:“https://gitlab.example.com”name_identifier_format:“urn: oasis:名字:tc: SAML: 2.0: nameid-format:持久的},标签:“公司登录”# SAML登录按钮的可选标签,默认为“SAML”

    从源代码安装:

    -名字saml的arg游戏assertion_consumer_service_urlhttps://gitlab.example.com/users/auth/saml/callback的idp_cert_fingerprint43:51:43: a1: b5: fc: 8 b: b7:0a: 3: a9: b1:0f: 66:73: a8idp_sso_target_urlhttps://login.example.com/idp的发行人https://gitlab.example.com的name_identifier_formaturn: oasis:名字:tc: SAML 2.0: nameid-format:持久的},标签公司登录的# SAML登录按钮的可选标签,默认为“SAML”
  7. 将值更改为assertion_consumer_service_url以匹配GitLab的HTTPS端点用户/认证/ saml /回调到GitLab安装的HTTPS URL以生成正确的值)。

  8. 更改的值idp_cert_fingerprintidp_sso_target_urlname_identifier_format以配合你的IdP。如果使用指纹,则必须是SHA1指纹;检查omniauth-saml文档有关这些选项的详细信息。

  9. 更改的值发行人到唯一的名称,该名称将向IdP标识应用程序。

  10. 为了使更改生效,您必须重新配置如果您通过Omnibus或GitLab安装重启GitLab如果从源代码安装。

  11. 中指定的应用程序名称,在SAML 2.0 IdP中注册GitLab SP发行人

为了简化配置,大多数IdP接受应用程序的元数据URL,以便向IdP提供配置信息。要为GitLab构建元数据URL,请添加用户/认证/ saml /元数据到GitLab安装的HTTPS URL,例如:

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

至少是IdP必须使用索赔名称提供包含用户电子邮件地址的索赔电子邮件邮件.该电子邮件将用于自动生成GitLab用户名。GitLab还将使用带有名称的声明名字first_namelast_name(见万能的宝石对于支持的索赔)。

在登录页面上,常规的登录表单下面应该有一个SAML按钮。单击图标开始身份验证过程。如果一切顺利,用户将返回到GitLab并登录。

基于SAML组将用户标记为外部

注意:此设置仅在GitLab 8.7及以上版本上可用。

SAML登录包括自动识别用户是否应该被视为用户的支持外部基于用户在SAML标识提供程序中的组成员资格的用户。这个特性允许您自动向GitLab添加用户,它只允许您将用户标记为外部,如果他们是身份提供程序中某些组的成员。

需求

首先,您需要告诉GitLab在哪里查找组信息。为此,您需要确保您的IdP服务器发送一个特定的AttributeStament以及常规的SAML响应。这里有一个例子:

< saml: AttributeStatement >< saml:属性Name =“组织”>< saml: AttributeValuexsi: type =“xs: string”>SecurityGroup< / saml: AttributeValue >< saml: AttributeValuexsi: type =“xs: string”>开发人员< / saml: AttributeValue >< saml: AttributeValuexsi: type =“xs: string”>设计师< / saml: AttributeValue >< / saml:属性>< / saml: AttributeStatement >

属性的名称可以是您喜欢的任何名称,但必须包含用户所属的组。为了告诉GitLab在哪里可以找到这些组,您需要添加一个groups_attribute:元素添加到SAML设置中。您还需要告诉GitLab哪些组是外部的external_groups:元素:

名字saml的标签我们的SAML供应商的groups_attribute组的external_groups自由职业者的实习生的),arg游戏assertion_consumer_service_urlhttps://gitlab.example.com/users/auth/saml/callback的idp_cert_fingerprint43:51:43: a1: b5: fc: 8 b: b7:0a: 3: a9: b1:0f: 66:73: a8idp_sso_target_urlhttps://login.example.com/idp的发行人https://gitlab.example.com的name_identifier_formaturn: oasis:名字:tc: SAML 2.0: nameid-format:持久的

定制

auto_sign_in_with_provider

您可以将此设置添加到GitLab配置中,以自动将您重定向到SAML服务器进行身份验证,从而无需在实际登录之前单击按钮。

综合包:

gitlab_rails“omniauth_auto_sign_in_with_provider”saml的

从源代码安装:

omniauthauto_sign_in_with_providersaml

请记住,每次登录尝试都将被重定向到SAML服务器,因此您将无法使用本地凭据进行登录。确保SAML用户中至少有一个具有管理权限。

您也可以通过浏览到来绕过自动登录功能https://gitlab.example.com/users/sign_in?auto_sign_in=false

attribute_statements

注意:此设置仅在GitLab 8.6及以上版本上可用。此设置应仅用于映射属于OmniAuth信息散列模式的属性。

attribute_statements用于将SAMLResponse中的属性名称映射到OmniAuth信息哈希

例如,如果您的SAMLResponse包含一个名为“EmailAddress”的属性,请指定{email: ['EmailAddress']}将属性映射到信息散列中相应的键。还支持uri命名的属性,例如:{email: ['http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress']}

此设置允许您告诉GitLab在哪里查找创建帐户所需的某些属性。如上所述,如果您的IdP将用户的电子邮件地址发送为EmailAddress而不是电子邮件,在你的配置中设置它,让GitLab知道:

arg游戏assertion_consumer_service_urlhttps://gitlab.example.com/users/auth/saml/callback的idp_cert_fingerprint43:51:43: a1: b5: fc: 8 b: b7:0a: 3: a9: b1:0f: 66:73: a8idp_sso_target_urlhttps://login.example.com/idp的发行人https://gitlab.example.com的name_identifier_formaturn: oasis:名字:tc: SAML 2.0: nameid-format:持久的attribute_statements电子邮件EmailAddress”

allowed_clock_drift

身份提供程序的时钟可能比您的系统时钟稍微快一点。为了允许少量的时钟漂移,您可以使用allowed_clock_drift在您的设置中。它的值必须以秒的数字(和/或分数)给出。给定的值将添加到验证响应的当前时间。

arg游戏assertion_consumer_service_urlhttps://gitlab.example.com/users/auth/saml/callback的idp_cert_fingerprint43:51:43: a1: b5: fc: 8 b: b7:0a: 3: a9: b1:0f: 66:73: a8idp_sso_target_urlhttps://login.example.com/idp的发行人https://gitlab.example.com的name_identifier_formaturn: oasis:名字:tc: SAML 2.0: nameid-format:持久的attribute_statements电子邮件EmailAddress”},allowed_clock_drift1# 1秒时钟漂移

故障排除

登录后500错误

如果当您从SAML登录页面重定向回来时,在GitLab中看到“500错误”,这可能表明GitLab无法获取SAML用户的电子邮件地址。

确保IdP使用索赔名称提供包含用户电子邮件地址的索赔电子邮件邮件

重定向回登录屏幕,没有明显的错误

如果在登录到SAML服务器后,您被重定向回登录页面,并且没有显示错误,请检查您的production.log文件。它很可能包含消息无法验证CSRF令牌的真实性.这意味着在SAML请求期间有一个错误,但是由于CSRF检查,这个错误从未到达GitLab。

为了绕过这个,你可以添加skip_before_action: verify_authenticity_tokenomniauth_callbacks_controller.rb中的protect_from_forgery使用然后重启Unicorn。这将允许错误击中GitLab,在那里它可以在通常的日志中看到,或者作为登录屏幕上的flash消息。

该文件位于/ opt / gitlab /嵌入式/服务/ gitlab-rails / app /控制器用于Omnibus安装,默认在/home/git/gitlab/app/controllers用于从源安装。使用Sudo gitlab-ctl restart unicorn对Omnibus安装和Sudo服务gitlab重启从源安装。

你也可以找到SSO示踪剂(Firefox),SAML Chrome面板(Chrome)浏览器扩展在你的调试有用。

无效的观众

这个错误意味着IdP不承认GitLab是SAML请求的有效发送方和接收方。确保将GitLab回调URL添加到IdP服务器的批准受众。

失踪的索赔

IdP服务器需要传递某些信息,以便GitLab创建一个帐户,或者将登录信息与现有帐户匹配。电子邮件是需要传递的最小信息量。如果IdP服务器不提供此信息,则所有SAML请求都将失败。

确保提供了这些信息。

密钥验证错误,摘要不匹配或指纹不匹配

这些错误都来自一个相似的地方,即SAML证书。SAML请求需要使用指纹、证书或验证器进行验证。

为此,你需要考虑以下几点:

  • 如果使用指纹,必须是SHA1指纹
  • 如果设置中没有提供证书,则需要提供指纹或指纹验证器,并且来自服务器的响应必须包含证书(< ds: KeyInfo > < ds: X509Data > < ds: X509Certificate >
  • 如果在设置中提供了证书,则请求不再需要包含证书。在这种情况下,指纹或指纹验证器是可选的

请确保上述描述的场景之一是有效的,否则请求将因其中一个提到的错误而失败。

Baidu
map