指定 listsep 时 pam_access.so 不起作用

指定 listsep 时 pam_access.so 不起作用

我在配置 PAM 时遇到了一个奇怪的问题,试图使用 pam_access.so 和包来限制 ssh 登录libpam-modules_1.1.8-3.6ubuntu2.18.04.1.

的内容/etc/security/access.conf

+ : root : ALL
+ : devops : ALL
#+ : computer managers : ALL
- : ALL : ALL

的内容sshd 配置文件

account required pam_access.so listsep=, debug

通过此设置,每个用户都可以登录,无论他们是否属于任何指定组。如果我listsep=,从 PAM 配置中删除,那么它就会按预期工作。

从调试日志看来,无论何时listsep指定,当它在 access.conf 中找不到用户组时,它都不会返回任何错误,AKA pam_access.so 将始终使用 listsep 返回成功。

在以下上下文中,用户是“计算机管理员”的成员,但不是“devops”的成员

启用 listsep 且 access.conf 中只有 devops 的调试日志

pam_access(sshd:account): line 1: +  :  root  :  ALL
pam_access(sshd:account): list_match: list= root , item=user
pam_access(sshd:account): user_match: tok= root , item=user
pam_access(sshd:account): string_match: tok= root , item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 2: +  :  devops  :  ALL
pam_access(sshd:account): list_match: list= devops , item=user
pam_access(sshd:account): user_match: tok= devops , item=user
pam_access(sshd:account): string_match: tok= devops , item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 4: -  :  ALL  :  ALL
pam_access(sshd:account): list_match: list= ALL , item=user
pam_access(sshd:account): user_match: tok= ALL , item=user
pam_access(sshd:account): string_match: tok= ALL , item=user
pam_access(sshd:account): user_match=0, "user"
Accepted password for user from IP port PORT ssh2

查看最后一行 pam_access 日志user_match=0。让我们将其与未指定 listsep 时的日志进行比较

pam_access(sshd:account): line 1: +  :  root  :  ALL
pam_access(sshd:account): list_match: list= root , item=user
pam_access(sshd:account): user_match: tok=root, item=user
pam_access(sshd:account): string_match: tok=root, item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 2: +  :  devops  :  ALL
pam_access(sshd:account): list_match: list= devops , item=user
pam_access(sshd:account): user_match: tok=devops, item=user
pam_access(sshd:account): string_match: tok=devops, item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 4: -  :  ALL  :  ALL
pam_access(sshd:account): list_match: list= ALL , item=user
pam_access(sshd:account): user_match: tok=ALL, item=user
pam_access(sshd:account): string_match: tok=ALL, item=user
pam_access(sshd:account): user_match=2, "user"
pam_access(sshd:account): list_match: list= ALL, item=user
pam_access(sshd:account): from_match: tok=ALL, item=IP
pam_access(sshd:account): string_match: tok=ALL, item=IP
pam_access(sshd:account): from_match=2, "IP"
pam_access(sshd:account): access denied for user 'user' from 'IP'

我可以确认,当listsep=,指定时它可以正确解析组“计算机管理器”,但无法返回错误代码。

有谁遇到过这个问题吗?

当组名包含空格时,有什么解决方法吗?

提前致谢,

巴努

答案1

在您的调试日志中,您可以看到,这list是使用空格。

...
pam_access(sshd:account): list_match: list= root , item=user
...
pam_access(sshd:account): list_match: list= devops , item=user
...
pam_access(sshd:account): list_match: list= ALL , item=user
...

root请注意和 和devops周围的空格ALL

通过此设置,每个用户都可以登录,无论他们是否属于任何指定组。

这是正确的行为,因为您在规则中定义了/etc/security/access.conf空格(+ : root : ALL),而您已设置, 是listsep=,逗号而不是空格。因此没有用户是 的一部分ALL,因为特殊关键字是ALL(没有空格)。

正确的解决方案是/etc/pam.d/sshd

account required pam_access.so listsep=, debug

还有/etc/security/access.conf

+:root:ALL
+:devops:ALL
+:computer managers:ALL
-:ALL:ALL

我猜测devopscomputer managers是群,因此我们应该使用括号来表示群:

+:root:ALL
+:(devops):ALL
+:(computer managers):ALL
-:ALL:ALL

资料来源:

$ man pam_access
...
       listsep=separators
           This option modifies the list separator character that pam_access will recognize when parsing the access configuration file. For example:
           listsep=, will cause the default ` ' (space) and `\t' (tab) characters to be treated as part of a list element value and `,' becomes the
           only list element separator. Doing this may be useful on a system with group information obtained from a Windows domain, where the default
           built-in groups "Domain Users", "Domain Admins" contain a space.
...
$ man access.conf
...
       The second field, the users/group field, should be a list of one or more login names, group names, or ALL (which always matches). To
       differentiate user entries from group entries, group entries should be written with brackets, e.g.  (group).
...

相关内容