在启用了 fapolicyd 的系统上,如何允许 Java 运行 sqlitejdbc.so,该so 在每次启动时都有唯一的文件名?

在启用了 fapolicyd 的系统上,如何允许 Java 运行 sqlitejdbc.so,该so 在每次启动时都有唯一的文件名?

我的问题与这个:我在 Rhel 8 上运行了一个 Java 应用程序,它依赖于 sqlite-jdcb 驱动程序。与该问题不同,我的问题不是我的文件系统使用 noexec 挂载。相反,它与 fapolicyd 禁止 java 执行驱动程序有关:

Aug 02 11:36:40 hostname cerebro[3210818]: /opt/cerebro/sqlite-3.34.0-47390f7e-7dd5-45d7-9a01-0635f335df40-libsqlitejdbc.so (Operation not permitted)
Aug 02 11:36:42 hostname cerebro[3210818]: /opt/cerebro/sqlite-3.34.0-cb416389-64b7-4ed6-9e52-5c710ec85a6c-libsqlitejdbc.so (Operation not permitted)

通常情况下,我会使用fapolicyd-cli命令将驱动程序文件添加到 fapolicyd 信任列表,但每次应用程序启动时,JDBC 驱动程序文件都有一个唯一的文件名,因此添加现有文件不是一个可行的选择。请注意上面的十六进制字符 - 这些字符在每次应用程序启动时都是不同的。

我该如何处理这种情况?

答案1

您应该能够根据文件的 mime 类型和路径执行此操作。下面是示例。

我创建了一个文件,myfile并尝试运行它。我发现它被 fapolicyd 阻止了:

[localuser@server ~]$ echo 'echo hello' > myfile-1
[localuser@server ~]$ chmod +x ./myfile-1
[localuser@server ~]$ ./myfile-1
bash: ./myfile-1: Operation not permitted
[localuser@server ~]$

您有两个选项可以查看对调试有用的日志输出fapolicyd

  • 一个,systemctl stop fapolicyd.service然后fapolicyd-cli debug-deny在等待块时运行
  • 二、deny将 中的任何语句修改/etc/fapolicyd/rules.d/deny_logdeny_syslog。要使此更改生效,fapolicyd-cli --update; systemctl restart fapolicyd

一旦您获得有用的块语句,您应该会看到如下消息:

Aug 8 01:20:15 server.nix.turnerfarms.net fapolicyd[9083]: rule=16 dec=deny_log perm=execute auid=0 pid=9087 exe=/usr/bin/bash : path=/home/localuser/myfile-1 ftype=text/plain trust=0

上面,我们看到规则 16 阻止了文件/home/localuser/myfile-1运行。如果我们查看规则 16,我们会看到它是这样的规则:

[root@server rules.d]# fapolicyd-cli --list | grep '^16
16. deny_log perm=execute all : all

规则编号之所以重要,是因为fapolicyd信任规则是按词汇方式处理的,这意味着如果我们为应用程序添加规则,则它必须位于包含块的文件中。

识别具有块的文件:

[root@server rules.d]# grep -r 'deny_log perm=execute' /etc/fapolicyd/rules.d/
/etc/fapolicyd/rules.d/90-deny-execute.rules:deny_log perm=execute all : all 

由于 的名称myfile-*会一直变化,我们可以根据 MIME 类型允许它。如果您查看之前记录的拒绝,您将看到主题是/usr/bin/bash,MIME 类型是text/plain

创建一条高于 90 的新规则,例如89-allow-myfiles.rules

allow perm=execute exe=/usr/bin/bash : dir=/home/localuser/ ftype=text/plain

通知fapolicyd策略更新并重新启动服务

fapolicyd-cli --update && systemctl restart fapolicyd

在我们的新文件上替换 SELinux 上下文:

restorecon -Rv /etc/fapolicyd/rules.d/

你现在应该很好:

[localuser@server ~]$ ./myfile-1
hello
[localuser@server ~]$ ./myfile-2
hello

您可以根据需要自定义规则,以提高安全性subjectobject

总结:您可以使用规则将应用程序列入白名单,该规则的语法比信任更高级。有各种配置选项,包括 MIME 类型、UID、GID 和路径。一种简单的方法是找到应用程序的 MIME 类型,然后编写一条规则,将该 MIME 类型列入给定文件夹中的白名单。

参考:

答案2

这应该是一个评论,但我不允许这样做。

按照@cutrightjm 的指示,我创建了文件 /etc/fapolicyd/rules.d/01-sqlitejdbc.rules,内容如下:

allow perm=open exe=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el8_7.x86_64/jre/bin/java : dir=/opt/cerebro/ ftype=application/x-sharedlib

请注意,这对于 RHEL8.7 上的特定 Java 版本来说是非常硬编码的。

虽然看上去仍然很丑,但是它确实可以工作。

相关内容