我有一个应用程序、浏览器 shell,我正在执行此命令来获取可执行文件列表(列出 $PATH 中的所有二进制文件)
compgen -A function -abck | sort | uniq
当我调用这个命令时,它会返回可执行文件,但我从 SELinux 中收到了很多错误,如下所示:
SELinux is preventing bash from getattr access on the file /usr/sbin/chronyd.
allow this access for now by executing:
# ausearch -c 'bash' --raw | audit2allow -M my-bash
# semodule -X 300 -i my-bash.pp
有没有办法防止这个错误?我希望我的应用程序也能在 SELinux 中运行,并且没有任何开箱即用的错误。
我可以更改 PATH 或执行一些命令来检查路径是否可以在 PATH 变量中,这可能 /usr/sbin 不能在 PATH 中。这样的命令存在吗?我默认有这个路径:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/games
这是结果sudo ausearch -c 'bash' --raw
type=AVC msg=audit(1506851274.781:2921): avc: denied { getattr } for pid=12298 comm="bash" path="/usr/sbin/xl2tpd" dev="sda1" ino=2239132 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:l2tpd_exec_t:s0 tclass=file permissive=1
与| audit2why
:
type=AVC msg=audit(1506851274.781:2921): avc: denied { getattr } for pid=12298 comm="bash" path="/usr/sbin/xl2tpd" dev="sda1" ino=2239132 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:l2tpd_exec_t:s0 tclass=file permissive=1
Was caused by:
Missing type enforcement (TE) allow rule.
You can use audit2allow to generate a loadable module to allow this access.
是否可以使我的代码在没有 的情况下工作audit2allow
?
答案1
SELinux 附带的默认策略旨在允许每个应用程序进行典型的系统访问。与常规登录 shell 不同,您的“网络外壳”正在 Web 服务器上下文中运行(httpd_t)其中适用 Web 服务器的限制。您的网络服务器也运行在许可域,这意味着策略规则不会强制执行,只会记录下来,因此您实际上不会在应用程序中看到任何权限被拒绝的错误。
摆脱该消息的最简单方法是按照使用建议audit2allow
,然后您可以设置httpd_t返回强制模式。audit2allow
创建一条新规则,允许为其生成拒绝消息的特定访问:一条规则httpd_t上下文允许的情况下获取属性到文件l2tpd_exec_t语境。
如果您打算继续使用 Web 服务器中的 shell,则当您执行默认策略不允许的其他操作时,您可能会看到更多 SELinux 权限错误(在httpd_t语境)。
理想情况下,您应该创建一个自定义策略,其中包含到运行 shell 的(更)宽松域的清晰转换路径。这允许您运行不受限制的 shell,而无需授予 Web 服务器过于宽松的访问权限。如果它有用,完全取决于 shell 如何从 Web 服务器启动的详细信息(脚本等)。
如果你决定保持httpd_t在宽容模式下无论如何,如果您不需要任何日志消息,您可以将 Web 服务器配置为在不受限制的上下文中运行。无论哪种方式,对于 Web 服务器来说,这实际上与运行相同SELinux 已禁用。