我的组织正在尝试将我们的 RHEL/CentOS 7 服务器加入到我们的 Microsoft AD 域。域控制器由 2 台 Windows 2008R2 服务器和 1 台 Windows 2016 服务器组成。
在 Linux 方面,我正在使用realm
加入域,并且已经成功完成:
# realm list
mydomain.net
type: kerberos
realm-name: MYDOMAIN.NET
domain-name: mydomain.net
configured: kerberos-member
server-software: active-directory
client-software: sssd
required-package: oddjob
required-package: oddjob-mkhomedir
required-package: sssd
required-package: adcli
required-package: samba-common-tools
login-formats: %[email protected]
login-policy: allow-realm-logins
我想只允许某个组的成员访问 SSH:
# realm permit -g [email protected]
这时我遇到了问题。当对两个用户(用户 A 和用户 B)进行测试时,用户 A 可以进入,但用户 B 被拒绝。/var/log/sssd/sssd_mydomain.net.log文件显示用户 B 没有补充组:
(Tue Sep 19 20:53:37 2017) [sssd[be[mydomain.net]]] [simple_access_check_send] (0x0200): Simple access check for [email protected]
(Tue Sep 19 20:53:37 2017) [sssd[be[mydomain.net]]] [simple_check_get_groups_send] (0x0400): User [email protected] is a member of 0 supplemental groups
(Tue Sep 19 20:53:37 2017) [sssd[be[mydomain.net]]] [simple_check_get_groups_send] (0x0400): All groups had name attribute
或者说,确实有,但 SSSD 看不到。以下命令可确认这一点:
# id [email protected]
uid=1918001261([email protected]) gid=1918000513(domain [email protected]) groups=1918000513(domain [email protected]),1918001757([email protected]),1918003900(sccm [email protected]),1918004006(ts remote desktop [email protected]),1918004329([email protected])
# id [email protected]
uid=1918003883([email protected]) gid=1918000513(domain [email protected]) groups=1918000513(domain [email protected])
最后,我们发现用户 A在其 AD/LDAP 对象中将adminCount
属性设置为1
。我不太确定这个属性意味着什么,但这似乎是 SSSD 可以找到其所有补充组而找不到用户 B 的原因。
任何帮助都将不胜感激!我已经为这个问题苦苦思索了很长时间了。
/etc/sssd/sssd.conf
[sssd]
domains = mydomain.net
config_file_version = 2
services = nss, pam
[domain/mydomain.net]
ad_domain = mydomain.net
krb5_realm = MYDOMAIN.NET
realmd_tags = manages-system joined-with-samba
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = True
fallback_homedir = /home/%u@%d
access_provider = simple
simple_allow_groups = [email protected]
debug = 6
答案1
当我读到SSSD 故障排除指南。指南中简要提到:
如果您使用非标准 LDAP 搜索基础,请通过设置禁用 TokenGroups 性能增强
ldap_use_tokengroups=False
。否则,AD 提供程序将通过不受自定义搜索基础限制的特殊调用接收组成员身份,从而导致不可预测的结果
在博客文章中使用 SSSD 限制用户所属的组集对 TokenGroups 进行更详细的解释:
第一步是让客户端使用普通的 LDAP 查找来查找用户所属的组,而不是查找特定于 AD 的 tokenGroups 属性。通常,如果要返回所有组,使用 tokenGroups 属性可以带来显著的性能优势,因为只需对用户条目进行一次 BASE 范围的搜索即可返回所有组成员的列表。但是,tokenGroups 属性是用户所属的 SID 的多值列表,如前所述,无论如何,所有 SID 都必须解析为组名。
TokenGroups 似乎是一种优化技术,默认情况下启用,用于解析用户的组。但是,正如这些文章所暗示的那样,它可能存在问题,就像我的情况一样。
只需将参数设置为false
:即可修复此问题:
[domain/mydomain.net]
ldap_use_tokengroups = false
在我的sssd.conf文件。