Linux上的id命令如何获取用户组或使用哪个pam模块?

Linux上的id命令如何获取用户组或使用哪个pam模块?

我们的sssd配置如下:

id_provider = ad
auth_provider = krb5
access_provider = ldap
enumerate = false
ignore_group_members = true;

正如您所看到的,我们没有枚举用户和组,因此getent passwdgetent 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

因此,我必须找到一种方法在组数据库中列出我所需的组和用户,或者更改代码并重新编译。我的问题现在对于这个问题来说已经变得无关紧要了。但我仍然渴望知道 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/passwdand /etc/group),如果在那里找不到答案,则使用 with libnss_sss.so(它将询问sssd)。

GNU C 库 ( glibc) 中的所有用户名/组查找机制都使用此机制,因此该id命令和 MySQL 最终将使用相同的信息源。

但就您而言,您可能只在和行上nsswitch.conf包含files(或 compat) 。您应该检查您的文件并在必要时添加到其中。passwdgroupnsswitch.confsss

答案2

id 使用一些核心实用程序来获取信息。如果你看id.c您可以看到它包含文件 mgetgroups.h 并调用函数 xgetgroups,该函数调用管理组...如果您继续追踪,您可以追踪被调用的函数以及它们包含在哪里。基本上,有一些系统调用从组数据库中检索相关信息,理论上,该组数据库是使用 nsswitch.conf 信息构建的,以从“group:”行中指定的源构建数据库。

相关内容