本指南汇集了在 Apple silicon Mac 上提升 macOS 安全性与隐私性的技术。它面向希望采用组织常用安全实践的经验丰富的用户,但也适合对隐私和安全感兴趣的初学者。
对于由组织管理的 Mac,请参阅由 美国国家标准与技术研究院 维护的 macOS Security Compliance Project。
本指南按“原样”提供 - 不附带任何形式的担保。遵循本指南所产生的任何后果均由您自行承担。
应用通用的安全最佳实践:
建立威胁模型
保持系统和软件更新
softwareupdate命令行工具安装,两者均无需 Apple 账户。加密敏感数据
确保数据可用性
谨慎点击
要真正提升安全性和隐私性,最重要的步骤是建立威胁模型:即对你想要保护的内容、可能试图访问它的对象、他们可能采取的方式,以及哪些控制措施值得用可用性来换取的总体描述。这有助于了解潜在对手及其动机,从而构建更强大的防御。
资产可能包括手机、笔记本电脑、凭据以及个人信息(如浏览历史)。
按照重要程度对它们进行排序,从最值得保护的项目开始。
明确你要防御的对象。首先定义每个对手可能攻击重要资产的动机。例如,经济利益是许多攻击者的主要动机。
针对每个对手,列出他们能做什么和不能做什么,并按能力从弱到强排序。例如,临时起意的小偷属于机会主义作案:他们很可能被屏幕锁定、带强密码的加密存储等基本控制措施阻止。而面对更老练、更坚决的对手,则可能需要在设备不使用时完全关机,以清除内存中的凭据,并采用更强的身份验证机制。
为每种威胁选择最佳的缓解措施。例如,如果室友可能看到,就不要把密码写在纸上;或者对存储进行加密,以防设备被盗时数据泄露。
安全性应与可用性相平衡:每项缓解措施都应对抗对手的某种能力,以证明带来的不便是有价值的。当剩余风险在特定情况下可以接受时,就停止增加防御。当设备、数据、出行、工作或对手发生变化时,应重新审视该模型。
下表是一个简单威胁模型的示例:
了解更多关于威胁建模的信息。
Apple silicon 硬件提供硬件级安全功能,包括基于安全隔区(Secure Enclave)的密钥保护和更强的启动安全选项。它们通常是本指南所讨论防护措施的首选平台。
部分基于 Intel 的 Mac,尤其是使用存在漏洞的 T2 时代硬件的机型,会受到无法通过 macOS 更新完全修复的硬件漏洞影响。
应避免使用运行 macOS 的非 Apple 硬件,以及不支持最新 macOS 版本的系统,因为 Apple 不会为旧版本修补所有漏洞。
Apple 配件通常通过 macOS 接收固件更新,并支持当前的蓝牙安全功能。例如,低功耗蓝牙(BLE)Privacy 使用轮换的设备地址来减少被跟踪的可能;第三方配件可能不支持此功能。
安装 macOS 有多种方式。
请安装最新受支持的 macOS 版本;较新版本的 macOS 包含旧版本所没有的安全修复和其他改进。
在安装过程中,Apple silicon Mac 会联系 Apple 激活服务,以确认该设备未被报告为丢失或被盗。了解此过程的运作方式。
对于 macOS 的基本使用,Apple 账户是可选的,但 App Store 和许多 Apple 服务需要它。在启用各项功能之前,请先查看数据隐私设置。
为 iCloud 启用端到端加密,并查看 Apple 账户数据。
App Store 是一个软件分发平台,其中的应用会由 Apple 进行审核。
App Store 中的应用必须使用 App 沙盒和强化运行时(限制应用行为的安全功能,使某些攻击更难实现)。它同时提供自动软件更新。
使用 App Store 需要 Apple 账户,这可能带来隐私风险。
虚拟化允许另一个操作系统在隔离的虚拟机中运行。在 Apple silicon 上,macOS 可以使用以下应用运行受支持的 macOS 来宾系统以及适用于 ARM 的 Windows 11:
[!WARNING] 下载 VMware 需要 Broadcom 账户并接受相关协议。 Parallels 需要账户、付款信息及其他数据 - 请参阅隐私声明。
Apple Container 是一款用于在 macOS 上运行 Linux 容器的命令行工具。与共享单个 Linux 虚拟机的容器运行时不同,Apple Container 利用 macOS 的虚拟化能力,在每个隔离的轻量级虚拟机中运行各容器。这为工作负载与主机操作系统之间提供了更强的隔离边界。
当 macOS 首次启动时,设置助理会要求创建一个主要账户。
设置一个长且唯一的密码。密码提示字段留空。
避免使用可识别个人身份的名称:计算机名称(例如“John Appleseed 的 MacBook”)会在本地网络上广播,并可被其他设备看到。
系统名称可以在系统设置 > 关于中配置,也可以使用 scutil 命令:```bash
sudo scutil --set ComputerName MacBook
sudo scutil --set HostName MacBook
sudo scutil --set LocalHostName MacBook
# 管理员账户与用户账户
创建的第一个账户是管理员账户。管理员可以更改系统级设置,并使用 [sudo](https://en.wikipedia.org/wiki/Sudo) 运行命令,sudo 会临时授予提升的权限。管理员运行的任何程序都可能获得同样的访问权限;sudo 也可能存在[漏洞](https://bogner.sh/2014/03/another-mac-os-x-sudo-password-bypass/)。
使用专用的标准账户进行日常常规工作,并仅使用管理员账户进行软件和系统的安装、配置和更新,被认为是一种[最佳实践](https://help.apple.com/machelp/mac/10.12/index.html#/mh11389)。
并不需要通过 macOS 登录界面登录管理员账户。当终端命令需要管理员权限时,系统会提示进行身份验证,随后终端继续使用这些权限。为此,Apple 提供了[建议](https://support.apple.com/102099),用于隐藏管理员账户及其主目录。
## 注意事项
- 只有管理员才能在系统范围的 `/Applications` 目录中安装应用。访达和安装器在需要批准时,会要求标准用户输入管理员凭据。有些应用可以安装在 `~/Applications`;不需要管理员权限的应用应安装在用户目录中。App Store 应用仍安装在 `/Applications`,且无需额外身份验证。
- 标准用户通常无权使用 `sudo`。当需要管理员权限时,macOS 会提示输入管理员凭据,或者可以从管理员账户运行该任务。
- 系统设置和若干系统实用工具(例如 Wi-Fi 诊断)需要管理员权限才能获得完整功能。某些系统设置需要通过选择锁形图标来解锁。某些应用在打开时会直接提示身份验证,另一些则必须由管理员账户直接打开才能访问所有功能(例如控制台)。
- 一些第三方应用假定当前用户是管理员,因此无法在标准账户下运行。
- 更多注意事项请参阅 [issue 167](https://github.com/drduh/macOS-Security-and-Privacy-Guide/issues/167)。
## 设置
账户可以在系统设置中创建和管理。在现有系统上,通常更容易的方法是先创建第二个管理员账户,然后将原始账户从管理员账户更改为标准账户。新安装的系统应在设置完成后添加一个标准账户。
在系统设置中,可以从新的管理员账户降级某个账户。
另请参阅[这篇文章](https://superuser.com/a/395738),了解 macOS 如何确定组成员身份。
# 固件
验证固件安全性是否设置为[完全安全性](https://support.apple.com/guide/mac-help/mchl768f7291/mac),以防止系统被篡改。这是默认设置。
# FileVault
搭载 Apple silicon 的 Mac 默认使用硬件支持的存储加密。[FileVault](https://support.apple.com/guide/mac-help/protect-data-on-your-mac-with-filevault-mh11785/mac) 还要求授权用户的密码才能在重启后解锁启动卷。
在 Apple silicon 上,FileVault 授权还会保护[固件](https://support.apple.com/102384),从而阻止从指定启动磁盘以外的任何设备启动、访问[恢复](https://support.apple.com/guide/mac-help/macos-recovery-a-mac-apple-silicon-mchl82829c17/15.0/mac/15.0#mchl5abfbb29)模式,以及使用设备固件更新 (DFU) 模式进行[恢复](https://support.apple.com/108900)。
FileVault 会提示设置恢复密钥;如果使用,应将其存储在安全的位置。FileVault 还提供使用 iCloud 恢复的选项。
确认 FileVault 状态:```bash
fdesetup status
锁定模式 通过禁用系统和应用功能中常见于复杂攻击的功能,显著减少攻击面。
启用锁定模式后,Safari 有一个选项可以将受信任的网站排除在限制之外。
macOS 有几种类型的防火墙可用。
[!NOTE] 如果恶意软件获得管理员控制权,它可能会禁用或绕过防火墙策略;不要依赖本地防火墙作为防止系统完全沦陷的强大防护。
内置防火墙提供基本保护,仅阻止传入连接。它既不能监视,也不能阻止传出连接。
可以通过系统设置中的网络的防火墙标签页进行控制,或使用以下命令:```bash sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setglobalstate on
### 隐身模式
攻击者经常扫描网络以识别目标系统。当启用[隐身模式](https://support.apple.com/guide/mac-help/use-stealth-mode-to-keep-your-mac-more-secure-mh17133/mac)时,系统不会对来自关闭端口的连接尝试发送响应,从而更难以被检测到。
启用隐身模式:```bash
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setstealthmode on
默认情况下,防火墙允许 Apple 或已识别开发者签名的软件接收传入连接。禁用这些规则后,macOS 会在允许应用接收传入连接之前进行询问:```bash sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsigned off sudo /usr/libexec/ApplicationFirewall/socketfilterfw --setallowsignedapp off
### 重新加载防火墙
使用 `socketfilterfw` 更改设置后,重新加载防火墙服务以应用新配置:```bash
sudo pkill -HUP socketfilterfw
确认防火墙状态:```bash
for firewallFlag in
--getglobalstate
--getblockall
--getallowsigned
--getstealthmode
--listapps
do /usr/libexec/ApplicationFirewall/socketfilterfw "$firewallFlag"
done
或者使用 [system profiler](https://ss64.com/mac/system_profiler.html):```bash
system_profiler SPFirewallDataType
启用应用层防火墙并为内置软件禁用传入连接会阻止 AirDrop 正常工作。要使 AirDrop 正常工作,请为 sharingd 和 rapportd 授予防火墙例外:```bash
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/libexec/rapportd
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/libexec/sharingd
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp /usr/libexec/rapportd
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --unblockapp /usr/libexec/sharingd
## 第三方防火墙
诸如 [Little Snitch](https://www.obdev.at/products/littlesnitch/index.html)、[Radio Silence](https://radiosilenceapp.com/) 和 [LuLu](https://objective-see.com/products/lulu.html) 等应用程序在易用性和安全性之间提供了平衡。
这些程序能够监控并阻止传入和传出连接。但是,它们可能需要闭源的[系统扩展](https://support.apple.com/HT210999)。
如果频繁的允许或阻止提示令人应接不暇,可以临时允许连接,同时记录它们(Little Snitch 中的 [Silent Allow 模式](https://help.obdev.at/littlesnitch6/concepts-opmodes))。检查配置以了解并控制网络活动。
## 数据包过滤器
macOS 还包含 [pf](https://en.wikipedia.org/wiki/PF_(firewall)),这是一个从命令行配置的数据包过滤防火墙。它功能强大,但比内置的应用防火墙复杂得多。
pf 也可以通过图形应用程序(如 [Murus](https://www.murusfirewall.com/))进行控制。
许多[书籍](https://nostarch.com/book-of-pf-4e)和[指南](https://www.openbsd.org/faq/pf/)都介绍了 pf 防火墙。以下示例展示了如何配置基本策略。
### pf 配置示例
将以下规则添加到名为 `pf.rules` 的文件中:```console
# Define interface
wifi = "en0"
# Global options
set block-policy drop
set skip on lo0
set state-policy if-bound
set ruleset-optimization basic
# Normalize
scrub in on $wifi all fragment reassemble
# Define tables
table <blocklist> persist
# Deny and log blocked traffic
block log all
block quick from no-route to any
antispoof quick for $wifi
# Enforce blocklist
block log quick on $wifi from <blocklist> to any
block log quick on $wifi from any to <blocklist>
# Allow DHCP
pass out on $wifi proto udp from any port 68 to any port 67 keep state
pass in on $wifi proto udp from any port 67 to any port 68 keep state
# Allow outbound TCP
pass out on $wifi proto tcp from ($wifi) to any flags S/SA keep state
# Allow outbound UDP
pass out on $wifi proto udp from ($wifi) to any keep state
# Allow outbound ICMP (ping)
pass out on $wifi proto icmp from ($wifi) to any keep state
配置 pf 的高级示例可在 pf/pf.rules 中查看。
控制防火墙:
| Command | Task |
|---|---|
sudo pfctl -e -f pf.rules | 使用配置文件启用防火墙 |
sudo pfctl -t blocklist -T add 1.2.3.4 | 向阻止列表表添加 IPv4 地址 |
sudo pfctl -d | 禁用防火墙 |
监控防火墙:
pf 可以阻止网络地址范围,例如阻止整个组织。查询 Merit RADb 获取某个 自治系统(由单个组织运营的大型网络)所使用的网络列表,例如 Facebook:```bash whois -h whois.radb.net '!gAS32934'
将返回的网络列表添加到阻止列表:```bash
sudo pfctl -t blocklist -T add $(whois -h whois.radb.net '!gAS32934' | sed -n '2p')
确认地址已添加:```console $ sudo pfctl -t blocklist -T show No ALTQ support in kernel ALTQ related functions disabled 31.13.24.0/21 31.13.64.0/24 157.240.0.0/16 ...
确认到这些地址的网络流量已被阻止(DNS 请求仍将正常工作):```console
$ dig a +short facebook.com
157.240.2.35
$ curl --connect-timeout 5 -I https://facebook.com/
* Trying 157.240.2.35...
* TCP_NODELAY set
* Connection timed out after 5002 milliseconds
* Closing connection 0
curl: (28) Connection timed out after 5002 milliseconds
$ sudo tcpdump -tqni pflog0 'host 157.240.2.35'
IP 192.168.1.1.62771 > 157.240.2.35.443: tcp 0
IP 192.168.1.1.62771 > 157.240.2.35.443: tcp 0
IP 192.168.1.1.62771 > 157.240.2.35.443: tcp 0
防火墙会丢弃启动 TCP 连接 所需的初始数据包,因此连接会超时。
更多灵感请参阅 drduh/config/scripts/pf-blocklist.sh。
许多系统和用户后台服务由 launchd 管理。
管理员账户可以在 系统设置 中修改服务和扩展。
要读取服务配置:```bash defaults read /System/Library/LaunchAgents/com.apple.Finder
> [!IMPORTANT]
> 系统服务受 [SIP](https://github.com/drduh/macOS-Security-and-Privacy-Guide#system-integrity-protection) 保护;禁用 SIP 来修改系统服务可能会危及安全性并导致系统不稳定。
要查看服务的状态:```bash
find /var/db/com.apple.xpc.launchd \
-type f -print -exec defaults read {} \; 2>/dev/null
更多信息,请参阅 使用 launchd 进行脚本管理 和 launchd.info。
Siri 建议和 Spotlight 可能会根据启用的功能向 Apple 发送某些查询或使用信息。在系统设置中,搜索 Siri 和 Spotlight,然后关闭在线建议,并配置要从索引或建议中排除的类别。请参阅 Apple 的 搜索与隐私 政策以了解更多信息。
如果某个程序无法通过 App Store 获取,可以考虑使用 Homebrew。
[!IMPORTANT] 某些 Homebrew 安装或管理工作流程可能会提示授予 App 管理或完全磁盘访问权限。只有在完全理解并确有必要时,才授予这些权限。
定期在可信且安全的网络上运行 brew upgrade 以安装软件更新。要在安装前获取软件包信息,请运行 brew info <package> 并在线查看其 formula。启用其他安全选项,例如 HOMEBREW_NO_INSECURE_REDIRECT=1
根据 Homebrew 的匿名分析,Homebrew 会收集匿名使用分析并将其报告到自托管的 InfluxDB 实例。
要退出 Homebrew 分析,请运行 brew analytics off,或在 shell 启动文件中设置 HOMEBREW_NO_ANALYTICS=1。
macOS 提供“DNS 配置文件”功能,用于配置加密 DNS、过滤和 DNSSEC。
DNS 配置文件可以通过创建获得,也可以从 Quad9、AdGuard 和 NextDNS 等提供商处获取。
使用 hosts 文件 阻止与恶意软件、广告和其他不需要的服务相关的域名。
要通过 A 记录 阻止某个域名,请将以下任意一行追加到 /etc/hosts:```
0 example.com
0.0.0.0 example.com
127.0.0.1 example.com
> [!NOTE]
> IPv6 使用 AAAA 记录而非 A 记录:通过包含 `::1 example.com` 条目来阻止 IPv6 连接。
网上有许多现成的域名列表。在将某个列表追加到 `/etc/hosts` 之前,请确保每个条目以 `0`、`0.0.0.0` 或 `127.0.0.1` 开头,并保留 `127.0.0.1 localhost` 条目。
常用的 hosts 列表包括:
- [StevenBlack/hosts](https://github.com/StevenBlack/hosts)
- [Sinfonietta/hostfiles](https://github.com/Sinfonietta/hostfiles)
- [someonewhocares.org](https://someonewhocares.org/hosts/zero/hosts)
如需下载列表并将其追加到 hosts 文件,请使用 [tee](https://man7.org/linux/man-pages/man1/tee.1.html) 命令:```bash
curl https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts |
sudo tee -a /etc/hosts
Little Snitch 也支持 blocklists。
要加密 DNS 流量,可考虑 DNSCrypt/dnscrypt-proxy。当配置了受信任的解析器时,DNSCrypt 会对 DNS 查询进行加密。DNSSEC 还可以在支持的情况下验证已签名的 DNS 响应。
通过 Homebrew 安装 DNSCrypt,并按照说明配置和启动 dnscrypt-proxy:```bash
brew install dnscrypt-proxy
当将 DNSCrypt 与 Dnsmasq 配合使用时,通过运行以下命令找到 DNSCrypt 配置文件:```bash
brew info dnscrypt-proxy | grep dnscrypt-proxy.toml | head -1
此命令应显示一个路径,例如 /opt/homebrew/etc/dnscrypt-proxy.toml。
默认情况下,dnscrypt-proxy 在 127.0.0.1:53 上监听,并将查询发送到一个或多个已配置的 DNS 提供商。修改配置并将 listen_addresses 更改为使用 53 以外的端口,例如 5355:```toml
listen_addresses = ['127.0.0.1:5355', '[::1]:5355']
启动 DNSCrypt:```bash
sudo brew services restart dnscrypt-proxy
确认 DNSCrypt 正在运行:```console $ sudo lsof +c 15 -Pni UDP:5355 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME dnscrypt-proxy 15244 nobody 7u IPv4 0x1337f85ff9f8beef 0t0 UDP 127.0.0.1:5355 dnscrypt-proxy 15244 nobody 10u IPv6 0x1337f85ff9f8beef 0t0 UDP [::1]:5355 dnscrypt-proxy 15244 nobody 12u IPv4 0x1337f85ff9f8beef 0t0 UDP 127.0.0.1:5355 dnscrypt-proxy 15244 nobody 14u IPv6 0x1337f85ff9f8beef 0t0 UDP [::1]:5355
此外,这些 pf 规则会阻止回环接口之外通往 53 端口的常规 DNS 流量,以降低 [DNS 泄露](https://dnsleaktest.com/) 的风险:```console
block drop quick on !lo0 proto udp from any to any port = 53
block drop quick on !lo0 proto tcp from any to any port = 53
dnsmasq 可以缓存响应,阻止对非限定名称的上游查询,并屏蔽整个顶级域名。
将其与 DNSCrypt 结合使用以加密 DNS 流量。
如果你不使用 DNSCrypt,至少应选择 ISP 以外的 DNS 解析器。两个常用的替代方案是 Google DNS 和 OpenDNS。
安装 Dnsmasq:```bash brew install dnsmasq
下载并编辑 [drduh/config/dnsmasq.conf](https://github.com/drduh/config/blob/main/dnsmasq.conf) 或默认配置文件。
参见 [drduh/config/domains](https://github.com/drduh/config/tree/main/domains) 获取可添加以阻止特定目标的示例域名列表。
安装并启动该程序(需要 sudo 才能绑定到[特权端口](https://unix.stackexchange.com/questions/16564/why-are-the-first-1024-ports-restricted-to-the-root-user-only) 53):```bash
sudo brew services start dnsmasq
要将 dnsmasq 设置为本地 DNS 服务器,请打开 系统设置 > 网络,选择当前正在使用的网络连接(例如 Wi-Fi),然后打开 DNS 选项卡,选择 +,并添加 127.0.0.1,或者使用:```bash
sudo networksetup -setdnsservers "Wi-Fi" 127.0.0.1
确认 Dnsmasq 已配置:```console
$ scutil --dns | head
DNS configuration
resolver #1
search domain[0] : whatever
nameserver[0] : 127.0.0.1
flags : Request A records, Request AAAA records
reach : 0x00030002 (Reachable,Local Address,Directly Reachable Address)
$ networksetup -getdnsservers "Wi-Fi"
127.0.0.1
[!NOTE] 某些 VPN 应用在连接时会覆盖 DNS 设置。请参阅 问题 24 和 drudh/config/scripts/macos-dns.sh。
macOS 包含一组由世界各地企业、政府及其他组织运营的可信根证书颁发机构(CAs)。可信 CA 可以签发 macOS 和浏览器可能接受用于 HTTPS 连接的证书,使根 CA 存储成为系统信任边界的关键部分。
使用 钥匙串访问 或 security 命令行工具以及 /System/Library/Keychains/SystemRootCertificates.keychain 文件检查 系统根证书,以了解 Apple 提供的可信根存储。也可以通过以下命令启动钥匙串访问:```bash
open "/System/Library/CoreServices/Applications/Keychain Access.app"
同时,请检查**登录**、**个人物品**和**系统**钥匙串中可能由用户、管理员、VPN 客户端、安全产品或移动设备管理应用程序添加的任何证书。
要禁用选定的证书,请将其信任设置修改为**永不信任**,然后关闭窗口以确认。这样做可以降低 [中间人攻击(MITM)](https://wikipedia.org/wiki/Man-in-the-middle_attack) 的风险,在这种攻击中,欺诈性证书会被用来[静默截获](https://en.wikipedia.org/wiki/DigiNotar#Issuance_of_fraudulent_certificates)加密流量。
> [!WARNING]
> 删除或修改证书颁发机构信任设置可能会破坏网站、软件更新、企业网络、VPN、强制门户和其他服务。
有关当前信任存储信息,请参阅 Apple 的[可用受信任证书](https://support.apple.com/103723)和[已阻止证书](https://support.apple.com/103247#blocked)列表。
# Privoxy
考虑使用 [Privoxy](https://www.privoxy.org/) 作为本地代理来过滤网络流量。
使用 Homebrew 安装并启动 Privoxy:```bash
brew install privoxy
brew services start privoxy
或者,也可以从 其网站 或 Sourceforge 获取 Privoxy 的签名安装包。签名包比 Homebrew 版本 更安全,并得到 Privoxy 项目的支持。
默认情况下,Privoxy 监听本地 TCP 端口 8118。
将活动网络接口的系统 HTTP 代理设置为 127.0.0.1 和端口 8118:```bash
sudo networksetup -setwebproxy "Wi-Fi" 127.0.0.1 8118
设置系统 **HTTPS** 代理:```bash
sudo networksetup -setsecurewebproxy "Wi-Fi" 127.0.0.1 8118
代理也可以在系统设置 > 网络 > 详细信息 > 代理中设置。
确认代理已设置:```console $ scutil --proxy { ExceptionsList : { 0 : *.local 1 : 169.254/16 } FTPPassive : 1 HTTPEnable : 1 HTTPPort : 8118 HTTPProxy : 127.0.0.1 HTTPSEnable : 1 HTTPSPort : 8118 HTTPSProxy : 127.0.0.1 }
虽然大多数网络流量是加密的,但 Privoxy 可以根据主机名过滤请求。例如,以下规则会阻止所有流量,但 .net、github.com 和 Apple 域名的流量除外:```console
{ +block{all} }
.
{ -block }
.apple.
.github.com
.net
要屏蔽 Facebook 域名:```console { +block{facebook} } .cdninstagram. .facebook*. .fb. .fbcdn*. .fbinfra. .fbsbx. .fbstatic*. .fbsv. .fburl. .instagr.am .tfbnw. .thefacebook. fb*.akamaihd.net
参见 [drduh/config/privoxy/config](https://github.com/drduh/config/blob/main/privoxy/config) 和 [drduh/config/privoxy/user.action](https://github.com/drduh/config/blob/main/privoxy/user.action) 以获取更多 Privoxy 示例。编辑过滤规则后,Privoxy **不需要**重启。
要验证流量是否被阻止或重定向,请在浏览器中使用 [curl](https://en.wikipedia.org/wiki/CURL) 或打开 Privoxy 界面 <http://p.p>:```console
$ ALL_PROXY=127.0.0.1:8118 curl example.com -IL | head
HTTP/1.1 403 Request blocked by Privoxy
Content-Length: 9001
Content-Type: text/html
Cache-Control: no-cache
Pragma: no-cache
$ ALL_PROXY=127.0.0.1:8118 curl github.com -IL | head
HTTP/1.1 302 Local Redirect from Privoxy
Location: https://github.com/
Content-Length: 0
HTTP/1.1 200 Connection established
HTTP/2 200
content-type: text/html; charset=utf-8
[!NOTE] 应用程序和服务可以忽略代理设置。pf 可以通过代理重定向流量,而无需单独配置每个应用程序。
Web 浏览器会下载并执行不受信任的互联网内容,因此会带来重大的安全和隐私风险。
一个关键的浏览器安全边界是同源策略(SOP),它可以防止一个网站读取另一个网站的数据。绕过该策略可能会暴露同一浏览器配置文件中其他站点的数据或操作。
某些浏览器攻击依赖于诱骗用户安装软件、授予权限或使用恶意扩展。要特别小心意外的下载、扩展提示以及在终端中运行命令的请求。
浏览器扩展也会带来重大的安全风险:恶意或制作拙劣的扩展可能会危及浏览器中的一切,包括凭据。浏览器扩展的使用应仅限于那些绝对必要的、并且仅由值得信赖的开发者发布的扩展。
为不同的身份和用途使用单独的浏览器配置文件。如果可行,请禁用 JavaScript,并仅使用浏览器的站点权限在受信任的站点上允许其运行。
Mozilla Firefox、Google Chrome、Safari 和 Tor Browser 都是流行的浏览器,各自具有独特的功能和不同的用途。
Firefox 通过 Quantum 和 Photon 项目对其代码库的主要部分进行了现代化改造。Quantum 包括将一些组件从 C++ 迁移到 Rust,这是一种旨在提高内存安全和并发安全的编程语言。
Firefox 提供与 Chrome 相当的安全模型,其中包括一个用于负责任地披露漏洞的漏洞赏金计划。Firefox 的发布周期为四周。
有关推荐的配置,请参阅 drduh/config/firefox.user.js 和 arkenfox/user.js。另外可参见 NoScript,这是一个允许选择性阻止脚本的扩展。
Firefox 专注于用户隐私。它在隐私浏览模式下支持跟踪保护。跟踪保护可以针对默认账户启用,尽管它可能破坏某些网站上的浏览体验。处于严格跟踪保护模式的 Firefox 会随机化指纹以防御跟踪。Firefox 提供独立的用户配置文件。浏览活动也可以借助多账户容器加以分隔。
Firefox 仅通过 WebExtension API 支持 Web 扩展,该 API 与 Chrome 非常相似。向 Firefox 提交 Web 扩展是免费的。Firefox 中的 Web 扩展大多数时候是开源的,尽管某些 Web 扩展是专有的。
Google Chrome 基于开源的 Chromium 项目。Chrome 包含一些专有组件、自动更新、PDF 查看器、媒体编解码器支持、崩溃报告以及 Google 账户集成。有关更多信息,请查看 Chrome 的隐私设置和 Google 的隐私政策。
Chrome 提供多设备间的账户同步,包括凭据;数据使用账户密码进行加密。
Chrome 在全球使用量中占据最大份额,并且是大多数开发者的首选目标平台。许多主要技术都基于 Chrome 的开源组件,例如使用 Chrome 的 V8 引擎的 node.js,以及基于 Chromium 和 node.js 的 Electron 框架。Chrome 庞大的用户群使其成为威胁行为者和安全研究人员最具吸引力的目标。尽管攻击不断,Chrome 多年来仍保持着令人印象深刻的安全记录。这绝非易事。
Chrome 提供独立配置文件、强大的沙箱机制、频繁的更新,并拥有骄人的安全记录。此外,Google 还提供非常丰厚的漏洞赏金计划用于报告漏洞,并设有自己的 Project Zero 团队。这意味着大量才华横溢且干劲十足的人员在持续不断地审计和加固 Chrome 的代码。
考虑在浏览器设置中禁用 V8 优化(JavaScript 引擎性能特性) - 有关安全权衡,请参阅此说明。
使用 uBlock Origin Lite 阻止跟踪器。
禁用 DNS 预取(参见 DNS 预取及其隐私影响)。Chrome 可能会尝试 使用 Google 的 8.8.8.8 和 8.8.4.4 公共名称服务器解析 DNS。
请参阅 Chromium 安全 和 Chromium 隐私 了解更多信息。阅读 Google 隐私政策 以了解个人信息是如何被收集和使用的。
Safari 是 Apple 的内置浏览器,集成于 macOS,可在 Apple 硬件上提升电池效率。
Safari 同时包含开源和专有组件。Safari 基于开源的 Web 引擎 WebKit,该引擎在 macOS 生态系统中无处不在。WebKit 被 Apple 的应用(如邮件、图书和 App Store)使用。Chrome 的 Blink 引擎是 WebKit 的一个分支,两者有许多相似之处。
Safari 支持一些有利于用户安全和隐私的独特功能。内容拦截器 可以在不使用 JavaScript 的情况下创建内容拦截规则。这种基于规则的方法极大地改善了内存使用、安全性和隐私。Safari 11 引入了智能跟踪预防,它会在用户与跟踪器网站无交互一段时间后,移除 Safari 中存储的跟踪数据。Safari 可以随机化浏览器指纹以减少跟踪。出于安全和隐私原因,Safari 刻意不支持某些功能,例如 WebUSB 或 Battery API。Safari 中的隐私标签页拥有隔离的 cookie 和缓存,关闭标签页时这些数据即被销毁。Safari 还支持配置文件,相当于 Firefox 的多账户容器,用于分隔 cookie 和浏览数据。通过锁定模式可以显著提高 Safari 的安全性,该模式可以按站点禁用。请阅读更多关于 Safari 中跟踪预防的内容。
Safari 中的 Web 扩展除了支持 Web Extension API 之外,还可以选择在 Safari 的沙箱环境中使用原生代码。Safari 中的 Web 扩展也通过 Apple App Store 分发。向 App Store 提交还可以获得额外的好处,即 Web 扩展代码由 Apple 审核。另一方面,向 App Store 提交的代价高昂。年度开发者订阅费用为 100 美元(相比之下,Chrome 的费用为 5 美元,Firefox 则为免费提交)。高昂的成本对大多数开源开发者来说难以承受。因此,Safari 可供选择的扩展非常少。不过,在安装扩展时请牢记这一高昂成本。预计大多数 Web 扩展都会有某种方式将使用行为变现,以支付开发成本。应避免使用没有开源代码可供审查的 Web 扩展。
Safari 通过 iCloud 钥匙串 同步用户偏好设置和密码。查看已保存的密码需要使用当前设备账户密码或其他已配置的认证方式进行认证。
Safari 实现新 Web 功能的速度比 Chrome 或 Firefox 慢,但安全补丁会通过系统更新及时提供。
另请参阅 el1t/uBlock-Safari 以禁用超链接审计信标。
网站会从设置、字体、屏幕尺寸、语言、IP 地址和浏览器行为中推断有关浏览器和设备的信息。这些信息构成了浏览器指纹。
有关注重安全的浏览方式以及浏览器会发送哪些数据的更多信息,请参阅 HowTo: Privacy & Security Conscious Browsing、browserleaks.com、Am I Unique? 和 EFF Cover Your Tracks 等资源。
为减少跨站点跟踪,请阻止第三方 cookie。
同时要注意 WebRTC,它可能会泄露本机或公共(如果连接到 VPN)IP 地址。在 Firefox 和 Chrome/Chromium 中,可以使用 uBlock Origin 禁用此功能。锁定模式 也会在 Safari 中禁用 WebRTC。
Tor 是一个匿名网络,可以在浏览时提供额外的隐私保护。Tor Browser 是一款基于 Firefox 的改良版浏览器,配置为使用 Tor 网络。
从 Tor Project 下载 Tor Browser,以及用于验证的 dmg 和 asc 文件:```console
$ cd ~/Downloads
$ file tor-browser-macos-* tor-browser-macos-15.0.17.dmg: XZ compressed data, checksum NONE tor-browser-macos-15.0.17.dmg.asc: PGP signature Signature (old)
$ gpg --verify tor-browser-macos-*.asc [...] gpg: Can't check signature: No public key
$ gpg --auto-key-locate nodefault,wkd --locate-keys [email protected] gpg: key 0x4E2C6E8793298290: public key "Tor Browser Developers (signing key) [email protected]" imported gpg: Total number processed: 1 gpg: imported: 1 pub rsa4096/0x4E2C6E8793298290 2014-12-15 [C] [expires: 2027-07-15] Key fingerprint = EF6E 286D DA85 EA2A 4BA7 DE68 4E2C 6E87 9329 8290 uid [ unknown] Tor Browser Developers (signing key) [email protected] sub rsa4096/0x157432CF78A65729 2024-07-15 [S] [expires: 2026-10-26] Key fingerprint = CAAE 408A EBE2 288E 96FC 5D5E 1574 32CF 78A6 5729
$ gpg --verify tor-browser-macos-*.asc gpg: assuming signed data in 'tor-browser-macos-15.0.17.dmg' gpg: Signature made Sun Jun 28 15:35:20 2026 PDT gpg: using RSA key CAAE408AEBE2288E96FC5D5E157432CF78A65729 gpg: Good signature from "Tor Browser Developers (signing key) [email protected]" [unknown] gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: EF6E 286D DA85 EA2A 4BA7 DE68 4E2C 6E87 9329 8290 Subkey fingerprint: CAAE 408A EBE2 288E 96FC 5D5E 1574 32CF 78A6 5729
确保输出中出现 `Good signature from "Tor Browser Developers (signing key) <[email protected]>"`。出现此警告是正常的,因为该密钥尚未经过个人验证并添加到受信任的密钥环。
更多信息请参阅[如何验证 Tor Browser 的签名?](https://support.torproject.org/tbb/how-to-verify-signature/)。
要完成 Tor Browser 的安装,请打开磁盘映像并将其拖到应用程序文件夹,或使用命令:```bash
hdiutil mount tor-browser-macos-15.0.17.dmg
cp -r /Volumes/Tor\ Browser/Tor\ Browser.app/ ~/Applications/
验证应用已由 Tor 项目的 Apple Developer ID(MADPSAYN6T)签名:```console
$ spctl --assess -vv ~/Applications/Tor\ Browser.app
/Users/user1/Applications/Tor Browser.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: The Tor Project, Inc (MADPSAYN6T)
$ pkgutil --check-signature ~/Applications/Tor\ Browser.app Package "Tor Browser.app": Status: signed by a certificate trusted by macOS Certificate Chain: 1. Developer ID Application: The Tor Project, Inc (MADPSAYN6T) Expires: 2028-10-11 17:57:46 +0000 SHA256 Fingerprint: 76 3C 89 02 ED CB AD 8E 59 86 1E 93 D3 05 5B 28 F9 04 0C 96 03 8B 16 28 9F 38 64 ED 53 45 B4 DA ------------------------------------------------------------------------ 2. Developer ID Certification Authority Expires: 2031-09-17 00:00:00 +0000 SHA256 Fingerprint: F1 6C D3 C5 4C 7F 83 CE A4 BF 1A 3E 6A 08 19 C8 AA A8 E4 A1 52 8F D1 44 71 5F 35 06 43 D2 DF 3A ------------------------------------------------------------------------ 3. Apple Root CA Expires: 2035-02-09 21:40:36 +0000 SHA256 Fingerprint: B0 B1 73 0E CB C7 FF 45 05 14 2C 49 F1 29 5E 6E DA 6B CA ED 7E 2C 68 C5 BE 91 B5 A1 10 01 F0 24
命令 `codesign` 也可用于检查应用程序的代码签名:```console
$ codesign -dvv ~/Applications/Tor\ Browser.app
Executable=/Users/user1/Applications/Tor Browser.app/Contents/MacOS/firefox
Identifier=org.torproject.torbrowser
Format=app bundle with Mach-O universal (x86_64 arm64)
CodeDirectory v=20500 size=805 flags=0x10000(runtime) hashes=14+7 location=embedded
Signature size=9054
Authority=Developer ID Application: The Tor Project, Inc (MADPSAYN6T)
Authority=Developer ID Certification Authority
Authority=Apple Root CA
Timestamp=Jun 28, 2026 at 14:01:57
Notarization Ticket=stapled
Info.plist entries=27
TeamIdentifier=MADPSAYN6T
Runtime Version=15.5.0
Sealed Resources version=2 rules=13 files=208
Internal requirements count=1 size=188
要查看已签名应用的完整证书详细信息,请使用 codesign 提取,并使用 openssl 解码:```console
$ codesign -d --extract-certificates ~/Applications/Tor\ Browser.app
Executable=/Users/user1/Applications/Tor Browser.app/Contents/MacOS/firefox
$ file codesign* codesign0: Certificate, Version=3 codesign1: Certificate, Version=3 codesign2: Certificate, Version=3 Certificate, Version=02
$ openssl x509 -inform der -in codesign0 -subject -issuer -startdate -enddate -noout subject= /UID=MADPSAYN6T/CN=Developer ID Application: The Tor Project, Inc (MADPSAYN6T)/OU=MADPSAYN6T/O=The Tor Project, Inc/C=US issuer= /CN=Developer ID Certification Authority/OU=G2/O=Apple Inc./C=US notBefore=Oct 11 17:57:47 2023 GMT notAfter=Oct 11 17:57:46 2028 GMT
$ openssl x509 -inform der -in codesign0 -fingerprint -noout SHA256 Fingerprint=76:3C:89:02:ED:CB:AD:8E:59:86:1E:93:D3:05:5B:28:F9:04:0C:96:03:8B:16:28:9F:38:64:ED:53:45:B4:DA
Tor 浏览器可以使用称为[可插拔传输](https://support.torproject.org/tor-browser/circumvention/)的特殊连接方法,使流量更难以识别或阻止。这可以通过设置一个[中继](https://support.torproject.org/relays/)或使用现有的[网桥](https://bridges.torproject.org/)来实现。
Tor 网络提供[匿名性](https://www.privateinternetaccess.com/blog/2013/10/how-does-privacy-differ-from-anonymity-and-why-are-both-important/),这不一定是隐私。该网络无法防御能够进行流量分析和关联的全局观察者。另请参阅[《在互联网全景监狱中寻求匿名》](https://bford.info/pub/net/panopticon-cacm.pdf)和[《现实对手对 Tor 的流量关联》](https://www.ohmygodel.com/publications/usersrouted-ccs13.pdf)。
更多信息请参阅[Tor 协议规范](https://spec.torproject.org/tor-spec/)。
另请参阅[隐形互联网项目(I2P)](https://geti2p.net/en/about/intro)及其[与 Tor 的对比](https://geti2p.net/en/comparison/tor)。
# VPN
请选择有据可查、使用现代协议且客户端经过良好审计的 VPN 提供商或自托管设置。避免使用诸如 [PPTP](https://en.wikipedia.org/wiki/Point-to-Point_Tunneling_Protocol#Security) 之类的过时协议,而应使用 [OpenVPN](https://en.wikipedia.org/wiki/OpenVPN) 或 [WireGuard](https://www.wireguard.com/) [部署在 Linux 虚拟机中](https://github.com/mrash/Wireguard-macOS-LinuxVM),或通过一组[跨平台工具](https://www.wireguard.com/xplatform/)。
当连接被中断或断开时,某些 VPN 客户端可能会将流量发送到下一个可用的网络接口。有关如何仅允许流量通过 VPN 的示例,请参阅 [scy/8122924](https://gist.github.com/scy/8122924)。
参见在虚拟机([hwdsl2/setup-ipsec-vpn](https://github.com/hwdsl2/setup-ipsec-vpn))或 Docker 容器([hwdsl2/docker-ipsec-vpn-server](https://github.com/hwdsl2/docker-ipsec-vpn-server))上设置 [IPsec](https://en.wikipedia.org/wiki/Ipsec) VPN 的指南。
可能值得考虑 VPN 提供商的地理位置。更多讨论请参阅 [issue 114](https://github.com/drduh/macOS-Security-and-Privacy-Guide/issues/114)。
另请参阅这篇关于 macOS 内置 VPN L2TP/IPsec 和 [IKEv2](https://en.wikipedia.org/wiki/IKEv2) 客户端的[技术概述](https://blog.timac.org/2018/0717-macos-vpn-architecture/)。
# PGP/GPG
PGP 是用于加密和签名数据(尤其是电子邮件)的标准。它可以保护在正确交换和验证密钥的通信者之间的消息内容,但无法保护诸如电子邮件收件人和主题行之类的元数据。
GPG(GNU Privacy Guard)是一个符合 PGP 标准、采用 GPL 许可的开源程序。它可以验证软件签名,并可以[对称地](https://en.wikipedia.org/wiki/Symmetric-key_algorithm)或使用[公钥](https://en.wikipedia.org/wiki/Public-key_cryptography)加密文件。
使用 Homebrew 安装 GnuPG(`brew install gnupg`),或安装 [GPG Suite](https://gpgtools.org/)。
下载 [gpg.conf](https://github.com/drduh/YubiKey-Guide/blob/main/config/gpg.conf) 以使用推荐设置:```bash
curl -o ~/.gnupg/gpg.conf \
https://raw.githubusercontent.com/drduh/YubiKey-Guide/main/config/gpg.conf
参见 drduh/YubiKey-Guide 以生成和管理凭据。
电子邮件并非默认就能提供强大的隐私保护:邮件内容可能会被服务提供商保留、复制到收件人的邮箱、转发,或因账户泄露而暴露。元数据(包括收件人、主题、时间戳和邮件服务器信息)通常即使在邮件内容加密后仍然可见。
Thunderbird 是一款免费开源的电子邮件客户端,支持标准的 IMAP、POP、CalDAV 和 CardDAV 协议。它是访问邮件并在本地保留副本的不错选择,无需完全依赖提供商的远程服务器。
Thunderbird 支持 OpenPGP 电子邮件加密,可保护邮件内容并提供加密签名。在依赖某个密钥进行敏感通信之前,务必通过独立渠道验证公钥指纹。
归档邮件功能 可以将邮件从远程服务器移到 Local Folder,从而提高隐私性。
XMPP 是由 IETF 开发的开放协议,支持跨平台、联邦式消息传递。有众多客户端选项。可以考虑使用基于浏览器的客户端,以利用浏览器的沙盒。
根据提供商的不同,设置账户时可能只需要用户名和密码。
XMPP 默认不提供端到端加密(E2EE);请配合兼容的客户端使用 OMEMO。
Signal 是一款流行的 E2EE 即时通讯工具,其双棘轮协议也被 WhatsApp、Google Messages 和 Facebook Messenger 等许多其他应用采用。
要使用 Signal 桌面应用,必须先在手机上安装 Signal。
更多指导请参阅 EFF 的 Signal 指南。
iMessage 是 Apple 自有的即时通讯工具。使用它需要一个 Apple Account。
启用联系人密钥验证并验证联系人。
iMessage 可以使用电话号码或电子邮件。
[!WARNING] 默认情况下,iCloud 备份处于启用状态,会在没有 E2EE 的情况下将消息加密密钥的副本存储到 Apple 的服务器 上。要防止这种情况,请停用 iCloud 备份或启用高级数据保护。同时提醒消息接收者也这样做。
参见 Mac OS X 上恶意软件的持久化方法 和 OS X Yosemite 上的恶意软件持久化,了解常见 macOS 恶意软件的持久化方式。
高级 macOS 恶意软件能力的示例,请参见 Hacking Team 材料。如需进一步分析,请参见 适用于 MacOS 的 root 安装、Mac Agent 的支持驱动程序 和 适用于 Mac 的 RCS Agent。
另请参阅 对 RCS 植入程序安装程序的简要分析 和 reverse.put.as。
来自 App Store 或 获得 Apple 公证 的应用可能会降低恶意软件风险,但这两个过程都不能保证安全。Apple 会对已公证的应用进行自动检查,App Store 应用也会经过审核。除此之外,请从开发者指定的官方来源获取软件,并确认网站或命令行下载使用 HTTPS。
检查应用程序是否使用 App Sandbox:```bash
codesign --display --entitlements -
/System/Applications/Calculator.app 2>&1 |
grep -A2 com.apple.security.app-sandbox
启用 App Sandbox 后,输出应为:```console
[Key] com.apple.security.app-sandbox
[Value]
[Bool] true
Activity Monitor 还可以通过显示的 "Sandbox" 列来指示其是否已启用:```bash
defaults write com.apple.ActivityMonitor "UserColumnsPerTab v6.0"
-dict-add 0 '(Command, CPUUsage, CPUTime, Threads, IdleWakeUps, Architecture, GPUUsage, GPUTime, PID, UID, Sandbox, restricted)'
App Store 软件必须使用 App Sandbox。诸如 Google Chrome 等应用程序使用自己的 [sandbox](https://chromium.googlesource.com/chromium/src/+/HEAD/docs/design/sandbox.md),可能不会使用 App Sandbox。
> [!NOTE]
> 沙盒会限制应用程序的默认访问权限,但 entitlements 和用户授予的权限可以扩大访问范围。
## Hardened Runtime
检查应用程序是否使用 [Hardened Runtime](https://developer.apple.com/documentation/security/hardened_runtime):```bash
codesign --display --verbose /path/to/application.app
如果启用了 Hardened Runtime,输出中将显示 flags=0x10000(runtime)。
列出所有启用了此功能的应用:```bash for app in /Applications/.app /System/Applications/.app; do if codesign -dvv "$app" 2>&1 | grep -q 'flags=0x10000(runtime)'; then echo "$app" fi done
**活动监视器**有一个选项可以显示“受限”列,指示某个程序是否被限制通过 macOS 的 [动态链接器](https://pewpewthespells.com/blog/blocking_code_injection_on_ios_and_os_x.html) 注入代码。
强化运行时是分发应用获得公证的先决条件。
## 防病毒
要扫描文件和应用程序,可以考虑将其上传到 [VirusTotal](https://www.virustotal.com/gui/home/upload),但请注意这会使它们公开可见。
macOS 包含名为 [XProtect](https://support.apple.com/guide/security/protecting-against-malware-sec469d47bd8) 的内置防病毒软件,它在后台运行并自动更新用于检测恶意软件的签名。如果检测到恶意软件,XProtect 会尝试将其移除并隔离。
检查 XProtect 更新状态:```bash
xprotect version
诸如 BlockBlock 或 hazcod/maclaunch 之类的应用程序可能有助于防范或检测持久性恶意软件。
杀毒软件可以帮助检测常见恶意软件,但也可能增加攻击面,因为它通常以广泛的系统权限运行。某些产品还可能向厂商发送遥测数据或样本。
参见 Sophail:对杀毒软件的实际攻击、ESET 漏洞的分析与利用、热门安全软件遭到 NSA 和 GCHQ 的无情攻击 以及 以色列如何抓获在全球搜寻美国机密信息的俄罗斯黑客。
Gatekeeper 会验证软件的公证书和来源。
Gatekeeper 在打开未公证的应用程序时会发出警告。可以绕过此警告,方法是在尝试失败后选择 系统设置 > 隐私与安全性 中列出的应用程序。
检查 Gatekeeper 是否已启用:```bash spctl --status --verbose
# 系统完整性保护
要验证系统完整性保护是否已启用,请使用命令 `csrutil status`,其应返回:`System Integrity Protection status: enabled.` 否则,请使用[恢复模式](https://support.apple.com/102518)来[启用 SIP](https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection)。
# 元数据和痕迹
macOS 会将元数据([APFS 扩展属性](https://en.wikipedia.org/wiki/Extended_file_attributes#macOS))附加到文件上。
某些元数据属性可以使用 [`mdls`](https://ss64.com/mac/mdls.html) 和 [`xattr`](https://ss64.com/mac/xattr.html) 命令查看和删除。偏好设置(`plist`)文件可以使用 [`defaults`](https://ss64.com/mac/defaults.html) 读取和修改。
系统和应用程序元数据可以在以下位置找到:
- `~/Library/Preferences/`
- `~/Library/Containers/<APP>/Data/Library/Preferences`
- `/Library/Preferences`
蓝牙信息:
- `/Library/Preferences/com.apple.Bluetooth.plist`
打印机任务缓存:
- `/var/spool/cups`
此前连接过的 iOS 设备:
- `/Users/$USER/Library/Preferences/com.apple.iPod.plist`
- `/Library/Preferences/com.apple.iPod.plist`
Finder 偏好设置:
- `~/Library/Preferences/com.apple.finder.plist`
- `~/Library/Preferences/com.apple.sidebarlists.plist`
诊断数据:
- `/var/db/CoreDuet`
- `/var/db/diagnostics`
- `/var/db/systemstats`
- `/var/db/uuidtext`
- `/var/log/DiagnosticMessages`
拼写和语言建议:
- `~/Library/LanguageModeling`
- `~/Library/Spelling`
- `~/Library/Suggestions`
应用程序状态:
- `~/Library/Saved\ Application\ State`
- `~/Library/Containers/<APPNAME>/Data/Library/Saved\ Application\ State`
自动保存元数据:
- `~/Library/Containers/<APP>/Data/Library/Autosave\ Information`
- `~/Library/Autosave\ Information`
Siri 分析数据:
- `~/Library/Assistant/SiriAnalytics.db`
QuickTime Player 历史记录:
- `~/Library/Containers/com.apple.QuickTimePlayerX/Data/Library/Preferences/com.apple.QuickTimePlayerX.plist`
杂项元数据:
- `~/Library/Containers/com.apple.appstore/Data/Library/Preferences/com.apple.commerce.knownclients.plist`
- `~/Library/Preferences/com.apple.commerce.plist`
- `~/Library/Preferences/com.apple.QuickTimePlayerX.plist`
# 身份验证
[Passwords](https://support.apple.com/guide/passwords/the-passwords-app-mchl901b1b95/mac) 应用会创建[安全凭据](https://support.apple.com/guide/security/automatic-strong-passwords-secc84c811c4/web)。它支持[通行密钥](https://fidoalliance.org/passkeys/),这是一种在与兼容服务一起使用时旨在抵御网络钓鱼的凭据。
[KeePassXC](https://keepassxc.org/) 是一个值得考虑的开源跨平台密码管理器。它支持使用兼容的硬件令牌进行强身份验证,并提供浏览器扩展来自动输入凭据。
可以使用 [Diceware](https://secure.research.vt.edu/diceware/) 创建易记的密码。
确保在线账户已启用[多因素身份验证](https://en.wikipedia.org/wiki/Multi-factor_authentication)。优先选择抗网络钓鱼的身份验证,例如硬件令牌或与支持的服务一起使用的通行密钥。验证器应用优于短信验证码,但任何 MFA 都比仅使用密码的身份验证更好。
[YubiKey](https://www.yubico.com/products/) 是一种流行的硬件身份验证令牌。它还可以存储用于加密、签名和身份验证任务的密钥——参见 [drduh/YubiKey-Guide](https://github.com/drduh/YubiKey-Guide)。
GnuPG 还可以管理密码和其他加密文件——参见 [drduh/Purse](https://github.com/drduh/Purse) 和 [drduh/pwd.sh](https://github.com/drduh/pwd.sh)。
# 备份
在将文件备份到外部介质或在线服务之前,先在本地对文件进行加密。
遵循 [3-2-1 备份模型](https://www.cisa.gov/sites/default/files/publications/data_backup_options.pdf):保留三份重要数据的副本,将它们存储在至少两种不同类型的介质上,并至少保留一份副本在独立的物理位置。
## Time Machine
[Time Machine](https://support.apple.com/104984) 是 macOS 上处理备份的内置工具。使用外部驱动器或网络存储创建[加密](https://support.apple.com/guide/mac-help/keep-your-time-machine-backup-disk-secure-mh21241)备份。
## GnuPG
[GnuPG](https://www.gnupg.org/) 可以与密码或公钥一起使用,私钥存储在 [YubiKey](https://github.com/drduh/YubiKey-Guide) 上。
使用密码压缩并加密目录:```bash
tar zcvf - ~/Downloads |
gpg -c > ~/Downloads/backup-$(date +%F-%H%M%S).tar.gz.gpg
解密并解压该目录:```bash gpg -o ~/Downloads/decrypted-backup.tar.gz -d ~/Downloads/backup-*.tar.gz.gpg tar zxvf ~/Downloads/decrypted-backup.tar.gz
## 磁盘工具
加密卷可以使用[磁盘工具](https://support.apple.com/guide/disk-utility/toc)或 `hdiutil` 创建:```bash
hdiutil create ~/Downloads/encrypted.dmg -encryption -size 50M -volname "secretStuff"
hdiutil mount ~/Downloads/encrypted.dmg
cp -v ~/Documents/passwords.txt /Volumes/secretStuff
hdiutil eject /Volumes/secretStuff
Wi-Fi 网络名称(即 SSID)和设备探测行为可以揭示附近以及之前使用过的网络信息。隐藏网络 无法提供有意义的隐私保护,反而可能导致设备主动探测它们。
设置私有 Wi-Fi 地址以减少网络跟踪。
将无线网络安全设置为 WPA3。按照 Apple 指南 为路由器和接入点配置推荐设置。
对于远程 SSH 连接,请使用由口令或硬件令牌保护的唯一 SSH 密钥,验证服务器主机密钥,并避免基于密码的身份验证。有关推荐的客户端选项,请参阅 drduh/config/ssh_config。
SSH 隧道可以安全地将流量路由到另一台计算机,类似于 VPN。要使用在远程主机上端口 8118 运行的 Privoxy:```bash ssh -C -L 5555:127.0.0.1:8118 [email protected] sudo networksetup -setwebproxy "Wi-Fi" 127.0.0.1 5555 sudo networksetup -setsecurewebproxy "Wi-Fi" 127.0.0.1 5555
或者使用 SSH 连接作为 [SOCKS 代理](https://www.mikeash.com/ssh_socks.html):```bash
ssh -NCD 3000 [email protected]
默认情况下,macOS 未启用远程登录(SSH 服务器)。
要启用 SSH 并允许传入连接,请使用系统设置 > 通用 > 共享或执行以下命令:```bash sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist
禁用密码认证,并考虑进一步[加固](https://stribika.github.io/2015/01/04/secure-secure-shell.html) SSH 服务器配置。参见 [drduh/config/sshd_config](https://github.com/drduh/config/blob/main/sshd_config) 获取推荐选项。
确认 SSH 服务器正在运行:```bash
sudo lsof -Pni TCP:22
请勿将电脑置于不安全的地方无人看管。技术高超的攻击者在无人监督的物理访问条件下,可能安装硬件键盘记录器来记录按键,包括密码。使用带有内置键盘或蓝牙键盘的 Mac 会使此类攻击更难实施,因为许多现成的攻击工具设计为插入 USB 键盘与电脑之间。
为减少 Mac 在使用中被盗的后果,可考虑使用 buskill/buskill-app 或 Lennolium/swiftGuard。
考虑购买隐私屏幕/过滤器,以便在公共场合使用。
指甲油和防篡改密封条可涂覆/贴附在组件上,以检测篡改行为。
使用控制台或 log stream 命令监控系统日志。
以经典 syslog 格式打印最近 5 分钟内的所有系统日志:```bash log show --last 5m --style syslog
输出为 JSON 数组:```bash
log show --last 5m --style json
输出换行分隔的 JSON(每行一个 JSON 对象);这是 jq 所要求的:```bash log show --last 5m --style ndjson
按子系统过滤消息,例如来自 `com.apple.SoftwareUpdate`:```bash
log show --last 1h --style json \
--predicate 'subsystem == "com.apple.SoftwareUpdate"'
按内容筛选消息,例如包含 failed:```bash
log show --last 1h --predicate 'eventMessage CONTAINS "failed"'
不区分大小写的消息过滤:```bash
log show --last 1h --predicate 'eventMessage CONTAINS[c] "error"'
使用 jq 统计不同的错误消息:```bash
log show --last 1h --style ndjson
--predicate 'eventMessage CONTAINS[c] "error"' |
jq -r '.eventMessage' | sort | uniq -c | sort -nr | head -100
将日志导出到归档,可使用“控制台”打开:```bash
log collect --last 1h --output ~/Downloads/logs-$(date +%F-%H%M).logarchive
System Integrity Protection 会干扰 DTrace,使用前必须部分禁用。
iosnoop 监视磁盘 I/Oopensnoop 监视文件打开execsnoop 监视进程errinfo 监视失败的系统调用dtruss 监视所有系统调用有关更多信息,请参阅 man -k dtrace。
使用活动监视器或 ps 命令列出正在运行的进程。
列出打开的网络连接:```bash sudo lsof -Pni
列出各种网络相关数据结构的内容:```bash
sudo netstat -n -p tcp
sudo netstat -n -p udp | sort | uniq
Wireshark 可以通过命令行与 tshark 一起使用。
将 en0 替换为 networksetup -listallhardwareports 显示的活跃接口。
[!IMPORTANT] 仅在你获授权监控的网络和系统上捕获流量。
监控 DNS:```bash
/Applications/Wireshark.app/Contents/MacOS/tshark -i en0
-Y "dns.flags.response == 1" -Tfields
-e frame.time_delta
-e dns.qry.name
-e dns.a
-Eseparator=,
监控 HTTP:```bash
/Applications/Wireshark.app/Contents/MacOS/tshark -i en0 \
-Y "http.request or http.response" -Tfields \
-e ip.dst \
-e http.request.full_uri \
-e http.request.method \
-e http.response.code \
-e http.response.phrase \
-Eseparator=/s
监控 TLS 证书:```bash
/Applications/Wireshark.app/Contents/MacOS/tshark -i en0
-Y "ssl.handshake.certificate" -Tfields
-e ip.src
-e x509sat.uTF8String
-e x509sat.printableString
-e x509sat.universalString
-e x509sat.IA5String
-e x509sat.teletexString
-Eseparator=/s -Equote=d
# 杂项
## 屏幕保护程序
设置屏幕保护程序启动时立即锁定屏幕:```bash
defaults write com.apple.screensaver askForPassword -int 1
defaults write com.apple.screensaver askForPasswordDelay -int 0
禁用诊断与用量数据。
禁用崩溃报告器(应用程序崩溃后出现并提示向 Apple 报告问题的对话框):```bash defaults write com.apple.CrashReporter DialogType none
## 媒体播放器
使用内置的媒体应用程序 [QuickTime Player](https://en.wikipedia.org/wiki/Quicktime_player) 播放音乐和视频文件。它采用 [App Sandbox](https://developer.apple.com/documentation/security/app_sandbox/protecting_user_data_with_app_sandbox)、[Hardened Runtime](https://developer.apple.com/documentation/xcode/configuring-the-hardened-runtime),并作为基础系统的一部分受益于 [Signed System Volume](https://support.apple.com/guide/security/signed-system-volume-security-secd698747c9/web)。
## 文件处理程序
管理[默认文件处理程序](https://support.apple.com/guide/mac-help/choose-an-app-to-open-a-file-on-mac-mh35597),以降低打开某些文件类型的风险。
更改脚本文件的默认应用程序,以便打开它们时显示其内容而不是执行它们。
在 Finder 中,定位并选择任意 .sh 文件,右键单击它并选择“显示简介”或按 <kbd>Command</kbd> + <kbd>I</kbd>。在“打开方式”部分,从下拉菜单中选择 TextEdit。如果未列出,请选择“其他...”和“应用程序 > TextEdit.app”。选择“全部更改...”,然后选择“继续”进行确认。
## Finder 选项
在 Finder 中显示隐藏文件和“资源库”文件夹:```bash
defaults write com.apple.finder AppleShowAllFiles -bool true
chflags nohidden ~/Library
显示所有文件扩展名:```bash defaults write NSGlobalDomain AppleShowAllExtensions -bool true
请勿默认将文稿存储到 iCloud:```bash
defaults write NSGlobalDomain NSDocumentSaveNewDocumentsToCloud -bool false
设置自定义 umask:```bash sudo launchctl config user umask 077
重新启动,然后创建一个文件/目录并验证权限(macOS 默认允许 'group/other' 读取访问):```console
$ ls -ld umask*
drwx------@ 2 user1 staff 64 Jul 26 12:00 umask.dir
-rw-------@ 1 user1 staff 32 Jul 26 12:00 umask.txt
在终端中启用安全键盘输入(这可能会干扰 TextExpander 等应用程序)。
禁用 Bonjour 组播通告(这也会禁用 AirPlay 和 AirPrint 功能):```bash
sudo defaults write /Library/Preferences/com.apple.mDNSResponder
NoMulticastAdvertisements -bool YES
[禁用 Handoff](https://support.apple.com/guide/mac-help/change-airdrop-handoff-settings-mchl6a407f99) 和 [蓝牙](https://support.apple.com/guide/mac-help/turn-bluetooth-on-or-off-blth1008) 功能。
## Sudoers
macOS 自带的 `/etc/sudoers` 中有这样一行:```bash
Defaults env_keep += "HOME MAIL"
这会阻止 sudo 在权限提升时更改 HOME。因此,通过 sudo 运行的程序可能会使用发起调用用户主目录中的配置文件。除非特别需要此行为,否则请考虑从 env_keep 中移除 HOME。
为了保留 root 用户使用非 root 用户主目录的便利性,请向 /var/root/.zshrc 追加一行 export,例如:```bash
export HOME=/Users/user1
# 相关软件
软件 | 类别 | 描述
:-: | :-: | :-
[lynis](https://github.com/CISOfy/lynis) | 审计扫描器 | 跨平台安全审计工具,检查系统配置并建议加固改进。
[zentral](https://github.com/zentralopensource/zentral) | 监控与配置平台 | 适用于 macOS 端点的设备群管理服务器;收集清单、事件、审计和 osquery 结果。最适合受管环境。
[osquery](https://github.com/osquery/osquery) | 监控引擎 | 将操作系统状态以 SQL 表形式呈现,支持对进程、用户、启动项、网络连接等进行可重复检查。
[pareto-mac](https://github.com/paretoSecurity/pareto-mac) | 审计扫描器 | 菜单栏应用,用于根据常见基线安全建议检查 Mac。
# 其他资源
- [iCloud 安全与隐私概览](https://support.apple.com/102651)
- [EFF 监控自卫指南](https://ssd.eff.org/)
- [beerisgood/macOS_Hardening](https://github.com/beerisgood/macOS_Hardening)
- [macOS 逆向工程博客](https://reverse.put.as/)
- [逆向工程资源](http://samdmarshall.com/re.html)
- [Malwarebytes 博客](https://www.malwarebytes.com/blog)
- [Objective-See 博客](https://objective-see.com/blog.html)
- [CIS 基准](https://www.cisecurity.org/benchmark/apple_os/)
- [Apple 开源](https://opensource.apple.com/)
- [iOS,macOS 的未来,以及日益充满敌意的全球环境中的自由、安全与隐私](https://gist.github.com/iosecure/357e724811fe04167332ef54e736670d)
| 对手 | 动机 | 能力 | 缓解措施 |
|---|
| 室友 | 查看私人聊天或浏览历史 | 近距离接触;可看到屏幕或观察到凭据输入 | 使用生物识别(指纹或面容)身份验证,使用防窥屏,不使用时保持手机锁定 |
| 小偷 | 解锁手机、窃取个人信息并掏空银行账户,或出售手机获利 | 观察密码输入过程,偷走无人看管且已登录的设备 | 始终随身保管设备,不使用时锁定设备,避免在公共场合输入密码,使用“查找”(Find My)或类似服务跟踪或远程禁用被盗设备 |
| 罪犯 | 经济利益 | 社会工程学(诱骗用户泄露信息或采取危险操作)、可轻易获取的恶意软件、密码重用、利用漏洞 | 对软件进行沙盒化,启用操作系统安全功能,自动保持软件更新 |
| 企业 | 基于用户数据的营销 | 遥测与行为数据收集 | 封锁网络连接,重置设备专属标识符,避免添加支付数据 |
| 国家/APT | 定向监控 | 对互联网基础设施的被动监控,高级加密分析 | 使用开源软件、强 diceware 凭据、配备安全元件的硬件,不使用时关闭设备,设置绊网/蜜罐/金丝雀令牌警报 |
| Command | Task |
|---|
sudo pfctl -t blocklist -T show | 显示阻止列表 |
sudo pfctl -s rules | 显示活动规则 |
sudo pfctl -s states | 显示状态表 |
sudo ifconfig pflog0 create | 创建数据包日志接口 |
sudo tcpdump -ni pflog0 | 监控被阻止的数据包 |
| 命令 | 任务 |
|---|
launchctl list | 查看用户任务 |
sudo launchctl list | 查看系统任务 |
launchctl list com.apple.Finder | 检查服务 |
systemextensionsctl list | 列出系统扩展 |
ls /System/Library/LaunchDaemons | 列出系统守护进程 |
ls /System/Library/LaunchAgents | 列出系统代理 |