在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运维和安全人员的基本功。