mac策略是围绕主体、客体与规则构建的强制约束体系,不依赖dac授权且不受用户权限干扰;其核心在于明确“谁(进程)能访问什么(资源)”,需通过类型定义、域转换和allow规则实现,并在permissive模式下验证后启用。

MAC 策略不是“写完就生效”的配置脚本,而是围绕主体(进程)、客体(文件/端口/IPC)和策略规则三者建立的强制约束体系。入门关键在于理解策略逻辑、掌握基础语法、并在真实环境中验证行为——不依赖 DAC 授权,也不受用户权限干扰。
明确策略目标与作用域
编写前先锁定两个核心问题:要保护什么?谁(或什么进程)可能访问它?MAC 不处理“张三能不能改这个文件”,而是回答“nginx 进程是否被允许读取 /etc/nginx/conf.d/ 下的配置”。常见目标包括:
- 系统敏感路径:/etc/shadow、/var/log/audit/、/Library/LaunchDaemons/
- 服务专属资源:数据库 socket、Web 服务配置目录、证书存储位置
- 进程通信通道:D-Bus 接口、mach ports、sysv semaphores
作用域建议从单个服务起步,例如只约束 httpd 进程对 /srv/www 的访问,避免一上来就全局启用导致系统不可用。
SELinux 基础策略结构(Linux 服务器主流选择)
以 SELinux 为例,一个最小可用策略由三部分构成:
- 类型定义(type):为进程打标签(如 httpd_t)、为文件打标签(如 httpd_config_t),这是策略判断的基础依据
- 域转换(domain transition):声明当用户执行 /usr/sbin/httpd 时,进程必须进入 httpd_t 域
- 允许规则(allow):明确指定 httpd_t 域可对 httpd_config_t 类型文件执行 read、write 或 getattr
示例片段(.te 文件):
PyCharm 2026.2.0.1 Mac版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合在macOS系统上进行 Python 项目开发、运行、调试和测试。
type httpd_t;
type httpd_config_t;
typeattribute httpd_config_t file_type;
<h1>进程启动时切换到该域</h1><p>domain_auto_trans(unconfined_t, httpd_exec_t, httpd_t)</p><h1>允许读取配置</h1><p>allow httpd_t httpd_config_t:file { read open getattr };</p>macOS 上的等效实践:Mandatory Label + Code Signing
macOS 没有 SELinux,但通过内核级完整性机制实现 MAC 效果。重点使用两类控制点:
-
Mandatory Label(强制标签):用
ls -lZ查看文件是否有system_u:object_r:etc_t类似标记;用sudo xattr -wx com.apple.security.mandatory-label <value> file</value>手动设置(需 SIP 关闭或特殊 entitlement) -
代码签名与运行时限制:通过
codesign --entitlements注入 entitlements.plist,限制进程能访问的 Mach service、文件路径或网络端口,例如com.apple.security.files.user-selected.read-write
注意:macOS 的 MAC 行为高度依赖 SIP(系统完整性保护)。多数强制标签操作需在恢复模式下禁用 SIP 才能生效,生产环境慎用。
验证与调试不能跳过
策略写完不等于生效,必须观察实际访问行为:
- Linux:检查
/var/log/audit/audit.log中的avc: denied记录,用ausearch -m avc -ts recent | audit2why解析拒绝原因 - macOS:启用
sudo dtrace -n 'syscall::open*:entry { printf("%s %s", execname, copyinstr(arg0)); }'观察进程真实打开路径,再比对ls -lZ标签是否匹配 - 通用原则:先用 permissive 模式(
setenforce 0或 macOS 的csrutil enable --without kext)收集日志,再切回 enforcing 模式收紧










