View a markdown version of this page

迁移 Amazon IoT Greengrass V2 将核心设备移至非 root - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

迁移 Amazon IoT Greengrass V2 将核心设备移至非 root

重要

本主题介绍推荐的迁移方法。您可能需要根据设备配置、操作系统和已安装的软件调整这些步骤。

默认情况下, Amazon IoT Greengrass 在 Linux 设备上以 root 用户身份运行。您可以将 Amazon IoT Greengrass 核心设备迁移到仅具有 Amazon IoT Greengrass 所需的 Linux 功能的非 root 用户身份运行,从而改善设备的安全状况。您可以迁移单个设备或在整个队列中扩展迁移。

注意事项

在迁移到非 root 用户之前,请考虑以下几点:

  • 此迁移过程适用于在带有 systemd 的 Linux 上运行 n Amazon IoT Greengrass ucleus (Java-based) 的 Amazon IoT Greengrass 核心设备。它不适用于运行 n Amazon IoT Greengrass ucleus lite 的设备。

  • 在迁移生产队列之前,在开发环境中的单个设备上测试迁移。

迁移单个设备

此迁移过程遵循中描述的方法解决方案 3:设置 Amazon IoT Greengrass V2 作为非 root 用户且组件用户分离。在开始之前,请完成该主题中的先决条件,包括允许非 root 用户作为单独用户运行组件的 sudoers 配置。

在迁移队列之前,使用此程序迁移单个设备。

第 1 步:创建非 root 用户和群组

连接到您的设备并创建 Amazon IoT Greengrass 运行身份的系统用户和群组。将user-namegroup-name替换为要使用的名称。

sudo groupadd --system group-name sudo useradd --system --create-home --shell /sbin/nologin -g group-name user-name

第 2 步:备份文件所有权

停止 Amazon IoT Greengrass 并保存当前文件所有权结构,以便在需要回滚时可以将其恢复。

sudo systemctl stop greengrass.service sudo mkdir -p /opt/greengrass-backup sudo find /greengrass/v2 -exec stat -c 'chown %U:%G "%n"' {} \; | sudo tee /opt/greengrass-backup/restore_ownership.sh > /dev/null sudo chmod 700 /opt/greengrass-backup/restore_ownership.sh
注意

本主题中的命令用/greengrass/v2作 Amazon IoT Greengrass 根路径。如果您安装 Amazon IoT Greengrass 到其他位置,请/greengrass/v2替换为实际的 Amazon IoT Greengrass 根路径。

第 3 步:更改文件所有权

将 Amazon IoT Greengrass 目录的所有权转让给非 root 用户。

sudo chown -R user-name:group-name /greengrass/v2

第 4 步:创建 systemd 嵌入式替代方案

创建一个插入式目录和配置文件,指示 systemd 以具有所需的 Linu Amazon IoT Greengrass x 功能的非 root 用户身份运行。

sudo mkdir -p /etc/systemd/system/greengrass.service.d

迁移使用了位于 systemd 的嵌入式替代文件。/etc/systemd/system/greengrass.service.d/10-nonroot.conf嵌入式替代替换基本服务文件中的设置,无需直接对其进行修改。此替代将 systemd 配置为以非 root 用户身份运行该 Amazon IoT Greengrass 服务,并具有有限的 Linux 功能。删除插入目录会导致 systemd 恢复到基本greengrass.service文件,该文件以根用户身份运行,使用原始配置。

创建包含以下内容的文件 /etc/systemd/system/greengrass.service.d/10-nonroot.conf

[Service] User=user-name AmbientCapabilities=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE ProtectSystem=strict ReadWritePaths=/greengrass/v2 /tmp

有关这些 systemd 指令和所需功能的信息,请参见解决方案 3:设置 Amazon IoT Greengrass V2 作为非 root 用户且组件用户分离

第 5 步:重新加载 systemd 并启动 Amazon IoT Greengrass

运行以下命令以重新加载 systemd 守护程序并启动。 Amazon IoT Greengrass

sudo systemctl daemon-reload sudo systemctl start greengrass.service

步骤 6:验证迁移

确认 Amazon IoT Greengrass 以非 root 用户身份运行。

sudo systemctl status greengrass.service ps -ef | grep greengrass

输出将非 root 用户显示为进程所有者,而不是。root

接下来,确认所有已部署的组件都在运行。必须在设备上部署该aws.greengrass.Cli组件才能运行此命令。

sudo /greengrass/v2/bin/greengrass-cli component list

每个组件应报告RUNNINGState的值FINISHEDFINISHED是的预期终端状态aws.greengrass.Nucleus。在考虑迁移完成之前,请调查ERRORED处于BROKEN或状态的任何组件。

回滚单个设备

如果您需要恢复 Amazon IoT Greengrass 为以 root 用户身份运行,请移除嵌入式替代、恢复文件所有权并重新启动 Amazon IoT Greengrass。

sudo systemctl stop greengrass.service sudo rm -rf /etc/systemd/system/greengrass.service.d sudo bash /opt/greengrass-backup/restore_ownership.sh sudo systemctl daemon-reload sudo systemctl start greengrass.service

步骤 6:验证迁移再次运行验证命令以确认 Amazon IoT Greengrass 是否以 root 身份运行。该过程应显示root为所有者。

确认回滚成功后,您可以选择清理迁移工件:

  • 备份目录 -/opt/greengrass-backup 如果您计划稍后重试迁移或将其删除,则可以保留:

    sudo rm -r /opt/greengrass-backup
  • Non-root 用户和群组 — 如果您不再计划以非 root 用户 Amazon IoT Greengrass 身份运行,则可以删除您在步骤 1 中创建的用户和群组:

    sudo userdel user-name sudo groupdel group-name

    如果其他服务或组件使用此用户,请勿删除该用户。

迁移一大批设备

在单个设备上验证迁移后,可以在整个队列中扩展迁移。选择以下方法之一:

使用自定义 Amazon IoT Greengrass 引导组件

您可以创建自定义 Amazon IoT Greengrass 组件,在整个队列中自动执行单设备迁移步骤。这种方法是独立的,仅使用 Amazon IoT Greengrass 部署。它不需要诸如系统管理器之类的外部工具。

该组件使用RequiresPrivilege设置为的 Bootstrap 生命周期true,该生命周期在部署期间以 root 身份运行组件。引导脚本执行与单设备过程相同的特权操作:

  • 如果非 root 用户和群组尚不存在,请创建他们。

  • 备份文件所有权结构以进行回滚。

  • 将 Amazon IoT Greengrass 根目录的所有权更改为非 root 用户。

  • 创建 systemd 嵌入式覆盖文件。

  • 重新加载 systemd 守护程序。

  • 使用代码 101 退出以重启设备。

重要

该组件必须以代码 101 而不是 100 退出。退出代码 100 仅重新启动 Amazon IoT Greengrass JVM 进程,该进程使用已缓存在内存中的 systemd 服务配置。完全重启会迫使 systemd 从磁盘读取新的嵌入式替代项,并以非 root Amazon IoT Greengrass 用户身份启动。重启会暂时中断设备上的所有服务。

将组件设为等导数,这样即使您已经迁移了设备,重新部署也不会失败。

迁移部署完成后,验证您的设备是否以非 root 用户身份运行。有关更多信息,请参阅 步骤 6:验证迁移。您可以部署验证组件来检查正在运行的用户并报告结果,或者在 Amazon IoT Greengrass 控制台中监控部署状态。

设置回滚机制

要在队列中远程恢复根配置,您的迁移组件必须设置回滚机制。一种方法是使用 systemd 监视触发器文件。这种方法需要以下 systemd 资源:

  • 一个回滚脚本,用于删除嵌入式替代,从备份中恢复原始文件所有权,重新加载 systemd 守护程序,并以 root 用户身份重新启动。 Amazon IoT Greengrass

  • 一个以 ro ot 身份运行回滚脚本的 systemd 单发服务。oneshot 服务运行单个任务然后退出,而不是作为长期守护程序运行。

  • 监视特定文件路径的 systemd 路径单元,例如/greengrass/v2/rollback/.rollback-trigger。当文件出现时,路径单元会自动启动 oneshot 回滚服务。

有了这个机制,你可以通过部署一个创建触发器文件的简单 Amazon IoT Greengrass 组件来回滚设备。systemd 路径单元检测文件,以 root 用户身份运行回滚服务,并恢复 Amazon IoT Greengrass 到其原始根配置。

使用 Amazon Systems Manager

如果您使用 Systems Manager 来管理您的设备,则可以创建一个 SSM 文档来自动执行单设备迁移步骤。由于 SSM 独立运行 Amazon IoT Greengrass,因此它可以在不重新启动设备的情况下直接停止和重启 Amazon IoT Greengrass 服务。

您的 SSM 文档必须满足以下要求:

  • 停止 Amazon IoT Greengrass 并备份当前的服务配置和文件所有权结构。

  • 创建非 root 用户和群组。

  • 将该 Amazon IoT Greengrass 目录的所有权更改为非 root 用户。

  • 创建 systemd 嵌入式覆盖文件。

  • 重新加载 systemd 守护程序并启动。 Amazon IoT Greengrass

  • 验证是否以非 root 用户身份成功 Amazon IoT Greengrass 启动。

要在队列中运行迁移,请使用 Systems Manager 运行命令使用标签或资源组对设备执行 SSM 文档。您可以在 Systems Manager 控制台中监控命令执行状态,该控制台显示每台目标设备的结果,包括所有错误。

要回滚,请创建单独的 SSM 文档,该文档会停止 Amazon IoT Greengrass、删除嵌入式替代、恢复原始文件所有权、重新加载 systemd 守护程序并以 root 用户身份重新启动。 Amazon IoT Greengrass 针对需要回滚的设备运行此文档。

有关在托管节点上运行命令的更多信息,请参阅使用 Systems Manager 运行命令运行命令