我正在使用 SSSD 针对本地 Active Directory 服务器 (Windows) 对 Linux 上的用户进行身份验证。它运行正常,这是我的配置:
[sssd]
domains = my.domain
config_file_version = 2
services = nss, pam
[domain/my.domain]
ad_domain = my.domain
ad_server = my-dc.my.domain
krb5_realm = MY.DOMAIN
realmd_tags = joined-with-samba
cache_credentials = true
auth_provider = ad
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 = simple
simple_allow_groups = IT
问题是:我们有一个用户想要zsh
。因此我将用户的 loginShell 属性更改为/usr/bin/zsh
。这在用户第一次登录时工作正常。但是一旦用户登录并且我这样做了getent passwd username
,它就会显示用户的 shell 是/bin/bash
。因此,当用户注销并再次登录时,确实bash
会用作 shell。
当我这样做时sss_cache -u username
,shell 会再次正确设置,并且用户在登录时会获得正确的 shell。我不想禁用缓存,因为任何域控制器停机都不会对 Linux 用户登录产生影响。
我试图删除default_shell
,但它只会将默认 shell 更改为空而不是/bin/bash
,因此行为相同。
答案1
您可以在 nss 部分使用默认值。
[nss]
default_shell = /bin/bash
并覆盖使用override_shell = <your shell>
override_shell (string)
Override the login shell for all users. This option can be specified globally in the [nss] section or per-domain.
编辑1:针对特定组的变化
[sssd]
config_file_version = 2
services = nss, pam
domains=DOMAIN_GROUP1,DOMAIN_GROUP2,DOMAIN
[nss]
default_shell = /bin/bash
[domain/DOMAIN_GROUP1]
id_provider = ad
ad_domain = mydomain.local
ad_server = mydc01.domain.local,mydc02.domain.local,mydc03.domain.local
# Restrict to group members
ldap_user_search_base = DC=domain,DC=local?subtree?(memberOf=CN=group1,OU=Groups,DC=domain,DC=local)
# Shell
override_shell = /shell/path/for/group1
# Homedir
override_homedir = /home/%u
#same way for other groups
[domain/DOMAIN_GROUP2]
..........
..........
..........
希望这会有所帮助。
答案2
由于另一个答案完全错误,这里是实际的解决方案(来自https://lists.fedorahosted.org/archives/list/[电子邮件保护]/线程/BXFRHRI5VCLTQNE565ZVGZTEGALSNNJY/):
我想知道 SSSD 是否正在连接到全局目录以进行某些查找而不是其他查找,当 SSSD 在 GC 中查找信息并有效地将它们从缓存中删除时,POSIX 属性会被显示为“已删除”。
设置:
ad_enable_gc = false
在本[domain]
节中将证明该假设是否正确。
因此,解决方案是禁用全局目录查找。非常感谢@Lennie谁首先建议这样做,但直到现在我才这样做。