我有一个 Active Directory,使用 sssd 作为 CentOS 7 服务器的 ID、访问和身份验证提供程序。我一直在关注这个邮政以便让来自不同组的用户在登录时使用不同的 shell,但我遇到了一些问题。这是我的sssd.conf
文件:
[sssd]
domains = dev, domain.local
config_file_version = 2
services = nss, pam
[nss]
default_shell = /bin/bash
[domain/dev]
ad_domain = domain.local
krb5_realm = DOMAIN.LOCAL
ad_server = adserver.domain.local
id_provider = ad
access_provider = ad
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%u
override_shell = /bin/tcsh
ldap_user_search_base = cn=dev,ou=Security Groups,ou=Domain,dc=domain,dc=local #According to sssd-ldap man page ldap_user_search_filter is deprecated
[domain/domain.local]
ad_server = adserver.domain.local
ad_domain = domain.local
krb5_realm = DOMAIN.LOCAL
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%u
access_provider = ad
这个想法是,当 dev 组中的某个人登录时,shell 将是 tcsh,而当其他人登录时,它将使用 bash。问题是,使用此配置,我可以使用 dev 组成员 Smith 成功登录,并且成功进入 tcsh,但如果我使用 John(也是域成员但不是 dev 成员)登录,则会发生以下情况:
- 回顾一下,
/var/log/secure
我首先从 pam_unix 获得身份验证失败,然后从 pam_sss 获得身份验证成功 - 首先,用户以 身份登录,
john
并获取其 shell 作为 tcsh(尽管它应该是 bash)。其次,用户以 身份登录,[email protected]
并获取 bash。第三,用户再次以 身份登录,john
现在它获得了正确的 shell(bash)
显然,sssd 在用 FQDN 检查了第二个域后,缓存了用户 shell,第三次登录时一切正常。
哪种配置正确,才能让每个用户登录到其对应的 shell?
更新:
看起来有时登录过程仅通过 pam 模块,有时通过从活动目录中获取的基于 sssd GPO 的策略。我尝试禁用过滤器并重新启动 sssd 几次,在其中一次我在日志中得到了这些:
Aug 28 15:42:43 co-proy-02 sssd[be[dev.domain.local]]: Warning: user would have been denied GPO-based logon access if the ad_gpo_access_control option were set to enforcing mode.
禁用过滤器后,组Smith
中的用户dev
成功获取 tcsh,但也能获取john
。启用过滤器后,两者都获取 bash。
更新2
显然有一个名为的软件包sssd-tools
,它有一个命令可以让你覆盖任何单独用户的 shell,但是,在尝试这个解决方案后,我仍然没有得到适当的结果。这是命令,但至少对我来说,它没有正常工作:
sss_override user-add smith -s /usr/bin/sh
答案1
经过长时间的搜索,并在 @ChristopheDrevet-Droguet 的帮助下,以过滤器ou=Domain,dc=domain,dc=local?subtree?(memberOf=cn=dev,ou=Security Groups,ou=Domain,dc=domain,dc=local)
为基础,唯一缺少的是一个要解析的对象树,我的意思是,可以在其中找到用户。sssd
应该如下所示才能使其工作(至少对我来说):
[sssd]
domains = dev, domain.local
config_file_version = 2
services = nss, pam
[nss]
default_shell = /bin/bash
[domain/dev]
ad_domain = domain.local
krb5_realm = DOMAIN.LOCAL
ad_server = adserver.domain.local
id_provider = ad
access_provider = ad
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%u
override_shell = /bin/tcsh
ldap_user_search_base = dc=domain,dc=local??(&(memberOf=cn=dev,ou=Security Groups,ou=Domain,dc=veritran,dc=local)(objectClass=*))
[domain/domain.local]
ad_server = adserver.domain.local
ad_domain = domain.local
krb5_realm = DOMAIN.LOCAL
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = False
fallback_homedir = /home/%u
access_provider = ad
ldap_user_search_base = dc=domain,dc=local??(&(memberOf=cn=other,ou=Security Groups,ou=Domain,dc=veritran,dc=local)(objectClass=*))