- 目录
- LDAP身份验证
LDAP身份验证¶
Redmine原生支持使用一个或多个LDAP目录进行LDAP身份验证。
声明LDAP¶
前往管理,然后在菜单中单击“LDAP身份验证”。
输入以下内容
- 名称:目录的任意名称
- 主机:LDAP主机名
- 端口:LDAP端口(默认为389)
- LDAPS:如果您想或需要使用LDAPS访问目录,请勾选此选项
- 账户:输入一个具有读取访问权限的LDAP的用户名,如果您的LDAP可以匿名读取(Active Directory服务器通常不允许匿名访问),则留空此字段
- 密码:账户密码
- 基本DN:您的LDAP目录树的最顶层DN
- 登录属性:输入将用作Redmine用户名的LDAP属性名称
现在,如果Redmine用户将账户设置为使用LDAP进行身份验证,则应能够使用其LDAP用户名和密码进行身份验证。
要测试此功能,请创建一个与LDAP账户登录名匹配的Redmine用户(通常,Redmine将通过查找LDAP数据来通知您),在“身份验证模式”下拉列表中选中新创建的LDAP(此字段仅在声明了LDAP的情况下在账户屏幕上可见)并留空其密码。尝试使用LDAP用户名和密码登录Redmine。
动态用户创建¶
通过勾选“动态用户创建”,任何LDAP用户在第一次登录Redmine时都会自动创建其Redmine账户。
为此,您必须指定用于创建Redmine账户的LDAP属性名称(名,姓,电子邮件)。
以下是一个使用Active Directory的典型示例
Name = My Directory Host = host.domain.org Port = 389 LDAPS = no Account = MyDomain\UserName (or UserName@MyDomain depending on AD server) Password = <password> Base DN = CN=users,DC=host,DC=domain,DC=org On-the-fly user creation = yes Attributes Login = sAMAccountName Firstname = givenName Lastname = sN Email = mail
以下是一个用于具有部门化内部网络的Active Directory的另一个示例
Name = Just a description for the auth modes page Host = DepartmentName.OrganizationName.local Port = 389 LDAPS = no Account = DepartmentName\UserName (or UserName@MyDomain depending on AD server or bind DN uid=Manager,cn=users,dc=MyDomain,dc=com) Password = <password> Base DN = DC=DepartmentName,DC=OrganizationName,DC=local On-the-fly user creation = yes Attributes Login = sAMAccountName Firstname = givenName Lastname = sN Email = mail
请注意,LDAP属性名称是区分大小写的。
动态绑定账户¶
以上配置需要在Redmine使用的目录服务器上创建一个特殊账户,用于预先认证。可以在账户字段中使用关键词 $login,它将被当前登录名替换。在这种情况下,密码可以留空,例如
Account: [email protected]或者
Account: company\$login
基础DN变体¶
尽管基础DN可能是Active Directory的标准配置,但我在雇主那里的Active Directory并不使用用户容器来存储标准用户,所以那些说明让我走了一段漫长而痛苦的路线。我建议也尝试使用“DC=host,DC=domain,DC=org”作为设置,如果登录失败的话。
基于组的LDAP登录¶
如果您只想允许属于特定LDAP组的用户登录,应遵循以下说明。这些说明基于OpenLDAP LDAP服务器和Redmine 2.3.0。
1. (OpenLDAP服务器) 启用memberof覆盖
1.1. 创建一个文件
vim ~/memberof_add.ldif
以下内容
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/ldap
olcModuleLoad: memberof
1.2. 创建一个文件
vim ~/memberof_config.ldif
以下内容
dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
1.3. 加载它们。这取决于您的OpenLDAP配置,所以我们提出一些可能性
sudo ldapadd -c -Y EXTERNAL -H ldapi:/// -f memberof_add.ldif
sudo ldapadd -c -Y EXTERNAL -H ldapi:/// -f memberof_config.ldif
或者
ldapadd -D cn=admin,cn=config -w "password" -H ldapi:/// -f memberof_add.ldif
ldapadd -D cn=admin,cn=config -w "password" -H ldapi:/// -f memberof_config.ldif
如果您使用动态运行时配置引擎(slapd-config),则无需重启。
1.4.(可选)测试它
ldapsearch -D cn=admin,dc=example,dc=com -x -W -b 'dc=example,dc=com' -H 'ldap://127.0.0.1:389/' '(&(objectClass=posixAccount)(memberOf=cn=ldapredmine,ou=groups,dc=example,dc=com))'
2.(OpenLDAP服务器)创建组。在这个例子中,用户是“ldap_user_1”,组是“ldapredmine”
dn: cn=ldapredmine,ou=groups,dc=example,dc=com
cn: ldapredmine
description: 允许登录到红帽票据系统的员工
member: cn=ldap_user_1,ou=people,dc=example,dc=com
objectclass: groupOfNames
objectclass: top
调整“dn”和“cn”,以适应您的DIT结构
3.(Redmine)编辑LDAP认证模式。在我的情况下,“ldap_user_1”是“posixAccount”对象类
Base DN: dc=example,dc=com
Filter: (&(objectClass=posixAccount)(memberOf=cn=ldapredmine,ou=groups,dc=example,dc=com))
故障排除¶
如果您想使用即时用户创建,请确保Redmine可以从您的LDAP中检索创建有效用户所需的所有信息。
例如,如果没有在目录中提供有效的电子邮件地址,即时用户创建将无法工作(尝试登录时会收到“无效的用户名/密码”错误消息)。
(在新版本的Redmine中,这不是真的;用户创建对话框将填充从LDAP服务器找到的所有内容,并要求新用户填写剩余内容。)
此外,请确保您没有将任何自定义字段标记为用户账户的必需字段。这些自定义字段会阻止即时创建用户账户。
登录系统中的错误在Redmine日志中不会报告任何真实信息,这使得故障排除变得困难。但是,您可以使用Wireshark在您的Redmine主机和LDAP服务器之间找到大部分您需要的信息。注意,这仅在您有权读取这两个主机之间的网络流量时才有效。
您还可以使用工具 'ldapsearch' 来测试您的设置是否正确。登录到托管 Redmine 的 Linux 机器(可能还需要安装 ldaputils),然后运行以下命令
ldapsearch -x -b "dc=example,dc=com" -H ldap://hostname/ -D "DOMAIN\USER" -w mypassword [searchterm]
如果成功,您将获得与您的搜索查询相匹配的 AD 内容列表。然后,您将知道如何在 Redmine 的 LDAP 配置中填写字段。
账户值格式¶
绑定凭据的用户名可能需要指定为 DN 而不是 UPN(例如 [email protected])或 domain\user,如 源:trunk/vendor/plugins/ruby-net-ldap-0.0.4/lib/net/ldap.rb 中的此注释所述
# As described under #bind, most LDAP servers require that you supply a complete DN # as a binding-credential, along with an authenticator such as a password.
因此,具有 MyDomain\MyUserName 或 [email protected] 用户名的用户可能只需在 Redmine 登录名中输入 MyUserName。
慢速 LDAP 认证¶
如果 LDAP 认证速度慢,并且您有 AD 集群,请尝试在主机字段中指定 AD 物理服务器之一(https://redmine.ruby-lang.org.cn/boards/2/topics/3056)。这可能会有所帮助。
OpenDS¶
如果您正在使用 OpenDS 服务器,您可能会在初始查询中搜索用户时遇到问题,该查询通过指定的登录属性发送请求控制 "分页结果"。默认情况下,匿名用户不允许使用此请求控制 1.2.840.113556.1.4.319,从而阻止 redmine 在绑定之前在目录中找到用户。
添加如下全局 ACI
./dsconfig -h SERVER_IP -p 4444 -D cn="Directory Manager" -w PASSWORD -n set-access-control-handler-prop --trustAll --add global-aci:\(targetcontrol=\"1.2.840.113556.1.4.319\"\)\ \(version\ 3.0\;\ acl\ \"Anonymous\ control\ access\ to\ 1.2.840.113556.1.4.319\"\;\ allow\ \(read\)\ userdn=\"ldap:///anyone\"\;\)注意:将命令输入一行,使用与指示完全相同的转义("acl" 后的 \ 表示 " " 的转义,即 "\ ")。
解决方案:¶
Zentyal 3.2,Redmine 2.3.x¶
我成功地在 Ubuntu 12.04 LTS 服务器上更新并(重新)设置了我的 Zentyal 3.2。
由于更新 Zentyal 3.2 和 Redmine 2.3 后这让我真的很头疼,所以我喜欢简短地讲述这个故事,并与您分享这个简单的解决方案
使用 zentyals 只读凭据
> Basedomain (Base DN): dc=your_domain,dc=your_tld Rootdomain (Root DN): cn=zentyal,dc=your_domain,dc=your_tld Password: <admin_secret_pass> > Read-only root DN: cn=zentyalro,dc=your_domain,dc=your_tld > Read-only password: <ro_secret_pass> Default Users DN: ou=Users,dc=your_domain,dc=your_tld Default Groups DN: ou=Groups,dc=your_domain,dc=your_tld
在 Redmine 中(使用上面的凭据,不要用 <> 包围)并注意更改后的 LDAP 端口 390(阅读上面的文章)
Name = Just a description for the auth modes page > Host = <IP of the host> > Port = <390> LDAPS = no > Account = <Read-only root DN> > Password = <ro_secret_pass> > Base DN = <Basedomain (Base DN)> On-the-fly user creation = yes Attributes > Login = uid Firstname = givenName > Lastname = sN Email = mail
Zentyal 4.x,Redmine 3.3.x¶
使用端口 389 和 sAMAccountName 而不是 uid
Zentyal 5.0,Redmine 3.2¶
Name = Just a description for the auth modes page Host = <IP of the host> Port = <389> LDAPS = no (yes/checked is ok too with Port set to 636) Account = [email protected] Password = <username_pass> Base DN = < Default Users DN > (cn=Users,dc=domain,dc=tld) On-the-fly user creation = yes Attributes Login = sAMAccountName Firstname = givenName Lastname = sN Email = mail
OpenLDAP,Redmine 3.4.2.stable¶
Name = Some random description Host = <IP of the host> Port = <389> LDAPS = no Account = < Admins DN > (cn=admin,dc=domain,dc=tld) Password = < Admins Pass > Base DN = < Default Users DN > (cn=People,dc=domain,dc=tld) On-the-fly user creation = yes Attributes Login = uid Firstname = givenName Lastname = sn Email = mail
管理员帐户可以是具有全局读取权限的任何其他 LDAP 帐户。域名和 tld 部分必须与 LDAP 设置相匹配,就像其他所有内容一样。登录属性用于登录。其余内容必须根据 LDAP 设置。
FreeIPA 4.6.8,Redmine 3.2.6¶
Name = Service Description or server name etc. Host = <IP/domain of the host> Port = <389> LDAPS = no ("yes" not tested) Account = uid=<bind username>,cn=users,cn=accounts,dc=<domain>,dc=<tld> Password = <bind password> Base DN = cn=accounts,dc=<domain>,dc=<tld> Attributes Login = uid Firstname = givenName Lastname = sn Email = mail
域名和 tld 部分必须与 LDAP 设置相匹配,就像其他所有内容一样。使用 uid 属性进行登录。
最后更新于 Chris Clemson,超过 3 年前 · 28 次修订