亚马逊AWS官方博客

Amazon EC2 Mac 实例现支持禁用系统完整性保护(SIP)

我们高兴地宣布,开发人员现在可以通过编程方式在 Amazon EC2 Mac 实例上禁用 Apple 系统完整性保护 (SIP)。系统完整性保护 (SIP),也称为无根模式,是 Apple 在 OS X El Capitan(2015 年发布的 10.11 版本)中推出的一项安全功能。它旨在通过限制根用户账户的权限,保护系统免受潜在恶意软件的侵害。SIP 在 macOS 上默认处于启用状态。

SIP 通过防止修改受保护的文件和文件夹、限制访问系统所有的文件和目录以及阻止未经授权的软件选择启动盘来保护系统。SIP 的主要目标是解决与不受限制的根访问相关的安全风险——这种风险可能让恶意软件仅凭一个密码或漏洞就能完全控制设备。通过实施这种保护机制,Apple 旨在为 macOS 用户(特别是许多使用弱密码或无密码管理账户的用户)提供更高等级的安全保障。

虽然 SIP 在日常使用中能有效防御恶意软件,但开发人员偶尔可能需要出于开发和测试目的,暂时将其禁用。例如,在创建新的设备驱动程序或系统扩展时,必须禁用 SIP 才能安装和测试代码。此外,SIP 可能会阻止访问软件正常运行所需的某些系统设置。临时禁用 SIP 可提供必要的权限,以便为 macOS 微调程序。但务必记住,这就像为授权维护而短暂打开保管库门,绝非永久敞开。

在 Mac 上禁用 SIP,需要物理接触设备。您必须在恢复模式下重启设备,使用 csrtutil 命令行工具禁用 SIP,然后再次重启设备。

此前,EC2 Mac 实例只能使用标准 SIP 设置。由于需要物理接触和恢复模式启动,将 SIP 与 Amazon EC2 控制面板和 EC2 API 集成颇具挑战。但现在情况已不再如此! 您可以在 Amazon EC2 Mac 实例上自由禁用和重新启用 SIP。下面让我演示具体操作。

工作原理

想象我们已经启动一个 EC2 Mac 实例。它是一个 mac2-m2.metal 实例,运行在 Apple Silicon M2 处理器上。现在只需调用新的 EC2 API CreateMacSystemIntegrityProtectionModificationTask 即可轻松禁用或启用 SIP。此 API 是异步的;它会启动更改实例 SIP 状态的过程。您可以通过另一个新的 EC2 API DescribeMacModificationTasks来监控进度。我在整个过程中只需要知道目标实例的 ID。

先决条件

对于基于 Apple silicon 的 EC2 Mac 实例和较新类型的计算机,在调用新的 EC2 API 之前,我必须设置 ec2 用户的用户密码,并在 macOS 上为该用户启用安全令牌。这需要连接到计算机并在终端中键入两个命令。

# 在目标 EC2 Mac 实例上
# 为 ec2 用户设置密码
~ % sudo /usr/bin/dscl . -passwd /Users/ec2-user
新密码:(MyNewPassw0rd)

# 为 ec2 用户启用具有相同密码的安全令牌
# 旧密码是您刚刚用 dscl 设置的密码
~ % sysadminctl -newPassword MyNewPassw0rd -oldPassword MyNewPassw0rd
2025-03-05 13:16:57.261 sysadminctl[3993:3033024] 正在尝试更改 ec2 用户的密码...
2025-03-05 13:16:58.690 sysadminctl[3993:3033024] SecKeychainCopyLogin 返回 -25294
2025-03-05 13:16:58.690 sysadminctl [3993:3033024] 更新密钥链密码失败 (-25294)
2025-03-05 13:16:58.690 sysadminctl [3993:3033024]-完成

# 有关密钥链的错误在预料之中。我从未连接过这台计算机上的 GUI,因此不存在登录密钥链
# 您可以忽略此错误。 以下命令显示了此会话中激活的密钥链列表
~ % security list
    "/Library/Keychains/System.keychain"

# Verify that the secure token is ENABLED
~ % sysadminctl -secureTokenStatus ec2-user
2025-03-05 13:18:12.456 sysadminctl [4017:3033614] 已为用户 ec2-user 启用安全令牌

更改 SIP 状态

我不需要连接到计算机即可切换 SIP 状态。我只需要知道它的实例 ID。我在笔记本电脑上打开终端,使用 AWS 命令行界面 (AWS CLI) 检索 Amazon EC2 Mac 实例 ID。

 aws ec2 describe-instances \
         --query "Reservations[].Instances[?InstanceType == 'mac2-m2.metal' ].InstanceId" \
         --output text

i-012a5de8da47bdff7

现在,我还是在笔记本电脑的终端上,使用 create-mac-system-integrity-protection-modification-task 命令禁用 SIP:

echo '{"rootVolumeUsername":"ec2-user","rootVolumePassword":"MyNewPassw0rd"}' > tmpCredentials
aws ec2 create-mac-system-integrity-protection-modification-task \
--instance-id "i-012a5de8da47bdff7" \
--mac-credentials fileb://./tmpCredentials \
--mac-system-integrity-protection-status "disabled" && rm tmpCredentials

{
    "macModificationTask": {
        "instanceId": "i-012a5de8da47bdff7",
        "macModificationTaskId": "macmodification-06a4bb89b394ac6d6",
        "macSystemIntegrityProtectionConfig": {},
        "startTime": "2025-03-14T14:15:06Z",
        "taskState": "pending",
        "taskType": "sip-modification"
    }
}

任务启动后,我可以使用 aws ec2 describe-mac-modification-tasks 命令检查其状态。

{
    "macModificationTasks": [
        {
            "instanceId": "i-012a5de8da47bdff7",
            "macModificationTaskId": "macmodification-06a4bb89b394ac6d6",
            "macSystemIntegrityProtectionConfig": {
                "debuggingRestrictions": "",
                "dTraceRestrictions": "",
                "filesystemProtections": "",
                "kextSigning": "",
                "nvramProtections": "",
                "status": "disabled"
            },
            "startTime": "2025-03-14T14:15:06Z",
            "tags": [],
            "taskState": "in-progress",
            "taskType": "sip-modification"
        },
...

实例将启动该流程并执行多次重启,在此期间将处于不可访问状态。该流程可能需要 60 至 90 分钟才能完成。之后,当我看到控制台中的状态再次变为可用时,我会像往常一样通过 SSH 或 EC2 实例连接连接到计算机

➜  ~ ssh ec2-user@54.99.9.99
警告:将“54.99.9.99”(ED25519)永久添加到已知主机列表中。
最后登录时间:2024 年 2 月 26 日星期一 08:52:42 来自 1.1.1.1

    ┌───┬──┐   __|  __|_  )
    │ ╷╭╯╷ │   _|  (     /
    │  └╮  │  ___|\___|___|
    │ ╰─┼╯ │  Amazon EC2
    └───┴──┘  macOS Sonoma 14.3.1

➜  ~ uname -a
Darwin Mac-mini.local 23.3.0 Darwin Kernel Version 23.3.0: Wed Dec 20 21:30:27 PST 2023; root:xnu-10002.81.5~7/RELEASE_ARM64_T8103 arm64

➜ ~ csrutil --status 
系统完整性保护状态:已禁用。

何时禁用 SIP

禁用 SIP 时应谨慎行事,因为这会使系统面临潜在的安全风险。不过,正如我在本文引言中提到的,在为 macOS 开发设备驱动程序或内核扩展时,您可能需要禁用 SIP。启用 SIP 后,一些旧版应用程序也可能无法正常运行。

关闭 Spotlight 索引也需要禁用 SIP。Spotlight 可以帮助您在 Mac 上快速查找应用程序、文档、电子邮件和其他项目。这在台式机上非常方便,但在服务器上就不那么方便了。如果不需要在文档更改时对其进行索引,则关闭 Spotlight 将释放一些 CPU 周期和磁盘 I/O

注意事项

关于在 Amazon EC2 Mac 中禁用 SIP 的补充说明:

  • 可通过 API、AWS SDKAWS CLIAWS 管理控制台禁用 SIP。
  • 对于 Apple 硅芯片机型,该设置基于卷。因此,如果您更换根卷,则需要再次禁用 SIP。对于 Intel 机型,该设置基于 Mac 主机,如果您更换根卷,SIP 仍将保持禁用状态。
  • 禁用 SIP 后,如果您停止并启动实例,其将再次启用。重启实例不会更改 SIP 状态。
  • SIP 状态无法在 EBS 卷之间转移。这意味着,在您从 EBS 快照恢复实例或从启用了 SIP 的实例创建 AMI 后,SIP 将再次被禁用。

所有提供 Amazon EC2 Mac 的区域均可使用这些新 API,无需额外付费。立即试用。

— seb


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您了解行业前沿技术和发展海外业务选择推介该服务。