macos 无原生全盘文件访问审计开关,但可通过终端启用 unified logging 捕获 tccd、sandboxd、trustd 和 kernel 等关键子系统日志,结合 tcc.db 修改时间戳实现间接审计。
macos 本身不提供直接开启“全盘文件访问行为审计日志”的终端开关命令。系统没有内置的、类似 linux auditd 的通用文件访问实时审计子系统,也不会默认记录每个 app 对每个文件的读写操作。
但你可以通过以下两种有效路径实现近似目标:一是启用 Unified Logging 中与文件访问强相关的系统服务日志(如 sandboxd、tccd、trustd、kernel 文件系统事件);二是配合隐私数据库变更日志和进程行为监控,构建可追溯的访问线索。关键在于“间接审计”,而非“全程录像”。
启用与文件访问密切相关的系统级日志源
这些日志虽不记录“谁读了 /Users/me/Documents/secret.txt”,但能捕获:
- App 请求全盘访问权限的弹窗与授权决策(tccd)
- 沙盒违规访问被拦截的尝试(sandboxd)
- 内核层 VFS 层异常文件操作(如越权 openat、mmap 失败)
- 权限数据库(TCC.db)的修改时间戳与调用进程
执行以下命令即可实时捕获这些关键事件:
log stream \ --predicate 'subsystem == "com.apple.tccd" OR subsystem == "com.apple.sandboxd" OR subsystem == "com.apple.trustd" OR process == "kernel"' \ --info --debug --signpost
✅ 说明:
--info --debug确保捕获中等级以上日志(含授权请求、拒绝详情)--signpost显示结构化事件边界,便于识别完整访问流程- 若需保存为文件:末尾加
> ~/file_access_audit.log- 按
Ctrl+C停止;如需后台运行,可用nohup ... &
查看近期全盘访问相关的历史日志(含授权/拒绝记录)
log show \ --predicate 'subsystem == "com.apple.tccd" AND (eventMessage contains "full disk access" OR eventMessage contains "allow" OR eventMessage contains "deny")' \ --last 7d \ --style syslog
? 典型输出线索包括:
tccd: [com.apple.tccd] Requesting full disk access for /Applications/Slack.apptccd: [com.apple.tccd] Granting full disk access to com.slack.Slacksandboxd: [com.apple.sandboxd] deny(1) file-read-data /private/var/folders/...
补充:确认 TCC 数据库变更时间(辅助审计时间锚点)
全盘访问授权实际写入 /Library/Application Support/com.apple.TCC/TCC.db。可通过如下命令查看该数据库最近修改时间,结合日志交叉验证:
stat -f "Modified: %Sm" /Library/Application\ Support/com.apple.TCC/TCC.db 2>/dev/null
⚠️ 注意:直接读取 TCC.db 需要
sudo和全盘访问权限本身,普通用户无法导出完整授权列表;但修改时间戳是公开可查的审计线索。
不推荐也不可行的做法
- ❌
sudo sysctl -w kern.audit=1:macOS 不支持 BSD audit subsystem,该参数无效 - ❌ 修改
/etc/security/audit_control:系统无 auditd 服务,配置文件不存在 - ❌ 依赖
/var/log/system.log:该文件在 macOS 10.12+ 后已不记录 TCC/sandbox 事件,信息严重缺失
不复杂但容易忽略:真正的文件访问审计能力,需依赖第三方 EDR 工具(如 SentinelOne、CrowdStrike)或自建基于 EndpointSecurity.framework 的监听器。终端原生命令能做到的是——精准捕获权限申请、授权决策、沙盒拦截这三类关键节点日志,这已是 macOS 架构下最务实、最可靠的审计起点。











