我们有一台装有Alma Linux 9.3操作系统的服务器。默认情况下(以及当前所有类似 RHEL 的操作系统)它已fapolicyd
启用。该服务器上还运行着一个应用程序服务器(WildFly/JBoss/Java)。部署的应用程序处理一些数据文件(由用户提交),并且在标准情况下工作正常。
然而目前,有一段时间应用程序需要每分钟处理 1000 个左右的文件。在这种情况下,fapolicyd
开销占用了约 15% 的 CPU,我们认为该开销过高。
我在互联网上找不到有类似问题的人。
fapolicyd
我也很惊讶ServerFault 上没有标签。
问题:
- 有没有一种方法可以优化
fapolicyd
配置,以便它可以更快地决定是允许还是拒绝文件访问?- 我想到的一件事是自定义规则的排序。
- 也许使用通配符与使用文字规则。
- 有什么提示如何评估
fapolicyd
对我们来说有多重要吗?- 我们是否可以将其关闭,或者尽管开销巨大,但让它运行是否确实是一个好主意。
- 其他发行版是否也使用类似的东西
fapolicyd
,或者它是否“只是额外的安全性”就SELinux
足够了。(我知道它们不一样。)
资料来源:
允许列出已执行的程序是最有效的安全功能之一。如果没有它,受损的用户帐户就可以执行任何任意有效负载。或者用户将不应该安装的程序安装到其主目录中。尽管它是一项可选功能,您可以决定启用或不启用。
检查所有此类文件系统调用会对性能造成影响。尽管可以通过优化规则和数据库来最小化开销。
从用户的角度衡量性能是否可以接受。以响应时间为中心的目标,例如“99.9% 的应用程序 API 调用将在 1 秒内完成”,将检测到真正的问题,而不仅仅是资源利用率的趋势。
首先,了解 fapolicyd 的一些背景,请注意README中的性能介绍:
do_stat_report = 1
在 config 中启用统计报告,然后重新启动 fapolicyd(如果最近没有)。分析/var/log/fapolicyd-access.log
并记录哪些 PID 打开哪些文件的模式。注意“命中”与“未命中”的比率。命中率越高越好,访问内存数据库比文件系统访问和处理要快得多。增加
obj_cache_size
系统同时拥有的文件数量的配置。可能的上限是数据文件系统中已使用的 inode 数量(如df -i
输出所示)。这可能过多,但如果您有足够的内存,为什么不缓存几十万个条目。检查 fapolicyd.conf 中的配置。除或
integrity
之外的值将计算校验和并具有开销。特别是如果您在处理新文件时出现大量失误,这可能会占用大量 CPU。应该大于访问报告上的“最大队列深度”,但是我怀疑是否需要增加队列大小。none
size
q_size
检查规则,在来自rules.d的compiled.rules中。RHEL 和 Fedora 从 rpm 填充可信文件,不允许执行未知文件,不允许 ld.so 技巧,并允许大多数打开。如果您确实修改规则,请考虑在打开的系统调用等待时执行更多操作对性能的影响。
与往常一样,您可以在故障排除时分析到底发生了什么。
perf top
将打印 CPU 上的功能,并且在安装了 debuginfo 时效果更好。bcc-tools 包有一些简洁的脚本:opensnoop 和 execsnoop 来实时列出 open 和 exeve 调用。最终,您决定采取哪些控制措施以仅允许执行未经授权的程序。在 exec 调用中立即允许列表,就像 fapolicyd 一样,当然非常强大。一个不太全面的替代方案可能是限制 shell 访问:不允许人们交互 shell,并锁定主目录的权限。或者,如果数据文件系统根本不应该有任何程序,请考虑以 noexec 方式安装它。良好的安全审核不会将清单视为一成不变,而是会列出适当的替代控制措施及其原因。