![selinux 阻止执行 pam_exec 命令](https://linux22.com/image/163846/selinux%20%E9%98%BB%E6%AD%A2%E6%89%A7%E8%A1%8C%20pam_exec%20%E5%91%BD%E4%BB%A4.png)
我正在尝试将我的计算机设置为每次用户登录时通知我(通过 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
启用过该规则,现在它运行得很好。