针对 FreeIPA 服务器的 Gitlab ldap 登录卡在设置的电子邮件循环中

Gitlabs ldap login against FreeIPA server stuck in a set email loop

我已经安装了 Gitlabs community edition v7.6.2 并且正在尝试使用 FreeIPA 服务器作为其用户管理的 ldap 解决方案。基本上它看起来工作正常,我设法使用我的 ldap 服务器提供的帐户登录。但是,当我登录时,我卡在了用户编辑页面上。在此页面上,我无法更改电子邮件,但看起来 Gitlabs 正在期待对其自动生成的电子邮件进行适当的替换。

我在 FreeIPA 上创建了名为 bob 的用户,邮件地址为 bob@testdomain.com。

ldapsearch -x -h localhost uid=bob

dn: uid=bob,cn=users,cn=accounts,dc=testdomain,dc=com
displayName: bob bob
cn: bob bob
objectClass: top
objectClass: person
objectClass: organizationalperson
objectClass: inetorgperson
objectClass: inetuser
objectClass: posixaccount
objectClass: krbprincipalaux
objectClass: krbticketpolicyaux
objectClass: ipaobject
objectClass: ipasshuser
objectClass: ipaSshGroupOfPubKeys
objectClass: mepOriginEntry
loginShell: /bin/sh
sn: bob
gecos: bob bob
homeDirectory: /home/bob
krbPwdPolicyReference: cn=global_policy,cn=TESTDOMAIN.COM,cn=kerberos,dc=testdomain,dc=com
mail: bob@testdomain.com 
krbPrincipalName: bob@TESTDOMAIN.COM
givenName: bob
uid: bob
initials: bb
ipaUniqueID: d7c3d5bc-abb3-11e4-a1d6-080027079e3d
uidNumber: 497600001
gidNumber: 497600001
krbPasswordExpiration: 20150203144923Z
krbLastPwdChange: 20150203144923Z
krbExtraData:: AALz39BUcm9vdC9hZG1pbkBBTUJBUkkuQVBBQ0hFLk9SRwA=
mepManagedEntry: cn=bob,cn=groups,cn=accounts,dc=testdomain,dc=com

并编辑 /etc/gitlab/gitlab.rb 以在没有绑定用户的情况下与我的 ldap 目录对话:

gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_host'] = 'ldap.testdomain.com'
gitlab_rails['ldap_port'] = 389
gitlab_rails['ldap_uid'] = 'uid'
gitlab_rails['ldap_method'] = 'plain'
gitlab_rails['ldap_allow_username_or_email_login'] = true
gitlab_rails['ldap_base'] = 'dc=testdomain,dc=com'

如果我此时尝试登录,就可以了。它接受 bob 的密码。但是,配置文件设置页面没有显示通常的登录页面,而是显示了一条非常模棱两可的消息。

所以我必须更改电子邮件地址,这是此对话框中唯一完全不可更改的字段。我认为这是由于 Gitlab 依赖 ldap 提供邮件地址。我的 ldap 确实根据 ldapsearch 命令提供了这个字段,但是 Gitlab 似乎无法接受这个。我在此页面中关注的每个 link 都会重定向到此页面。所以基本上我创造了一块砖。

为了完整,这是在我的 /var/log/gitlab/gitlab-rails/application.log:

# Logfile created on 2015-02-03 10:53:07 +0000 by logger.rb/44203
February 03, 2015 10:53: User "Administrator" (admin@example.com) was created
February 03, 2015 15:22: User "bob bob" (temp-email-for-oauth-bob@gitlab.localhost) was created
February 03, 2015 15:22: (OAuth) saving user temp-email-for-oauth-bob@gitlab.localhost from login with extern_uid => uid=bob,cn=users,cn=compat,dc=testdomain,dc=com

有人知道如何解决这个问题吗?非常感激!

将你的基础 dn('ldap_base' 在 gitlab 中说)更改为 'cn=accounts,dc=testdomain,dc=com'

我认为 gitlab 对通过兼容树返回的条目感到困惑 -- FreeIPA 支持通过 RFC2307 模式公开用户和组。如果你使用 $SUFFIX ('dc=testdomain,dc=com'),primary 和 compat 条目都会匹配,gitlab 会选择第一个返回的条目,通常是 compat 树条目。 Compat 条目用于旧 UNIX 客户端(nss_ldap、Solaris 等)的身份映射,因此它只有 RFC2307 属性而没有邮件属性。

此外,请确保您使用的是经过身份验证的绑定。使用 FreeIPA 4.x 可以防止大多数属性通过匿名绑定泄露信息,'mail' 是只有经过身份验证的绑定才能访问的属性之一。