![在启用了 fapolicyd 的系统上,如何允许 Java 运行 sqlitejdbc.so,该so 在每次启动时都有唯一的文件名?](https://linux22.com/image/779183/%E5%9C%A8%E5%90%AF%E7%94%A8%E4%BA%86%20fapolicyd%20%E7%9A%84%E7%B3%BB%E7%BB%9F%E4%B8%8A%EF%BC%8C%E5%A6%82%E4%BD%95%E5%85%81%E8%AE%B8%20Java%20%E8%BF%90%E8%A1%8C%20sqlitejdbc.so%EF%BC%8C%E8%AF%A5so%20%E5%9C%A8%E6%AF%8F%E6%AC%A1%E5%90%AF%E5%8A%A8%E6%97%B6%E9%83%BD%E6%9C%89%E5%94%AF%E4%B8%80%E7%9A%84%E6%96%87%E4%BB%B6%E5%90%8D%EF%BC%9F.png)
我的问题与这个:我在 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_log
或deny_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
您可以根据需要自定义规则,以提高安全性subject
。object
总结:您可以使用规则将应用程序列入白名单,该规则的语法比信任更高级。有各种配置选项,包括 MIME 类型、UID、GID 和路径。一种简单的方法是找到应用程序的 MIME 类型,然后编写一条规则,将该 MIME 类型列入给定文件夹中的白名单。
参考:
- 人 5 fapolicyd.rules
- 红帽fapolicyd 文档
答案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 版本来说是非常硬编码的。
虽然看上去仍然很丑,但是它确实可以工作。