我在配置 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
我猜测devops
和computer 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).
...