我们的sssd配置如下:
id_provider = ad
auth_provider = krb5
access_provider = ldap
enumerate = false
ignore_group_members = true;
正如您所看到的,我们没有枚举用户和组,因此getent passwd
也getent group
没有显示广告中的用户和组。
现在,我想了解id -a <aduser>
命令如何显示用户及其组。据我所知,它会实时获取给定的用户名或从 sssd 缓存中检索。但我想确切地知道是什么告诉 id 命令从 sssd 获取此信息。
我的问题的一些背景信息:
我正在尝试在我们的 mysql 5.6 社区服务器中设置 ldap 身份验证,为此我使用 auth_pam.so,它是我从本地虚拟机的 percona 服务器复制的。
我创建了一个代理用户:ad_dba
并映射到 ldap 组:mysql_dba
并且我创建了以下 pam 服务:
# cat /etc/pamd./mysqld
#%PAM-1.0
auth include password-auth audit
account include password-auth audit
因此,我的 auth_string 如下:mysqld, ad_dba=mysql_dba
现在,我向代理用户授予了完整的权限:ad_dba
但是,我只能使用我的广告用户进行身份验证,但没有任何权限。我的理解是组映射不起作用。
我不确定mysql如何检查用户组成员。我正在尝试查看是否可以在 PAM 中添加特定模块来检索此组信息。
编辑1:
我从源代码中看到,mysql 插件正在使用内置的 linux 函数getgrouplist
并且getgrgid_r
:
- https://github.com/percona/percona-server/blob/5.6/plugin/percona-pam-for-mysql/src/groups.c
- http://man7.org/linux/man-pages/man3/getgrouplist.3.html
- https://linux.die.net/man/3/getgrgid_r
因此,我必须找到一种方法在组数据库中列出我所需的组和用户,或者更改代码并重新编译。我的问题现在对于这个问题来说已经变得无关紧要了。但我仍然渴望知道 id 是如何获取这些信息的。
答案1
该id
命令通过询问 C 库从与 : 相同的来源获取组信息getent group
,然后 C 库查看 的行group
并/etc/nsswitch.conf
使用相应库中的函数libnss_<name>.so
来获取答案。
这里根本不会使用 PAM 库。
例如,在你的情况下,nsswitch.conf
至少应该说:
passwd: files sss
group: files sss
这将使 C 库首先使用 using 进行查询libnss_files.so
(它将查看/etc/passwd
and /etc/group
),如果在那里找不到答案,则使用 with libnss_sss.so
(它将询问sssd
)。
GNU C 库 ( glibc
) 中的所有用户名/组查找机制都使用此机制,因此该id
命令和 MySQL 最终将使用相同的信息源。
但就您而言,您可能只在和行上nsswitch.conf
包含files
(或 compat
) 。您应该检查您的文件并在必要时添加到其中。passwd
group
nsswitch.conf
sss