在CentOS系统安全加固中,fapolicyd是一个基于文件访问策略的守护进程,它能够从内核层面监控和控制应用程序的执行权限。简单来说,fapolicyd可以让你定义"哪些程序允许运行、哪些程序禁止运行",即使攻击者拿到了普通用户权限,也无法随意执行未授权的二进制文件。这比传统的文件权限控制(chmod/chown)更细粒度,因为它不仅看文件属性,还看程序的来源、路径、哈希值等多个维度。下面我直接讲怎么装、怎么配、怎么用,全部实操层面。
一、fapolicyd是什么以及为什么要用它
fapolicyd(File Access Policy Daemon)是Red Hat系Linux发行版自带的一个安全模块,它通过Linux内核的fanotify机制实时监控文件的打开和执行操作。当一个程序试图被执行时,fapolicyd会拦截这个请求,然后根据预定义的规则决定放行还是拒绝。
传统的安全手段比如SELinux虽然强大,但配置复杂、学习曲线陡峭。fapolicyd提供了一个更轻量级的替代方案,特别适合以下场景:限制非root用户只能运行白名单内的程序、防止恶意脚本在/tmp目录执行、控制特定用户组的程序执行范围。在CentOS 7/8/9上都可以使用,CentOS 8和9中它已经是默认安装的组件。
二、安装fapolicyd
在CentOS 7上需要手动安装,CentOS 8/9通常已经预装。先检查是否已安装:
rpm -qa | grep fapolicyd
如果没有输出,执行安装命令:
yum install -y fapolicyd
CentOS 8/9使用dnf:
dnf install -y fapolicyd
安装完成后,启动服务并设置开机自启:
systemctl enable --now fapolicyd
验证服务状态:
systemctl status fapolicyd
如果看到active (running),说明守护进程已经正常工作。接下来进入核心配置环节。
三、理解fapolicyd的规则体系
fapolicyd的规则文件位于/etc/fapolicyd/目录下,主要有三个文件需要关注:
1. fapolicyd.rules——主规则文件,定义允许和拒绝的策略
2. fapolicyd.trust——信任文件列表,列出不需要检查的文件路径
3. fapolicyd.deny——拒绝文件列表,明确禁止执行的路径
规则的匹配逻辑是:先检查deny列表,再检查trust列表,最后走主规则文件的策略。这意味着deny的优先级最高,trust次之,主规则是兜底逻辑。
四、配置白名单策略——核心实操
最常见的安全需求是"只允许特定程序运行"。编辑主规则文件:
vi /etc/fapolicyd/fapolicyd.rules
文件开头会有一些默认规则,建议先清空或注释掉,然后从零开始写自己的策略。一个典型的白名单配置如下:
# 允许系统基本命令 allow perm=any uid=root : all allow perm=any uid=0 : all # 允许/usr/bin和/usr/sbin下的标准程序 allow perm=any uid=root : dir=/usr/bin/ allow perm=any uid=root : dir=/usr/sbin/ allow perm=any uid=root : dir=/usr/libexec/ # 允许/bin和/sbin allow perm=any uid=root : dir=/bin/ allow perm=any uid=root : dir=/sbin/ # 允许特定普通用户运行bash allow perm=any uid=1000 : exe=/usr/bin/bash # 拒绝/tmp目录下所有程序执行(防恶意脚本) deny perm=any uid=!0 : dir=/tmp/ deny perm=any uid=!0 : dir=/var/tmp/ # 拒绝/dev/shm下的程序执行 deny perm=any uid=!0 : dir=/dev/shm/ # 拒绝所有其他执行(兜底拒绝) deny perm=any uid=!0 : all
这段配置的逻辑是:root用户不受限制,普通用户(uid=1000)只能运行bash,/tmp和/var/tmp目录下任何程序都不能执行,其他所有未明确允许的执行操作全部拒绝。这就是一个典型的最小权限模型。
五、使用trust文件提升性能
trust文件的作用是告诉fapolicyd"这些路径下的文件不需要检查,直接放行"。这可以显著减少内核fanotify的开销,提升系统性能。编辑trust文件:
vi /etc/fapolicyd/fapolicyd.trust
添加信任路径:
/usr/bin/ /usr/sbin/ /usr/libexec/ /bin/ /sbin/ /usr/lib64/
每行一个路径,这些路径下的文件执行时不会触发策略检查,直接通过。注意trust文件中的路径必须以/结尾,表示目录。
六、使用deny文件精确封禁
如果你只想封禁某几个特定程序而不是整个目录,可以用deny文件:
vi /etc/fapolicyd/fapolicyd.deny
/tmp/malicious_script /home/user/unauthorized_binary /opt/bad_app/run.sh
deny文件中写的是具体文件路径,不是目录。这样可以精确打击,不影响同目录下的其他合法文件。
七、针对特定用户组的策略配置
实际生产环境中,你可能需要对不同用户组设置不同的执行权限。fapolicyd支持基于uid、gid、fsuid、fsgid的匹配。例如,限制web用户组只能运行特定的CGI程序:
# 允许apache用户执行特定CGI allow perm=any uid=48 : exe=/var/www/cgi-bin/process.cgi allow perm=any uid=48 : exe=/var/www/cgi-bin/upload.cgi # 拒绝apache用户执行shell deny perm=any uid=48 : exe=/bin/sh deny perm=any uid=48 : exe=/bin/bash
这里uid=48是CentOS上apache用户的默认uid。你可以用id命令查看具体用户的uid。
八、基于文件哈希的精确控制
fapolicyd还支持基于SHA256哈希值来识别文件,这在防止文件被替换或篡改时非常有用。先计算目标文件的哈希:
sha256sum /usr/bin/python3
得到类似这样的输出:
a1b2c3d4e5f6... /usr/bin/python3
然后在规则文件中使用:
allow perm=any uid=root : sha256=a1b2c3d4e5f6...
这样即使有人把/usr/bin/python3替换成恶意程序,只要哈希不匹配,fapolicyd就会拒绝执行。这是一种非常硬核的完整性校验手段。
九、日志审计与监控
fapolicyd的日志默认输出到/var/log/fapolicyd/目录下的fapolicyd.log文件。你可以实时监控:
tail -f /var/log/fapolicyd/fapolicyd.log
日志中会记录每次拦截或放行的详细信息,包括时间、用户、进程路径、操作类型等。建议配合logrotate做日志轮转,避免日志文件过大:
vi /etc/logrotate.d/fapolicyd
/var/log/fapolicyd/fapolicyd.log {
daily
rotate 30
compress
missingok
notifempty
}
十、测试与验证规则是否生效
配置完成后必须测试,否则可能误杀正常程序导致系统不可用。先用一个普通用户测试:
su - testuser whoami /bin/ls
如果ls正常执行,说明/bin目录在信任列表中生效了。然后测试被拒绝的场景:
cp /bin/ls /tmp/my_ls /tmp/my_ls
如果看到"Permission denied"或者程序直接无法启动,说明/tmp目录的拒绝规则生效了。查看日志确认:
grep denied /var/log/fapolicyd/fapolicyd.log
十一、常见问题与排错
问题一:配置后系统命令全部无法执行。这通常是因为规则写得太严格,把必要的路径漏掉了。解决方法是先把规则改宽松,逐步收紧,同时检查trust文件是否包含了所有系统命令目录。
问题二:fapolicyd服务启动失败。检查内核是否支持fanotify,CentOS 7需要确保内核版本在3.16以上。同时检查/etc/fapolicyd/fapolicyd.conf中的daemon配置是否正确。
问题三:规则不生效。执行以下命令重新加载规则:
fapolicyd-cli --update
或者重启服务:
systemctl restart fapolicyd
十二、fapolicyd与SELinux的关系
很多人会问,有了SELinux还需要fapolicyd吗?答案是两者互补而非替代。SELinux是基于安全上下文的强制访问控制,粒度更细但配置复杂;fapolicyd是基于文件路径和哈希的执行控制,配置简单直观。最佳实践是两者同时启用,SELinux做底层强制控制,fapolicyd做应用层执行白名单,形成双重防护。
十三、生产环境部署建议
在生产服务器上部署fapolicyd,建议遵循以下步骤:第一,先在测试环境完整验证规则;第二,保留一个紧急root会话不受fapolicyd限制,防止配置错误锁死自己;第三,逐步收紧策略,先trust再deny最后加allow;第四,定期审计日志,发现异常执行尝试及时调整规则;第五,结合auditd系统审计工具做更全面的安全监控。
总结来说,fapolicyd是CentOS安全加固中一个非常实用的工具,它用相对简单的配置实现了应用程序执行层面的精细化管控。无论是防止webshell执行、限制普通用户权限,还是构建最小权限运行环境,fapolicyd都能胜任。掌握它的配置方法,是每一位Linux运维和安全人员的基本功。
