第一次匹配时停止 NSSwitch

第一次匹配时停止 NSSwitch

我正在使用 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 将返回mygroupGID 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 是添加它的人)。

相关内容