强制访问控制(MAC)是由系统强制实施的权限控制机制,不同于自主访问控制中用户可自主修改文件权限,MAC会基于预设的安全策略严格限制所有主体对客体的访问,即使root用户也需要遵守策略规则,能有效降低越权访问风险。

强制访问控制的核心概念
在配置强制访问控制前,需要先了解几个核心概念:
- 主体:发起访问请求的进程或用户
- 客体:被访问的文件、目录、端口等资源
- 安全上下文:标识主体和客体的安全属性标签,是策略匹配的核心依据
- 安全策略:定义主体对客体的访问规则,不符合规则的访问会被直接拒绝
基于SELinux的配置方法
SELinux是Linux系统中最常用的强制访问控制实现,大部分RHEL、CentOS、Fedora系统默认集成,配置步骤如下:
1. 检查SELinux运行状态
首先确认SELinux是否开启,执行以下命令查看状态:
# 查看SELinux运行状态 getenforce # 输出Enforcing表示强制模式,Permissive表示宽容模式,Disabled表示关闭
2. 开启SELinux强制模式
如果SELinux处于关闭状态,需要修改配置文件开启:
# 编辑SELinux配置文件 vi /etc/selinux/config # 修改以下内容,设置强制模式 SELINUX=enforcing SELINUXTYPE=targeted # 重启系统生效 reboot
3. 查看和修改文件安全上下文
SELinux通过安全上下文匹配访问规则,查看文件的安全上下文使用ls -Z命令:
# 查看/var/www/html目录的安全上下文 ls -Z /var/www/html # 输出示例:system_u:object_r:httpd_sys_content_t:s0 index.html
如果需要修改文件的安全上下文,使用chcon命令临时调整,或者使用semanage命令永久调整:
# 临时修改文件安全上下文,让httpd进程可以访问 chcon -t httpd_sys_content_t /data/web/index.html # 永久修改目录及子文件的安全上下文 semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?" restorecon -Rv /data/web
4. 配置SELinux访问规则
如果默认策略不满足需求,可以通过audit2allow工具根据拒绝日志生成自定义规则:
# 查看SELinux拒绝日志 tail -f /var/log/audit/audit.log | grep denied # 根据日志生成规则模块 audit2allow -a -M myrule # 加载自定义规则模块 semodule -i myrule.pp
基于AppArmor的配置方法
AppArmor是另一种主流的强制访问控制实现,常用于Ubuntu、Debian等系统,配置方式更偏向路径匹配,步骤如下:
1. 检查AppArmor运行状态
# 查看AppArmor状态 sudo apparmor_status # 输出loaded profile表示已加载的策略,enforce表示强制模式
2. 创建自定义访问控制策略
AppArmor的策略文件存放在/etc/apparmor.d/目录下,创建新的策略文件限制某个进程的文件访问权限:
# 创建限制nginx进程的策略文件 vi /etc/apparmor.d/usr.sbin.nginx
策略文件内容示例如下:
#include <tunables/global>
/usr/sbin/nginx {
# 基础权限包含
#include <abstractions/base>
#include <abstractions/nameservice>
# 允许读取nginx配置目录下的文件
/etc/nginx/** r,
# 允许读写日志目录
/var/log/nginx/* w,
# 禁止访问/root目录下的所有文件
deny /root/** rw,
# 允许绑定80和443端口
network inet tcp,
capability net_bind_service,
}
3. 加载和生效策略
# 重新加载AppArmor策略 sudo systemctl reload apparmor # 查看策略是否生效 sudo apparmor_status | grep nginx
两种实现的选择建议
如果是RHEL系系统优先选择SELinux,策略更完善,安全性更高;如果是Ubuntu系系统优先选择AppArmor,配置更简单,学习成本更低。配置完成后建议先开启宽容模式测试业务是否正常,确认无问题后再切换到强制模式,避免影响正常业务运行。
常见问题排查
如果配置后出现访问异常,首先查看对应的拒绝日志:
- SELinux查看/var/log/audit/audit.log
- AppArmor查看/var/log/syslog,搜索apparmor denied关键字
确认是策略拦截后,再调整对应的安全上下文或策略规则,不要直接关闭强制访问控制机制。