我正在使用 MySQL 后端将我的一些 UNIX 用户存储到数据库中。为了使系统能够检索有关这些用户的名称信息,我将 MySQL 添加到 NSS 的源中:
passwd: files mysql
group: files mysql
shadow: files mysql
/etc/passwd
但是,当我请求存储在(“ ”源)中的用户信息时,仍会查询 MySQL 后端(我可以看到正在执行files
我配置的查询)。/etc/libnss-mysql.cfg
有没有什么方法可以让 NSS 在匹配后停止,以便在使用典型的 UNIX 身份验证资源找到用户/组时不会查询 MySQL?
正如您在编辑 2 中看到的,我的问题出现在 NSS 尝试构建组列表时,而不是在查找特定名称时。这可能是这里不应用默认SUCCESS
=>链的原因。return
编辑:我尝试使用以下方法“强制”NSS 在第一次匹配时返回......
passwd: files [SUCCESS=return] mysql
group: files [SUCCESS=return] mysql
shadow: files [SUCCESS=return] mysql
(尽管return
应该是SUCCESS
状态的默认设置),但 MySQL 仍然被查询。mysql
从行中删除确实会将 NSS 限制到文件中,因此我们可以清楚地说,即使在 上SUCCESS
, NSScontinue
也是如此。
编辑 2(我如何看到 MySQL 仍在被查询):我的 MySQL 查询是这样的,当查询 MySQL 时,无论你查询什么用户名,返回的组列表总是包含 GID 5000。因此,例如,如果myuser
(存储在数据库中)属于mygroup
(也存储在数据库中),那么 MySQL 将返回mygroup
GID 5000。从示意图上看,你可以观察到:
mysql> SELECT * FROM grouplist WHERE username='myuser';
|---------------------------|
| GID | USERNAME |
|---------------------------|
| n | myuser |
|---------------------------|
$ id myuser
uid=m(myuser) gid=n(mygroup) groups=n(mygroup),5000(forcedgroup)
^^^^
added for every SQL query
这个小小的“添加”是由查询本身做出的:
gidsbymem SELECT id FROM ( \
SELECT id FROM grouplist WHERE username='%1$s' \
UNION SELECT 5000 AS id \
) AS custom_groups
/etc/passwd
现在,当我请求存储在中的用户信息时id myotheruser
,我可以在他的组中看到 GID 5000,尽管 中没有这样的关联/etc/group
。对我来说,发生的事情是:
- NSS 读取
/etc/passwd
并发现myotheruser
。 - NSS 查询我的数据库,找不到用户,但仍然返回 GID 5000 作为组列表。
myotheruser
,不属于任何 SQL 组,由于 MySQL 添加了它,因此在其组列表中具有 GID 5000。
示意图:
$ id myotheruser
uid=n(myotheruser) gid=n(myothergroup) groups=n(myothergroup),5000(forcedgroup)
尽管我期望:
$ id myotheruser
uid=n(myotheruser) gid=n(myothergroup) groups=n(myothergroup)
但是,当我从 NSS 的源中删除 MySQL 时,myotheruser
他的列表中不再有 GID 5000(这就是为什么我可以说 MySQL 是添加它的人)。