SAML OmniAuth提供者
可以将GitLab配置为SAML 2.0服务提供者(SP)。这允许GitLab使用来自SAML 2.0身份提供者(IdP)(如Microsoft ADFS)的断言来对用户进行身份验证。
首先在GitLab中配置SAML 2.0支持,然后在你的SAML IdP中注册GitLab应用程序:
确保GitLab配置了HTTPS。看到使用HTTPS的指令。
在GitLab服务器上,打开配置文件。
综合包:
sudo编辑/etc/gitlab/gitlab.rb
从源代码安装:
cd/home/git/gitlabsudo- ugit- h编辑配置/ gitlab.yml
看到初始OmniAuth配置用于初始设置。
为了允许您的用户使用SAML注册,而不必首先手动创建帐户,不要忘记向您的配置中添加以下值:
综合包:
gitlab_rails[“omniauth_allow_single_sign_on”]=[saml的]gitlab_rails[“omniauth_block_auto_created_users”]=假
从源代码安装:
allow_single_sign_on:["saml”]block_auto_created_users:假
您还可以通过添加以下设置自动将SAML用户与现有的GitLab用户链接,如果他们的电子邮件地址匹配:
综合包:
gitlab_rails[“omniauth_auto_link_saml_user”]=真正的
从源代码安装:
auto_link_saml_user:真正的
添加提供者配置:
综合包:
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_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”}
将值更改为
assertion_consumer_service_url
以匹配GitLab的HTTPS端点用户/认证/ saml /回调
到GitLab安装的HTTPS URL以生成正确的值)。更改的值
idp_cert_fingerprint
,idp_sso_target_url
,name_identifier_format
以配合你的IdP。如果使用指纹,则必须是SHA1指纹;检查omniauth-saml文档有关这些选项的详细信息。更改的值
发行人
到唯一的名称,该名称将向IdP标识应用程序。中指定的应用程序名称,在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_name
,last_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_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:持久的}}
定制
auto_sign_in_with_provider
您可以将此设置添加到GitLab配置中,以自动将您重定向到SAML服务器进行身份验证,从而无需在实际登录之前单击按钮。
综合包:
gitlab_rails[“omniauth_auto_sign_in_with_provider”]=saml的
从源代码安装:
omniauth:auto_sign_in_with_provider:saml
请记住,每次登录尝试都将被重定向到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_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:持久的,attribute_statements:{电子邮件:['EmailAddress”]}}
allowed_clock_drift
身份提供程序的时钟可能比您的系统时钟稍微快一点。为了允许少量的时钟漂移,您可以使用allowed_clock_drift
在您的设置中。它的值必须以秒的数字(和/或分数)给出。给定的值将添加到验证响应的当前时间。
arg游戏:{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:持久的,attribute_statements:{电子邮件:['EmailAddress”]},allowed_clock_drift:1# 1秒时钟漂移}
故障排除
登录后500错误
如果当您从SAML登录页面重定向回来时,在GitLab中看到“500错误”,这可能表明GitLab无法获取SAML用户的电子邮件地址。
确保IdP使用索赔名称提供包含用户电子邮件地址的索赔电子邮件
或邮件
.
重定向回登录屏幕,没有明显的错误
如果在登录到SAML服务器后,您被重定向回登录页面,并且没有显示错误,请检查您的production.log
文件。它很可能包含消息无法验证CSRF令牌的真实性
.这意味着在SAML请求期间有一个错误,但是由于CSRF检查,这个错误从未到达GitLab。
为了绕过这个,你可以添加skip_before_action: verify_authenticity_token
到omniauth_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 >
) - 如果在设置中提供了证书,则请求不再需要包含证书。在这种情况下,指纹或指纹验证器是可选的
请确保上述描述的场景之一是有效的,否则请求将因其中一个提到的错误而失败。