在 Amazon EC2 Mac 实例上配置系统完整性保护 (SIP)

作者: Sébastien Stormacq |

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

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

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

在 Mac 上禁用 SIP 需要对计算机进行物理访问。你必须在恢复模式下重新启动计算机,然后使用 csrutil 命令行工具禁用 SIP,然后再次重新启动计算机。

直到今天,您还必须在 EC2 Mac 实例上使用标准 SIP 设置进行操作。物理访问要求和在恢复模式下启动的需求使得将 SIP 与 Amazon EC2 控制平面和 EC2 API 集成起来变得困难。但现在情况已不再如此!现在,您可以在 Amazon EC2 Mac 实例上随意禁用和重新启用 SIP。让我来告诉你怎么做。

让我们看看它是如何工作的
想象一下我启动了一个 Amazon EC2 Mac 实例。这是一个在苹果硅 M2 处理器上运行的 mac2-m2.metal 实例。禁用或启用 SIP 就像调用新的 EC2 API 一样简单:CreateMacSystemIntegrityProtectionModificationTask。此 API 是异步的;它启动更改实例上的 SIP 状态的过程。您可以使用另一个新的 EC2 API 监控进度:DescribeMacModificationTasks。我只需要知道我想要使用的计算机的实例 ID。

先决条件
在基于苹果芯片的 EC2 Mac 实例和更新的计算机上,在调用新的 EC2 API 之前,我必须设置 ec2-user 用户密码并在 macOS 上为该用户启用安全令牌。这需要连接到机器并在终端中键入两个命令。

# on the target EC2 Mac instance
# Set a password for the ec2-user user
~ % sudo /usr/bin/dscl . -passwd /Users/ec2-user
New Password: (MyNewPassw0rd)

# Enable secure token, with the same password, for the ec2-user
# old password is the one you just set with dscl
~ % sysadminctl -newPassword MyNewPassw0rd -oldPassword MyNewPassw0rd
2025-03-05 13:16:57.261 sysadminctl[3993:3033024] Attempting to change password for ec2-user…
2025-03-05 13:16:58.690 sysadminctl[3993:3033024] SecKeychainCopyLogin returned -25294
2025-03-05 13:16:58.690 sysadminctl[3993:3033024] Failed to update keychain password (-25294)
2025-03-05 13:16:58.690 sysadminctl[3993:3033024] - Done

# The error about the KeyChain is expected. I never connected with the GUI on this machine, so the Login keychain does not exist
# you can ignore this error.  The command below shows the list of keychains active in this session
~ % 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] Secure token is ENABLED for user ec2-user

更改 SIP 状态
我不需要连接到计算机即可切换 SIP 状态。我只需要知道它的实例 ID。我在笔记本电脑上打开一个终端并使用亚马逊云科技命令行接口 (亚马逊云科技 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 Instance Connect 连接到计算机。

➜  ~ ssh ec2-user@54.99.9.99
Warning: Permanently added '54.99.9.99' (ED25519) to the list of known hosts.
Last login: Mon Feb 26 08:52:42 2024 from 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 
System Integrity Protection status: disabled.

何时禁用 SIP
禁用 SIP 时应谨慎行事,因为这会使系统面临潜在的安全风险。但是,正如我在这篇文章的介绍中提到的那样,在为 macOS 开发设备驱动程序或内核扩展时,你可能需要禁用 SIP。启用 SIP 后,一些较旧的应用程序也可能无法正常运行。

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

需要知道的事情关于在 Amazon EC2 Mac 上禁用 SIP,
还有其他几点需要了解:

  • 可通过 API 和亚马逊云科技开发工具包、亚马逊云科技 CLI 和亚马逊云科技管理控制台禁用 SIP。
  • 在 Apple 芯片上,该设置是基于卷的。因此,如果您更换根卷,则需要再次禁用 SIP。在英特尔上,该设置基于 Mac 主机,因此如果您更换根卷,SIP 仍将被禁用。
  • 禁用 SIP 后,如果您停止并启动实例,它将再次启用。重启实例不会更改其 SIP 状态。
  • SIP 状态无法在 EBS 卷之间传输。这意味着,在您从 EBS 快照还原实例或从启用了 SIP 的实例创建 AMI 后,SIP 将再次被禁用。

这些新的 API 可在提供 Amazon EC2 Mac 的所有地区使用,无需额外付费。今天就试试吧。

— seb

新闻博客怎么样?参加这个 1 分钟的调查!

(本调查由外部公司主办。亚马逊云科技按照亚马逊云科技隐私声明中的描述处理您的信息。亚马逊云科技将拥有通过本次调查收集的数据,不会与调查受访者共享收集的信息。)



塞巴斯蒂安·斯托尔马克

Sébastien Stormacq

自从八十年代中期第一次接触 Commodore 64 以来,他一直在编写代码。他利用自己的激情、热情、客户倡导、好奇心和创造力的秘密融合,激励建设者发挥亚马逊云科技云的价值。他的兴趣是软件架构、开发者工具和移动计算。如果你想卖给他东西,一定要确保它有 API。在推特上关注他 @sebsto。


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