View a markdown version of this page

设置 AWS IoT Greengrass V2 核心设备作为非 root - AWS IoT Greengrass

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

设置 AWS IoT Greengrass V2 核心设备作为非 root

本页介绍了以非 root 用户身份运行 AWS IoT Greengrass 核心软件的四种解决方案。查看比较表,了解每种解决方案的特点和权衡取舍,然后使用决策流程图来确定哪种解决方案符合您的要求。

注意

本页上的非 root 解决方案仅适用于 Linux 设备上的 AWS IoT Greengrass nucleus。不包括 Windows,因为 AWS IoT Greengrass V2 必须作为系统服务在 Windows 上运行。有关在 Linux 上安装标准根目录的信息,请参阅安装具有自动资源配置功能的 AWS IoT Greengrass Core 软件

要以非 root 用户身份运行 n AWS IoT Greengrass ucleus lite,请参阅在 n AWS IoT Greengrass ucleus 精简版存储库中使用 Podman。 GitHub

选择非根解决方案

使用下表比较非 root 解决方案并了解它们的权衡取舍。根据您的安全要求和设备限制,每种解决方案都提供不同的功能。

Non-root 解决方案
解决方案 需要根访问权限 可以以不同的用户身份运行组件 将 Greengrass 作为系统服务运行 适用于

解决方案 1:没有 root 访问权限

否(用户服务可选)

你没有 root 访问权限的设备

解决方案 2: Non-root,单用户

是(仅限安装)

以非 root 用户身份运行 Greengrass,所有组件都以同一个用户身份运行

解决方案 3: Non-root,多用户

是(仅限安装)

支持

以非 root 用户身份运行 Greengrass,同时以不同的用户身份运行组件

解决方案 4:功能有限的 Root

支持

以 root 用户身份运行 Greengrass,Linux 功能有限

以下流程图将指导您根据设备限制和要求选择合适的解决方案。

流程图显示了选择非根解决方案的决策过程。首先询问您的核心设备上是否有 root 用户访问权限。如果不是,请使用解决方案 1。如果是,请询问您是否需要以不同的 Linux 用户身份运行组件。如果不是,请使用解决方案 2。如果是,请询问您是否希望 Greengrass 以权限有限的 root 用户身份运行。如果是,请使用解决方案 4。如果不是,请使用解决方案 3。

解决方案 1:设置 AWS IoT Greengrass V2 没有 root 访问权限

如果您在设备上没有 root 访问权限,请使用此解决方案。在此配置中, AWS IoT Greengrass Core 软件完全以非 root 用户身份运行,无需提升权限。

权衡

此解决方案有以下限制:

  • 没有组件用户分离 — 所有组件都以运行 C AWS IoT Greengrass ore 软件的同一个用户身份运行。您不能使用该posixUser配置以不同的用户身份运行组件。

  • RequiresPrivilege 已@@ 忽略 — AWS IoT Greengrass Core 软件会忽略组件配方中的RequiresPrivilege选项。组件无法请求提升权限。

  • 没有系统服务-您不能将 AWS IoT Greengrass Core 软件作为系统服务进行安装。您可以选择配置为 AWS IoT Greengrass V2 作为 systemd 用户服务运行。

先决条件

此解决方案需要:

  • 设备上的非 root 用户账户

  • 写入要安装 C AWS IoT Greengrass ore 软件的目录的访问权限

要安装并运行 AWS IoT Greengrass V2 没有 root 访问权限
  1. 完成以下步骤安装具有自动资源配置功能的 AWS IoT Greengrass Core 软件:设置您的设备环境、提供凭据并下载 AWS IoT Greengrass 核心软件。

  2. 创建安装目录并确保您的用户拥有该目录。

    mkdir -p $HOME/greengrass/v2
  3. 在没有的情况下运行安装程序sudo。设置--component-default-user为您当前的用户。

    java -Droot="$HOME/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-region region \ --thing-name MyGreengrassCore \ --thing-group-name MyGreengrassCoreGroup \ --thing-policy-name GreengrassV2IoTThingPolicy \ --tes-role-name GreengrassV2TokenExchangeRole \ --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \ --component-default-user $USER \ --provision true

    请勿使用,--setup-system-service true因为您没有 root 权限来创建系统服务。

(可选)设置 systemd 用户服务

您可以配置 systemd 用户服务来管理 AWS IoT Greengrass 核心软件。这允许软件在您登录时自动启动。

设置 systemd 用户服务
  1. 如果 AWS IoT Greengrass Core 软件当前正在运行,请将其停止。

    kill $(cat $HOME/greengrass/v2/alts/loader.pid)
  2. 创建 systemd 用户服务目录。

    mkdir -p $HOME/.config/systemd/user
  3. 在创建包含以下内容$HOME/.config/systemd/user/greengrass.service的服务文件。

    [Unit] Description=Greengrass Core [Service] Type=simple PIDFile=%h/greengrass/v2/alts/loader.pid RemainAfterExit=no Restart=on-failure RestartSec=10 ExecStart=/bin/sh %h/greengrass/v2/alts/current/distro/bin/loader Environment="JAVA_HOME=/path/to/java" [Install] WantedBy=default.target

    在 systemd 用户单元文件中,%h是一个解析到运行服务的用户主目录的说明符。

    /path/to/java替换为 Java 安装路径。

  4. 启用并启动该服务。

    systemctl --user daemon-reload systemctl --user enable greengrass.service systemctl --user start greengrass.service
重启和 OTA 更新行为

行为取决于您是否配置了 systemd 用户服务。

使用用户服务
  • 设备重启 — AWS IoT Greengrass Core 软件在用户登录时自动启动。

  • OTA 更新 — OTA 更新成功且软件会自动重启。

没有用户服务
  • 设备重启 — AWS IoT Greengrass Core 软件不会自动重启。您必须手动启动它。

  • OTA 更新 — OTA 更新成功,但之后必须手动启动 AWS IoT Greengrass 核心软件。

系统资源限制

Per-component 使用 cgroup 的资源限制在此解决方案中不起作用,因为非 root 用户无法在中创建 cgroup 目录。/sys/fs/cgroup/如果您部署配置了资源限制的组件,则 AWS IoT Greengrass Core 软件将忽略配置的限制。

您可以使用以下替代方法来管理资源使用情况:

  • Systemd 用户服务限制 — 如果您将 AWS IoT Greengrass 核心软件作为 systemd 用户服务运行,则可以在上向服务文件添加资源限制。$HOME/.config/systemd/user/greengrass.service这些限制适用于整个服务,包括 Greengrass 核心和所有组件。

    MemoryMax=2G CPUQuota=100%
  • Greengrass nucleus JVM 限制 — 你可以通过配置 JVM 选项来限制 Greengrass nucleus 进程内存。有关更多信息,请参阅 配置 AWS IoT Greengrass 核心软件

解决方案 2:设置 AWS IoT Greengrass V2 作为非 root 用户且没有组件用户分离

如果您拥有初始设置的根访问权限,并且希望 AWS IoT Greengrass 核心软件作为非根系统服务运行,但不需要以不同的用户身份运行组件,请使用此解决方案。这与解决方案 1 类似,但该软件作为系统服务运行,在启动时自动启动。

权衡

此解决方案有以下限制:

  • 没有组件用户分离 — 所有组件都以运行 C AWS IoT Greengrass ore 软件的同一个用户身份运行。您不能使用该posixUser配置以不同的用户身份运行组件。

  • RequiresPrivilege 已@@ 忽略 — AWS IoT Greengrass Core 软件会忽略组件配方中的RequiresPrivilege选项。组件无法请求提升权限。

先决条件

此解决方案需要:

  • 初始设置的 root 访问权限

  • 您的设备上有 systemd

要安装并运行 AWS IoT Greengrass V2 作为非 root 用户且没有组件用户分离
  1. 完成以下步骤安装具有自动资源配置功能的 AWS IoT Greengrass Core 软件:设置您的设备环境、提供凭据并下载 AWS IoT Greengrass 核心软件。

  2. 创建一个将运行 C AWS IoT Greengrass ore 软件和所有组件的非 root 用户。

    sudo useradd --create-home gg_non_root
  3. 以非 root 用户身份登录并运行安装程序。设置--component-default-user为同一个用户。请勿使用sudo也不要设置系统服务。

    java -Droot="/home/gg_non_root/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-region region \ --thing-name MyGreengrassCore \ --thing-group-name MyGreengrassCoreGroup \ --thing-policy-name GreengrassV2IoTThingPolicy \ --tes-role-name GreengrassV2TokenExchangeRole \ --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \ --component-default-user gg_non_root \ --provision true \ --setup-system-service false
  4. 以 root 用户身份在创建包含以下内容/etc/systemd/system/greengrass.service的系统服务文件。

    [Unit] Description=Greengrass Core After=network.target [Service] Type=simple User=gg_non_root PIDFile=/home/gg_non_root/greengrass/v2/alts/loader.pid RemainAfterExit=no Restart=on-failure RestartSec=10 ExecStart=/bin/sh -c "exec /home/gg_non_root/greengrass/v2/alts/current/distro/bin/loader >> /home/gg_non_root/greengrass/v2/logs/loader.log 2>&1" KillMode=mixed NoNewPrivileges=true ProtectSystem=strict ReadWritePaths=/home/gg_non_root/greengrass /tmp [Install] WantedBy=multi-user.target
  5. 停止正在运行的 AWS IoT Greengrass Core 实例,然后启用并启动系统服务。

    sudo systemctl daemon-reload sudo systemctl enable greengrass.service sudo systemctl start greengrass.service
重启和 OTA 更新行为

在这个解决方案中:

  • AWS IoT Greengrass Core 软件作为系统服务运行,并在出现故障或设备重启时自动重启。

  • AWS IoT Greengrass Core 软件的 OTA 更新可以正常工作。该服务将以配置的非 root 用户身份自动重启。

系统资源限制

Per-component 在此解决方案中,使用 cgroup 的资源限制不起作用,因为没有 Linux 功能的非 root 用户无法在中创建 cgroup 目录。/sys/fs/cgroup/如果您部署配置了资源限制的组件,则 AWS IoT Greengrass Core 软件将忽略配置的限制。

您可以使用以下替代方法来管理资源使用情况:

  • Systemd 服务限制 — 您可以在以下位置向系统服务文件添加资源限制。/etc/systemd/system/greengrass.service这些限制适用于整个服务,包括 Greengrass 核心和所有组件。

    MemoryMax=2G CPUQuota=100%
  • Greengrass nucleus JVM 限制 — 你可以通过配置 JVM 选项来限制 Greengrass nucleus 进程内存。有关更多信息,请参阅 配置 AWS IoT Greengrass 核心软件

解决方案 3:设置 AWS IoT Greengrass V2 作为非 root 用户且组件用户分离

如果您拥有初始设置的 root 访问权限,但希望 AWS IoT Greengrass 核心软件以非 root 用户身份运行,同时保持以不同用户身份运行组件的能力,请使用此解决方案。此配置使用 Linux 功能和 sudoers 来允许非 root 用户在运行组件时切换到其他用户。

权衡

此解决方案有以下限制:

  • 需要 sudoers 配置 — 您必须配置 sudoers 以允许 AWS IoT Greengrass V2 用户像其他用户一样运行命令。

先决条件

此解决方案需要:

  • 初始设置的 root 访问权限

  • systemd 版本 229 或更高版本,它支持。AmbientCapabilities要检查版本,请运行 systemctl --version

要安装并运行 AWS IoT Greengrass V2 作为非 root 用户且组件用户分离
  1. 完成以下步骤安装具有自动资源配置功能的 AWS IoT Greengrass Core 软件:设置您的设备环境、提供凭据并下载 AWS IoT Greengrass 核心软件。

  2. 创建一个将运行 C AWS IoT Greengrass ore 软件的非 root 用户。

    sudo useradd --create-home gg_non_root
  3. 将非 root 用户添加到 sudoers 中,这样它就可以以组件用户的身份运行命令。在创建文件/etc/sudoers.d/gg_non_root

    gg_non_root ALL=(ggc_user:ggc_group) NOPASSWD: SETENV: /bin/sh, /bin/bash

    如果您将组件配置为以其他用户身份运行posixUser,请为每个用户添加一个 sudoers 条目。例如:

    gg_non_root ALL=(ggc_user:ggc_group) NOPASSWD: SETENV: /bin/sh, /bin/bash gg_non_root ALL=(another_user:another_group) NOPASSWD: SETENV: /bin/sh, /bin/bash
  4. 以非 root 用户身份登录并运行安装程序。请勿使用sudo也不要设置系统服务。

    java -Droot="/home/gg_non_root/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-region region \ --thing-name MyGreengrassCore \ --thing-group-name MyGreengrassCoreGroup \ --thing-policy-name GreengrassV2IoTThingPolicy \ --tes-role-name GreengrassV2TokenExchangeRole \ --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \ --component-default-user ggc_user:ggc_group \ --provision true \ --setup-system-service false
  5. 以 root 用户身份在创建包含以下内容/etc/systemd/system/greengrass.service的系统服务文件。

    [Unit] Description=Greengrass Core After=network.target [Service] Type=simple User=gg_non_root PIDFile=/home/gg_non_root/greengrass/v2/alts/loader.pid RemainAfterExit=no Restart=on-failure RestartSec=10 ExecStart=/bin/sh -c "exec /home/gg_non_root/greengrass/v2/alts/current/distro/bin/loader >> /home/gg_non_root/greengrass/v2/logs/loader.log 2>&1" KillMode=mixed AmbientCapabilities=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE CAP_SYS_BOOT CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE CAP_SYS_BOOT ProtectSystem=strict ReadWritePaths=/home/gg_non_root/greengrass /tmp [Install] WantedBy=multi-user.target

    有关所需功能的信息,请参阅所需的 Linux 功能 AWS IoT Greengrass V2

    • AmbientCapabilities向运行该服务的非 root 用户授予指定的 Linux 功能。这允许 AWS IoT Greengrass 核心软件执行特权操作,例如在运行组件时切换用户,而无需以 root 身份运行。

    • CapabilityBoundingSet限制了服务及其子进程可以使用的最大功能集。此套装中没有的能力将被永久丢弃。

    • ProtectSystem=strict使整个文件系统成为服务的只读状态,从而防止修改操作系统。

    • ReadWritePaths指定服务可以写入的唯一目录。

  6. 停止正在运行的 AWS IoT Greengrass Core 实例,然后启用并启动系统服务。

    sudo systemctl daemon-reload sudo systemctl enable greengrass.service sudo systemctl start greengrass.service
重启和 OTA 更新行为

在这个解决方案中:

  • AWS IoT Greengrass Core 软件作为系统服务运行,并在出现故障或设备重启时自动重启。

  • AWS IoT Greengrass Core 软件的 OTA 更新可以正常工作。该服务将以配置的非 root 用户身份自动重启。

系统资源限制

Per-component 在此解决方案中,内存和 CPU 的资源限制与以 root 用户身份运行 AWS IoT Greengrass Core 软件时的方式相同。

解决方案 4:设置 AWS IoT Greengrass V2 作为 root,能力有限

如果您想让 AWS IoT Greengrass Core 软件以 root 用户身份运行,但只有 Linux 功能较少,请使用此解决方案。此配置提供了以 root 用户身份运行的全部功能,同时通过限制软件及其组件的可用功能来限制攻击面。

权衡

此解决方案有以下注意事项:

  • RequiresPrivilege 具有有限功能的组件 — 使用的组件使用与 C AWS IoT Greengrass ore 软件相同的有限功能集RequiresPrivilege运行,而不是完全的 root 权限。

先决条件

此解决方案需要:

  • 根访问权限

  • 您的设备上有 systemd

要安装并运行 AWS IoT Greengrass V2 作为 root,能力有限
  1. 完成以下步骤安装具有自动资源配置功能的 AWS IoT Greengrass Core 软件:设置您的设备环境、提供凭据并下载 AWS IoT Greengrass 核心软件。

  2. 修改下载 AWS IoT Greengrass 核心软件的目录中的服务模板文件。GreengrassInstaller/bin/greengrass.service.template在运行安装程序之前,请将以下几行添加到该[Service]部分:

    CapabilityBoundingSet=CAP_CHOWN CAP_DAC_OVERRIDE CAP_DAC_READ_SEARCH CAP_FOWNER CAP_SETUID CAP_SETGID CAP_SYS_RESOURCE CAP_AUDIT_WRITE CAP_SYS_BOOT ProtectSystem=strict ReadWritePaths=/greengrass /tmp
    • CapabilityBoundingSet是一项 systemd 安全功能,它限制了 AWS IoT Greengrass Core 软件及其所有子进程可用的 Linux 功能。通过配置边界集,您可以限制 Greengrass nucleus 进程和组件可以做什么,即使以 root 身份运行也是如此。有关每项功能的信息,请参见所需的 Linux 功能 AWS IoT Greengrass V2

    • ProtectSystem=strict使整个文件系统成为服务的只读状态,从而防止修改操作系统。这提供了 systemd 沙箱,即使恶意组件以提升的权限运行,也可以保护系统文件。

    • ReadWritePaths指定服务可以写入的唯一目录。同时ProtectSystem=strict,这限制了服务只能写入 AWS IoT Greengrass V2 根目录和/tmp

  3. 使用运行安装程序--setup-system-service true

    sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-region region \ --thing-name MyGreengrassCore \ --thing-group-name MyGreengrassCoreGroup \ --thing-policy-name GreengrassV2IoTThingPolicy \ --tes-role-name GreengrassV2TokenExchangeRole \ --tes-role-alias-name GreengrassCoreTokenExchangeRoleAlias \ --component-default-user ggc_user:ggc_group \ --provision true \ --setup-system-service true
重启和 OTA 更新行为

在这个解决方案中:

  • AWS IoT Greengrass Core 软件作为系统服务运行,并在出现故障或设备重启时自动重启。

  • AWS IoT Greengrass Core 软件的 OTA 更新可以正常工作。软件会自动更新和重启。

系统资源限制

Per-component 在此解决方案中,内存和 CPU 的资源限制与以 root 用户身份运行 AWS IoT Greengrass Core 软件时的方式相同。

所需的 Linux 功能 AWS IoT Greengrass V2

下表描述了 AWS IoT Greengrass 核心软件在非 root 配置下运行时所需的 Linux 功能。解决方案 3 和 4 中使用了这些功能。

所需的 Linux 功能
能力 说明 必填项

CAP_CHOWN

对文件 UID 和 GID 进行任意更改

根据执行组件的用户更改文件所有权

CAP_DAC_OVERRIDE

绕过文件读取、写入和执行权限检查

允许 Greengrass nucleus 用户在使用以下脚本时执行文件 RequiresPrivilege

CAP_DAC_READ_SEARCH

绕过文件读取权限检查和目录读取并执行权限检查

即使是文件夹,Greengrass nucleus 用户也没有读取权限,也可以在文件夹层次结构中移动

CAP_FOWNER

绕过对通常要求进程的文件系统 UID 与文件的 UID 匹配的操作的权限检查

绕过文件所有权检查

CAP_SETUID

对进程 UID 进行任意操作

sudo在以与运行 Greengrass 核心的用户不同的用户身份执行脚本时使用

CAP_SETGID

对进程 GID 进行任意操作

sudo在以与运行 Greengrass 核心的组不同的组执行脚本时使用

CAP_SYS_RESOURCE

忽略资源限制

即使在部署中未指定资源限制,也要为组件进程设置资源限制

CAP_AUDIT_WRITE

将记录写入内核审计日志

sudo允许写入内核审核日志

CAP_SYS_BOOT

使用 reboot(2)kexec_load(2)

允许 AWS IoT Greengrass Core 软件在组件管理系统重启时重启设备