macos无一键开启敏感文件访问审计的原生开关,但可通过unified logging监听tccd/sandboxd/kernel日志、openbsm持久化捕获fr/fw系统调用、fswatch实时监控目录变更,三者组合实现轻量、可追溯、隐私友好的审计能力。

macOS 没有“一键开启敏感文件访问审计”的原生开关,但可通过终端组合命令,聚焦关键路径、进程和事件类型,构建实用、可追溯的审计能力。核心思路是:不追求全盘录像,而抓取高价值线索——谁、何时、试图访问了哪些敏感位置、是否被允许或拦截。
启用 Unified Logging 捕获权限与沙盒事件
这是最轻量、无需重启、系统自带的首选方式。它能记录 App 请求全盘/敏感目录权限、被沙盒拦截的读写尝试、内核层拒绝操作等关键决策点。
执行以下命令实时监听:
log stream \ --predicate 'subsystem == "com.apple.tccd" OR subsystem == "com.apple.sandboxd" OR process == "kernel"' \ --info --debug --signpost
-
tccd日志显示:哪个 App(如com.google.Chrome)在何时请求/Users/xxx/Documents的访问权限,用户点了“允许”还是“拒绝” -
sandboxd日志显示:某个进程(如backupd)尝试读取/Library/Keychains/login.keychain-db被明确拒绝(deny file-read-data) -
kernel日志中配合--debug可看到VFS层 openat 失败的具体路径和错误码
✅ 提示:加
> ~/sensitive_access.log可保存;用--last 1h替换stream可查历史;搜索关键词如"Documents"、"Keychains"、"Downloads"快速定位敏感路径线索。
对指定敏感目录启用持久化读写捕获(OpenBSM)
若需记录实际发生的读写行为(而非仅拦截/授权),可启用系统内置的 OpenBSM 审计子系统,它会将每次 fr(文件读)、fw(文件写)等调用写入二进制日志。
三步完成配置:
# 1. 扩展审计标志(加入 fr,fw)
sudo sed -i '' 's/^flags:.*/flags:lo,aa,fr,fw,fa,fc,fd/' /etc/security/audit_control
# 2. 重载配置并重启守护进程
sudo audit -n && sudo killall -HUP auditd 2>/dev/null || sudo launchctl kickstart -k system/com.apple.auditd
# 3. 验证是否生效(查看最近写入记录)
sudo praudit /var/audit/* 2>/dev/null | awk '/path:/ {p=$0; next} /fr|fw/ && p {print p; p=""}' | grep -E "(Documents|Keychains|Desktop|Library/Keychains)" | head -5
- 日志默认存于
/var/audit/,按时间戳命名(如20260606120000.not_terminated) - 输出中能看到完整路径(如
/Users/me/Documents/report.xlsx)、事件类型(fw)、进程名(Microsoft\ Word)、UID 和时间戳 - 注意:此方式记录的是系统调用级行为,不记录文件内容,隐私友好
实时盯住敏感目录的变更行为(fswatch)
对 /Users/xxx/Documents、~/Desktop、/Library/Preferences 等重点目录,用 fswatch 做轻量级、用户态监听,响应快、无权限要求,适合日常防护。
安装并运行:
brew install fswatch fswatch -o ~/Documents | while read path; do echo "$(date '+%H:%M:%S') — Modified: $path" >> ~/docs_audit.log done
-
-o输出事件数量,配合while read可做定制化动作(如发通知、记录时间戳) - 加
-l 0.5可合并 0.5 秒内的重复事件(避免编辑器自动保存触发多条) - 不依赖 root 权限,适合普通用户长期运行
补充:快速排查近期可疑访问
不需要长期开启审计,也能快速回溯。例如怀疑某文件被异常读取:
# 查看过去24小时内所有涉及该文件的日志(含 tccd/sandboxd/kernel) log show --predicate 'eventMessage contains "/Users/me/Documents/secret.pdf"' --last 24h --style syslog # 或查所有对 Documents 目录的授权请求 log show --predicate 'subsystem == "com.apple.tccd" AND eventMessage contains "Documents"' --last 7d
不复杂但容易忽略











