macos系统级访问控制由dac、mac和沙盒三者嵌套协同实现:dac提供基础所有权权限(如owner/group/everyone),mac通过sip、完全磁盘访问等施加不可绕过强制约束,沙盒则在运行时基于entitlements进行细粒度行为限制,三者分层校验,任一失败即拒绝访问。
macos 的系统级访问控制不是单一机制,而是 dac、mac 和沙盒三者嵌套协同的结果:dac 提供基础所有权控制,mac(通过 sip 和权限策略)施加不可绕过的强制约束,沙盒则在进程启动时注入细粒度的运行时限制。三者分层生效,缺一不可。
自主访问控制(DAC)是文件系统的默认底座
DAC 在 macOS 中体现为传统的 owner/group/everyone 权限模型和 ACL。用户创建的文件默认由其所有,可自行修改权限(如 chmod、chown),也可通过“共享与权限”界面调整其他账户或组的访问级别。它灵活易用,但存在明显短板:一旦恶意程序以用户身份运行,就能继承该用户全部 DAC 权限——比如读取“文稿”、写入“下载”、甚至删除桌面文件。
关键细节:
- ACL 比传统三位权限更精细,支持对特定用户或组单独赋权(如仅允许某同事读取某文件夹)
- “everyone”权限需主动禁用,否则常成为横向渗透入口
- DAC 不阻止 root 或 sudo 用户的操作,因此不能作为高敏感数据的唯一防线
强制访问控制(MAC)提供不可覆盖的安全基线
macOS 的 MAC 实现并非传统 SELinux 那样的标签系统,而是以系统策略引擎为核心,通过多道硬性闸门强制执行:
- 系统完整性保护(SIP):锁定 /System、/usr、/bin 等核心路径,即使 root 也无法修改,防止内核级劫持
-
完全磁盘访问(Full Disk Access):应用必须显式获准才能访问“邮件”“备忘录”“iCloud Drive”等敏感位置,未授权即返回
EPERM - 网络与硬件访问策略:摄像头、麦克风、定位服务等均需独立授权,且开关状态对用户可见
这些策略由系统签名验证并固化,用户无法关闭(除 Recovery OS 中临时禁用 SIP 外),真正实现“管理员定义、全员遵守”。
沙盒机制是运行时的动态权限围栏
沙盒不是附加组件,而是 macOS 应用分发的强制要求(App Store 应用必须启用,开发者可为 Mac App 手动配置)。它在进程启动前加载 entitlements 清单,将 DAC 和 MAC 规则进一步细化到行为粒度:
- 一个图片编辑器可声明只读取用户选中的文件(
user-selected.read-only),即使它有 DAC 写权,也无法自动扫描“文稿”目录 - 网络请求被拦截,除非明确声明
network.client;访问剪贴板需额外开启com.apple.security.clipboard - 沙盒进程无法通过 Unix 套接字、XPC 或共享内存直接与其他进程通信,必须经由系统批准的代理服务
沙盒不替代 DAC 或 MAC,而是在它们之上叠加一层“按需放行”的执行过滤——哪怕 DAC 允许、MAC 未禁止,沙盒仍可拒绝。
三者如何协同工作
当一个 App 尝试打开 ~/Documents/report.pdf 时,访问决策按顺序触发:
- 先过 MAC:是否在「完全磁盘访问」列表中?不在 → 直接拒绝
- 若已授权,则检查 DAC:当前用户是否对该文件有读权限?否 → 拒绝
- 若 DAC 也满足,再查沙盒:entitlements 是否包含
com.apple.security.files.user-selected.read-only或更宽泛的文档访问权限?不匹配 → 拒绝
任一环节失败,操作即终止,且错误类型不同(MAC 返回 EPERM,DAC 返回 EACCES),便于调试与审计。这种纵深防御结构,让 macOS 能在保持易用性的同时,守住企业级数据边界。











