无法从 Ldapmain 对您进行身份验证,因为“user.name 的凭据无效”

Gil*_*not 7 authentication ldap gitlab

我用

\n\n
    \n
  • Debian 9
  • \n
  • gitlab-ce 11.10.4-ce.0
  • \n
  • 通过 apt 进行综合安装
  • \n
  • openldap 2.4.44
  • \n
\n\n

ldap配置

\n\n

已配置/etc/ldap/ldap.conf

\n\n
BASE    dc=serverX,dc=lan\nURI     ldap://serverX.lan\nTLS_CACERT  /etc/ssl/certs/ca-certificates.crt\n
Run Code Online (Sandbox Code Playgroud)\n\n

已配置/etc/gitlab/gitlab.rb

\n\n
gitlab_rails[\'ldap_enabled\'] = true\ngitlab_rails[\'ldap_servers\'] = YAML.load <<-EOS\n  label: \'Gitlab LDAP\'\n  host: \'10.0.0.1\'\n  port: 389\n  uid: \'sAMAccountName\'\n  method: \'plain\' #\xc2\xa0"tls" or "ssl" or "plain"\n  bind_dn: \'cn=admin,ou=users,dc=serverX,dc=lan\'\n  password: \'xxxx\'\n  encryption: \'plain\'\n  active_directory: false\n  allow_username_or_email_login: true\n  block_auto_created_users: false\n  base: \'ou=users,dc=serverX,dc=lan\'\nEOS\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出gitlab-rake gitlab:ldap:check正常:

\n\n
# gitlab-rake gitlab:ldap:check\nChecking LDAP ...\n\nLDAP: ... Server: ldapmain\nLDAP authentication... Success\nLDAP users with access to your GitLab server (only showing the first 100 results)\n\nChecking LDAP ... Finished\n
Run Code Online (Sandbox Code Playgroud)\n\n

创建的用户:

\n\n

在此输入图像描述

\n\n

搜索了大量的网络资源,但我无法弄清楚创建 LDAP 用户或使用现有用户的方法。

\n\n

我不知道问题是什么以及为什么我得到Invalid credentials for user.name:我通过phpladmin属性进行编辑Passwordmd5在 LDAP Gitlab 登录页面中键入相同的属性:

\n\n

在此输入图像描述

\n\n

亚特实验室日志:

\n\n
==> /var/log/gitlab/gitlab-rails/production.log <==\nStarted POST "/users/auth/ldapmain/callback" for 10.0.0.1 at 2019-05-16 07:56:16 +0200\nProcessing by OmniauthCallbacksController#failure as HTML\n  Parameters: {"utf8"=>"\xe2\x9c\x93", "authenticity_token"=>"[FILTERED]", "username"=>"user.name", "password"=>"[FILTERED]"}\nRedirected to http://domainX.lan/users/sign_in\nCompleted 302 Found in 411ms (ActiveRecord: 23.1ms)\nStarted GET "/users/sign_in" for 10.0.0.1 at 2019-05-16 07:56:17 +0200\nProcessing by SessionsController#new as HTML\nCompleted 200 OK in 119ms (Views: 104.6ms | ActiveRecord: 7.5ms)\n\n==> /var/log/gitlab/unicorn/unicorn_stdout.log <==\nI, [2019-05-16T07:56:16.907169 #3996]  INFO -- omniauth: (ldapmain) Callback phase initiated.\nE, [2019-05-16T07:56:16.917884 #3996] ERROR -- omniauth: (ldapmain) Authentication failure! invalid_credentials: OmniAuth::Strategies::LDAP::InvalidCredentialsError, Invalid credentials for user.name\n
Run Code Online (Sandbox Code Playgroud)\n\n

slapcat目标用户登录的输出

\n\n
dn: uuid=gquenot,ou=users,dc=serverX,dc=lan\ncn:: abcdef123456789==\nsn: Foo Bar\nobjectClass: inetOrgPerson\nobjectClass: top\nstructuralObjectClass: inetOrgPerson\nentryUUID: 5133fc-0be-2039-9825-cd7\ncreatorsName: cn=admin,dc=serverX,dc=lan\ncreateTimestamp: 20190516045340Z\nuserPassword:: xxxxxxxx\nmail: me@example.com\nentryCSN: 20190516101837.136599Z#000000#000#000000\nmodifiersName: cn=admin,dc=serverX,dc=lan\nmodifyTimestamp: 20190516101837Z\n
Run Code Online (Sandbox Code Playgroud)\n\n

任何人都知道出了什么问题?

\n\n

也许有人可以给我一个示例ldiff和工作配置?

\n\n

编辑:

\n\n

slapadd尝试通过以下ldiff方式slapadd -f file.ldiff

\n\n
dn: cn=admin,dc=serverX,dc=lan\nobjectClass: inetOrgPerson\nobjectClass: organizationalPerson\nobjectClass: person\nobjectClass: top\ncn: Firstname Lastname\ngivenName: Gilles\nsn: Quenot\nuid: gquenot\nmail: me@example.com\nuserPassword: {MD5}xxxxxxxxxxxxxx\n
Run Code Online (Sandbox Code Playgroud)\n\n

错误 :

\n\n
5cdd8fe4 slapcat_so.txt: line 1: unknown directive <dn:> outside backend info and database definitions.\nslapadd: bad configuration file!\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc2\xa0Edit2

\n\n

固定为:

\n\n
ldapadd -x -H ldap://serverX:389 -D \'cn=admin,dc=serverX,dc=lan\' -W -f stuff.ldiff\n
Run Code Online (Sandbox Code Playgroud)\n\n

并更新了密码phpldapadmin

\n

Eri*_*ult 5

当您使用 OpenLDAP 对用户进行身份验证时,您的 Gitlab 配置以 Active Directory 为目标,因此首先要做的是修复以下参数/etc/gitlab/gitlab.rb

uid: 'uid'
active_directory: false
Run Code Online (Sandbox Code Playgroud)

我不知道attributes身份验证上下文中的目的是什么(编辑:attributes用于将用户数据从 ldap 同步到其 Gitlab 帐户,这对于身份验证本身来说应该无关紧要)。

也许还有其他问题,例如用户的 uid 不是“user.name”,或者基数太窄(user.name 条目可能不在 下ou=people),如果您不知道使用基 dn 作为基搜索,或通过运行带/不带“ou”部分的搜索来检查:

ldapsearch -H ldap://10.0.0.1:389 -D cn=admin,dc=serverX,dc=lan -W -b ou=people,dc=serverX,dc=lan uid=user.name \*
Run Code Online (Sandbox Code Playgroud)

我还会直接根据 ldap 检查凭据本身,即。不是通过 Gitlab,通过执行大致相同的查询但使用user.name绑定,这里我们实际上测试他可以绑定并读取自己的条目:

ldapsearch -H ldap://10.0.0.1:389 -D <user.name dn> -W -b <user.name dn> -s base \*
Run Code Online (Sandbox Code Playgroud)

此外,GitLab 文档还坚持这样一个事实:LDAP 用户必须设置电子邮件地址,无论是否用于登录。

包含要使用的 user.name 条目创建的典型 ldif 文件ldapadd -f(假设其专有名称中提到的 ou 和 dc 存在)将如下所示:

# user.name entry 
dn: uid=user.name,ou=users,dc=serverX,dc=lan
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: top
cn: Firstname Lastname
givenName: Firstname
sn: Lastname
uid: user.name
mail: user.name@domain.com
userPassword: {MD5}<base64EncodedHash>
Run Code Online (Sandbox Code Playgroud)

我不知道 GitLab 是否/如何知道密码加密方案(似乎没有这方面的配置,或者我错过了它)。


您可以创建一个测试用例条目:

  • 将 替换为<base64EncodedHash>{MD5}CY9rzUYh03PK3k6DJie09g==它代表密码test,如果您需要的话我有一个脚本来生成它们)。
  • 不要忘记将 dc 替换为 dn 中的真实值
  • 请注意 ldif 文件中的空行和 \t,因为它可能会破坏您的 ldap 添加/修改操作。
  • 运行ldapadd -x -H ldap://10.0.0.1:389 -D cn=admin,dc=serverX,dc=lan -W -f ldifFilename以创建用户条目。
  • 运行上面的第一个 ldapsearch cmd,您应该会看到该新条目的结果。
  • 运行第二个,与用户凭据“test”绑定并搜索自己的条目(因此 -b 基本参数指向其自身以避免搜索期间出现权限问题),您应该再次看到相同的结果。

在 gitlab.rb 中:

gitlab_rails['ldap_servers'] = YAML.load <<-EOS
  label: 'Gitlab LDAP'
  host: '10.0.0.1'
  port: 389
  uid: 'uid'
  bind_dn: 'cn=admin,ou=users,dc=serverX,dc=lan'
  password: 'xxxx'
  encryption: 'plain'
  active_directory: false
  allow_username_or_email_login: false
  block_auto_created_users: false
  base: 'ou=users,dc=serverX,dc=lan'
Run Code Online (Sandbox Code Playgroud)

如果您可以与此用户绑定但不能通过 gitlab ui 进行绑定,则可能意味着它不处理 {MD5} 身份验证方案。


@参见https://docs.gitlab.com/ee/administration/auth/ldap/