【发布时间】:2019-10-07 19:44:34
【问题描述】:
我使用 Dex 作为我们的身份提供程序并将其连接到 LDAP。下面是我在 Dex 中的 ldap 配置:
connectors:
- type: ldap
id: ldap
name: LDAP
config:
host: myhost.staging.com:636
insecureNoSSL: false
insecureSkipVerify: false
bindDN: cn=prometheus-proxy,ou=serviceaccounts,dc=staging,dc=comp,dc=com
bindPW: 'prometheus'
rootCA: /etc/dex/ldap/ca-bundle.pem
userSearch:
baseDN: ou=people,dc=staging,dc=comp,dc=com
filter: "(objectClass=person)"
username: uid
idAttr: uid
emailAttr: mail
nameAttr: uid
groupSearch:
baseDN: ou=appgroups,dc=staging,dc=comp,dc=com
filter: "(objectClass=groupOfMembers)"
userAttr: DN
groupAttr: member
nameAttr: cn
下面是一个示例 userSearch 和 groupSearch 结果:
dn: uid=swedas01,ou=people,dc=staging,dc=comp,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
cn: Sweta Das
gecos: Sweta Das
gidNumber: 50000
givenName: Sweta
mail: Sweta.Das@comp.com
sn: Das
uid: swedas01
memberOf: cn=jenkins,ou=appgroups,dc=staging,dc=comp,dc=com
homeDirectory: /home/swedas01
dn: cn=prometheus,ou=appgroups,dc=staging,dc=comp,dc=com
objectClass: top
objectClass: groupOfMembers
cn: prometheus
member: uid=testl01,ou=people,dc=staging,dc=comp,dc=com
当我登录到使用上述配置的 Prometheus 实例时,即使我的用户 ID 不属于正在使用的组,即 Prometheus,我仍然可以登录。
Dex 日志显示没有与我的 ID 关联的组。
time="2019-10-07T19:05:48Z" level=info msg="performing ldap search ou=people,dc=staging,dc=comp,dc=com sub (&(objectClass=person)(uid=swedas01))"
time="2019-10-07T19:05:48Z" level=info msg="username \"swedas01\" mapped to entry uid=swedas01,ou=people,dc=staging,dc=comp,dc=com"
time="2019-10-07T19:05:48Z" level=info msg="performing ldap search cn=prometheus,ou=appgroups,dc=staging,dc=comp,dc=com sub (&(objectClass=groupOfMembers)(member=uid=swedas01,ou=people,dc=staging,dc=comp,dc=com))"
time="2019-10-07T19:05:48Z" level=error msg="ldap: groups search with filter \"(&(objectClass=groupOfMembers)(member=uid=swedas01,ou=people,dc=staging,dc=comp,dc=com))\" returned no groups"
time="2019-10-07T19:05:48Z" level=info msg="login successful: connector \"ldap\", username=\"swedas01\", email=\"Sweta.Das@comp.com\", groups=[]"
但为什么它仍然允许我登录?如果组 serach 返回空,登录失败,我有什么办法可以强制执行此设置?
【问题讨论】:
-
看来
groupSearch只是为了获取组数据而不是为了授权,正如您也得出的结论。虽然在切换工具之前你可能想尝试一些东西(我不确定所以我把它留在那里作为评论):因为你的目录支持memberOf属性,你可以尝试在 userSearch 过滤器中添加成员资格条件。现在看:username: uid和filter: "(objectClass=person)"产生最终过滤器"(&(objectClass=person)(uid=<uid>))",因此可能可以在过滤器设置中添加成员条件不带运算符 -
... 像
filter: "(objectClass=person)(memberOf=cn=prometheus,ou=appgroups,dc=staging,dc=comp,dc=com)"这样最终过滤器的结果是(&(objectClass=person)(memberOf=cn=prometheus,ou=appgroups,dc=staging,dc=comp,dc=com)(uid=<uid>)) -
@EricLavault 你的答案是正确的。我刚刚用dex测试过。谢谢。也请写在答案部分。顺便说一句,不需要
&操作符,dex 添加&本身,添加它会导致错误。所以filter: "(objectClass=person)(memberOf=cn=prometheus,ou=appgroups,dc=staging,dc=comp,dc=com)"做这个伎俩。 -
@MohammadYusefpur 嗨,我刚刚添加它作为答案。感谢您的反馈!
标签: kubernetes ldap openid-connect openldap openid-dex