selinux 阻止执行 pam_exec 命令

selinux 阻止执行 pam_exec 命令

我正在尝试将我的计算机设置为每次用户登录时通知我(通过 ssh、通过 gdm 或 tty)。现在我正在设置 sshd 并将其添加到/etc/pam.d/sshd

session optional pam_exec.so /etc/pam_scripts/notify.sh

这是可选的,因为即使命令由于某种原因失败,我仍然想通过 ssh 登录。

第一:我放置了这一行 pam_selinux close pam_selinux open, 作为在这里建议

whoami如果我在脚本中放置 a并记录执行, I can see that the command is run as根,特别是:

uid=0(root) gid=0(root) groups=0(root) context=system_u:system_r:sshd_t:s0-s0:c0.c1023

问题是,从日志中,我可以看到 selinux 阻止执行curl脚本内使用的 :

AVC avc:  denied  { name_connect } for  pid=1810 comm="curl" dest=443 scontext=system_u:system_r:sshd_t:s0-s0:c0.c1023 tcontext=system_u:object_r:http_port_t:s0 tclass=tcp_socket permissive=0

我的脚本有这个标签:

unconfined_u:object_r:etc_t:s0

我尝试使用 更改上下文chcon,但我总是被拒绝权限(即使使用 root),所以我可能正在做一些我不完全理解的事情。

顺便说一句,我也尝试seteuid在 pam 规则中使用,但没有任何改变。

一般来说,我不明白如何确定哪个是 selinux 授予执行访问权限所需的脚本上下文。

另外,这似乎与curl比脚本本身更相关,因为脚本运行正常,但selinux停止了curl。

我该如何解决这个问题?

答案1

我看到你已经找到了答案,但由于我正在研究这个问题,我将把它留在这里供后代使用:


当您遇到这样的 selinux 拒绝时,您可以使用该audit2allow工具生成更新的 selinux 策略以允许该操作。首先,您可能希望将 selinux 置于宽容模式:

setenforce 0

现在,登录并确保您的 PAM 配置按预期工作。我们这样做是因为很有可能额外的selinux 在第一个之后拒绝,并且在宽容模式下运行将确保它们全部被记录。

现在您可以将 selinux 重新置于强制模式:

setenforce 1

跑步audit2allow -a。这将生成如下内容:

#============= sshd_t ==============

#!!!! This avc can be allowed using one of the these booleans:
#     authlogin_yubikey, nis_enabled
allow sshd_t http_port_t:tcp_socket name_connect;

我说“类似”是因为 (a) 正如我之前所说,可能存在与您当前的 PAM 配置相关的其他拒绝,并且 (b) 此命令会查看审核日志中的所有条目,因此您可以获得之前拒绝的结果实际上与您当前的问题无关。

在这种情况下,我们看到我们可以通过设置现有的 selinux 布尔值来允许被拒绝的操作。那看起来像:

setsebool nis_enabled=1

这可能就是您所需要的。或者,您可以生成 selinux 策略的更新,如下所示:

audit2allow -a -M local

这将生成一个新的策略文件local.pp。您可以通过运行以下命令来激活它:

semodule -i local.pp

有一些关于使用 selinux 的好信息这里,包括更详细的使用概述audit2allow

答案2

好吧,我花了一段时间,但我设法解决了它。我的问题是,在阅读了优秀的文章后,我不知道如何检查 selinux 规则Gentoo SELinux 教程我发现如何使用以下命令查询规则sesearch

# sesearch --allow -s sshd_t -t unreserved_port_t -c tcp_socket -p name_connect

在这种情况下,我将通知脚本从已知端口切换到随机端口,这就是为什么我unresolved_port_t作为目标类型而不是http_port_t从审核日志报告的目标进行搜索。

在列表中,有这样的规则:

allow sshd_t unreserved_port_t:tcp_socket name_connect; [ nis_enabled ]:True

这是允许的,但受布尔值的限制nis_enabled,事实上,我的系统上禁用了该布尔值(通过检查getsebool -a | grep nis_enable)。

我曾经setsebool nis_enabled on启用过该规则,现在它运行得很好。

相关内容