View a markdown version of this page

將 AWS IoT Greengrass V2 核心裝置設定為非根裝置 - AWS IoT Greengrass

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將 AWS IoT Greengrass V2 核心裝置設定為非根裝置

此頁面提供四種以非根目錄形式執行 AWS IoT Greengrass 核心軟體的解決方案。檢閱比較表以了解每個解決方案的功能和權衡,然後使用決策流程圖來識別哪個符合您的需求。

注意

本頁面上的非根解決方案僅適用於 Linux 裝置上的 AWS IoT Greengrass 核。不包含 Windows,因為 AWS IoT Greengrass V2 必須以系統服務的形式在 Windows 上執行。如需 Linux 上的標準根安裝,請參閱 使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體

若要以非根使用者身分執行 AWS IoT Greengrass nucleus lite,請參閱 nucleus lite GitHub 儲存庫中的使用 Podman。 AWS IoT Greengrass

選擇非根解決方案

使用下表來比較非根解決方案並了解其權衡。每個解決方案都根據您的安全需求和裝置限制提供不同的功能。

非根解決方案
解決方案 需要根存取 可以不同的使用者身分執行元件 將 Greengrass 執行為系統服務 最適合

解決方案 1:無根存取

否 (使用者服務選用)

您沒有根存取權的裝置

解決方案 2:非根、單一使用者

是 (僅限設定)

以非根使用者身分執行 Greengrass,並將所有元件以相同使用者身分執行

解決方案 3:非根、多使用者

是 (僅限設定)

以非根使用者身分執行 Greengrass,同時以不同使用者身分執行元件

解決方案 4:功能有限的根目錄

以一組有限的 Linux 功能執行 Greengrass 做為根目錄

下列流程圖會引導您根據裝置限制條件和需求選擇適當的解決方案。

流程圖顯示選擇非根解決方案的決策程序。首先,詢問您是否擁有核心裝置上的根存取權。如果否,請使用解決方案 1。如果是,詢問是否需要以不同的 Linux 使用者身分執行元件。如果否,請使用解決方案 2。如果是,詢問您是否希望 Greengrass 以功能有限的根使用者身分執行。如果是,請使用解決方案 4。如果否,請使用解決方案 3。

解決方案 1:在沒有根存取權 AWS IoT Greengrass V2 的情況下設定

當您在裝置上沒有根存取權時,請使用此解決方案。在此組態中, AWS IoT Greengrass Core 軟體完全以非根使用者身分執行,沒有更高的權限。

取捨

此解決方案有下列限制:

  • 無元件使用者區隔 – 所有元件都以執行 AWS IoT Greengrass Core 軟體的相同使用者身分執行。您無法使用posixUser組態以不同的使用者身分執行元件。

  • 忽略 RequiresPrivilege – Core AWS IoT Greengrass 軟體會忽略元件配方中的 RequiresPrivilege選項。元件無法請求提升的權限。

  • 無系統服務 – 您無法將 AWS IoT Greengrass Core 軟體安裝為系統服務。您可以選擇 AWS IoT Greengrass V2 將 設定為以系統化使用者服務執行。

先決條件

此解決方案需要:

  • 裝置上的非根使用者帳戶

  • 寫入您要安裝 AWS IoT Greengrass Core 軟體的目錄

在沒有根存取權 AWS IoT Greengrass V2 的情況下安裝和執行
  1. 從 完成下列步驟使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體:設定您的裝置環境、提供登入資料,以及下載 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因為您沒有建立系統服務的根存取權。

(選用) 設定系統化使用者服務

您可以設定系統化使用者服務來管理 AWS IoT Greengrass Core 軟體。這可讓軟體在您登入時自動啟動。

設定系統化使用者服務
  1. 如果 AWS IoT Greengrass 核心軟體目前正在執行,請停止它。

    kill $(cat $HOME/greengrass/v2/alts/loader.pid)
  2. 建立系統化使用者服務目錄。

    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

    在系統化使用者單位檔案中, %h 是一種指標,可解析為執行服務之使用者的主目錄。

    /path/to/java 取代為 Java 安裝的路徑。

  4. 啟用並啟動服務。

    systemctl --user daemon-reload systemctl --user enable greengrass.service systemctl --user start greengrass.service
重新啟動和 OTA 更新行為

此行為取決於您是否設定了系統化使用者服務。

使用使用者服務
  • 裝置重新啟動 – AWS IoT Greengrass 核心軟體會在使用者登入時自動啟動。

  • OTA 更新 – OTA 更新成功,軟體會自動重新啟動。

沒有使用者服務
  • 裝置重新啟動 – AWS IoT Greengrass Core 軟體不會自動重新啟動。您必須手動啟動它。

  • OTA 更新 – OTA 更新成功,但之後您必須手動啟動 AWS IoT Greengrass Core 軟體。

系統資源限制

使用 cgroups 的每個元件資源限制無法在此解決方案中運作,因為非根使用者無法在 中建立 cgroup 目錄/sys/fs/cgroup/。如果您部署已設定資源限制的元件,則 AWS IoT Greengrass Core 軟體會忽略設定的限制。

您可以使用下列替代方案來管理資源用量:

  • 系統化使用者服務限制 – 如果您以系統化使用者服務身分執行 AWS IoT Greengrass Core 軟體,您可以在 將資源限制新增至服務檔案$HOME/.config/systemd/user/greengrass.service。這些限制適用於整個服務,包括 Greengrass 核和所有元件。

    MemoryMax=2G CPUQuota=100%
  • Greengrass 核 JVM 限制 – 您可以設定 JVM 選項來限制 Greengrass 核程序記憶體。如需詳細資訊,請參閱設定 AWS IoT Greengrass 核心軟體

解決方案 2:將 AWS IoT Greengrass V2 設定為無元件使用者分隔的非根目錄

當您具有初始設定的根存取權,並希望 AWS IoT Greengrass Core 軟體以非根系統服務的形式執行,但您不需要以不同的使用者身分執行元件時,請使用此解決方案。這類似於解決方案 1,但軟體會以系統服務的形式執行,在開機時自動啟動。

取捨

此解決方案有下列限制:

  • 無元件使用者區隔 – 所有元件都以執行 AWS IoT Greengrass Core 軟體的相同使用者身分執行。您無法使用posixUser組態以不同的使用者身分執行元件。

  • 忽略 RequiresPrivilege – Core AWS IoT Greengrass 軟體會忽略元件配方中的 RequiresPrivilege選項。元件無法請求提升的權限。

先決條件

此解決方案需要:

  • 初始設定的根存取權

  • 在您的裝置上系統化

在沒有元件使用者分隔的情況下 AWS IoT Greengrass V2 安裝和執行為非根目錄
  1. 從 完成下列步驟使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體:設定您的裝置環境、提供登入資料,以及下載 AWS IoT Greengrass 核心軟體。

  2. 建立將執行 AWS IoT Greengrass Core 軟體和所有元件的非根使用者。

    sudo useradd --create-home gg_non_root
  3. 以非根使用者身分登入並執行安裝程式。--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. 做為根目錄,使用/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 的核心執行個體,然後啟用並啟動系統服務。

    sudo systemctl daemon-reload sudo systemctl enable greengrass.service sudo systemctl start greengrass.service
重新啟動和 OTA 更新行為

在此解決方案中:

  • Core AWS IoT Greengrass 軟體以系統服務的形式執行,並在故障或裝置重新啟動時自動重新啟動。

  • AWS IoT Greengrass 核心軟體的 OTA 更新正常運作。服務會以設定的非根使用者身分自動重新啟動。

系統資源限制

使用 cgroups 的每個元件資源限制無法在此解決方案中運作,因為沒有 Linux 功能的非根使用者無法在 中建立 cgroup 目錄/sys/fs/cgroup/。如果您部署已設定資源限制的元件,則 AWS IoT Greengrass Core 軟體會忽略設定的限制。

您可以使用下列替代方案來管理資源用量:

  • 系統化服務限制 – 您可以在 將資源限制新增至系統服務檔案/etc/systemd/system/greengrass.service。這些限制適用於整個服務,包括 Greengrass 核和所有元件。

    MemoryMax=2G CPUQuota=100%
  • Greengrass 核 JVM 限制 – 您可以設定 JVM 選項來限制 Greengrass 核程序記憶體。如需詳細資訊,請參閱設定 AWS IoT Greengrass 核心軟體

解決方案 3:使用元件使用者分隔 AWS IoT Greengrass V2 將 設定為非根目錄

當您擁有初始設定的根存取權,但希望 AWS IoT Greengrass Core 軟體以非根使用者身分執行,同時維持以不同使用者身分執行元件的能力時,請使用此解決方案。此組態使用 Linux 功能和 sudoers,允許非根使用者在執行元件時切換到其他使用者。

取捨

此解決方案有下列限制:

  • 需要sudoers組態 – 您必須設定sudoers以允許使用者以其他使用者身分 AWS IoT Greengrass V2 執行命令。

先決條件

此解決方案需要:

  • 初始設定的根存取權

  • systemd 229 版或更新版本,支援 AmbientCapabilities。若要檢查您的版本,請執行 systemctl --version

以元件使用者分離 AWS IoT Greengrass V2 的非根安裝和執行
  1. 從 完成下列步驟使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體:設定您的裝置環境、提供登入資料,以及下載 AWS IoT Greengrass 核心軟體。

  2. 建立將執行 AWS IoT Greengrass Core 軟體的非根使用者。

    sudo useradd --create-home gg_non_root
  3. 將非根使用者新增至 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. 以非根使用者身分登入並執行安裝程式。請勿使用 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. 做為根目錄,使用/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 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=/home/gg_non_root/greengrass /tmp [Install] WantedBy=multi-user.target

    如需所需功能的資訊,請參閱 所需的 Linux 功能 AWS IoT Greengrass V2

    • AmbientCapabilities 會將指定的 Linux 功能授予執行服務的非根使用者。這可讓 AWS IoT Greengrass Core 軟體執行特殊權限操作,例如在執行元件時切換使用者,而不以根執行。

    • CapabilityBoundingSet 會限制服務及其子程序可以使用的功能集上限。未在此集中的功能會永久捨棄。

    • ProtectSystem=strict 會讓整個檔案系統為 服務唯讀,防止修改作業系統。

    • ReadWritePaths 指定服務可寫入的唯一目錄。

  6. 停止執行中 AWS IoT Greengrass 的核心執行個體,然後啟用並啟動系統服務。

    sudo systemctl daemon-reload sudo systemctl enable greengrass.service sudo systemctl start greengrass.service
重新啟動和 OTA 更新行為

在此解決方案中:

  • Core AWS IoT Greengrass 軟體以系統服務的形式執行,並在故障或裝置重新啟動時自動重新啟動。

  • AWS IoT Greengrass 核心軟體的 OTA 更新正常運作。服務會以設定的非根使用者身分自動重新啟動。

系統資源限制

記憶體和 CPU 的每個元件資源限制在此解決方案中的運作方式與將 AWS IoT Greengrass Core 軟體作為根執行時相同。

解決方案 4:將 AWS IoT Greengrass V2 設定為功能有限的根目錄

當您希望 AWS IoT Greengrass Core 軟體以根執行,但 Linux 功能減少時,請使用此解決方案。此組態提供以根身分執行的完整功能,同時透過限制軟體及其元件可用的功能來限制攻擊面。

取捨

此解決方案有下列考量:

  • 具有 RequiresPrivilege 的元件具有有限的功能 – 使用與 AWS IoT Greengrass Core 軟體相同的一組有限功能RequiresPrivilege執行的元件,而非完整的根權限。

先決條件

此解決方案需要:

  • 根存取

  • 在您的裝置上系統化

AWS IoT Greengrass V2 以具有有限功能的根安裝和執行
  1. 從 完成下列步驟使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體:設定您的裝置環境、提供登入資料,以及下載 AWS IoT Greengrass 核心軟體。

  2. 在您下載 AWS IoT Greengrass Core 軟體的目錄中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 ProtectSystem=strict ReadWritePaths=/greengrass /tmp
    • CapabilityBoundingSet 是一種系統化安全功能,可限制 AWS IoT Greengrass 核心軟體及其所有子程序可用的 Linux 功能。透過設定週框集,您可以限制 Greengrass 核程序和元件可以執行的操作,即使以根執行也是如此。如需每個功能的資訊,請參閱 所需的 Linux 功能 AWS IoT Greengrass V2

    • ProtectSystem=strict 會讓整個檔案系統為 服務唯讀,防止修改作業系統。這可提供系統化沙盒,即使惡意元件以更高的權限執行,也能保護系統檔案。

    • 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 更新行為

在此解決方案中:

  • Core AWS IoT Greengrass 軟體以系統服務的形式執行,並在故障或裝置重新啟動時自動重新啟動。

  • AWS IoT Greengrass 核心軟體的 OTA 更新正常運作。軟體更新並自動重新啟動。

系統資源限制

記憶體和 CPU 的每個元件資源限制在此解決方案中的運作方式與將 AWS IoT Greengrass Core 軟體作為根執行時相同。

所需的 Linux 功能 AWS IoT Greengrass V2

下表說明在非根組態中執行 時, AWS IoT Greengrass 核心軟體所需的 Linux 功能。這些功能用於解決方案 3 和 4。

必要的 Linux 功能
功能 Description 的必要項目

CAP_CHOWN

對檔案 UIDs和 GIDs 進行任意變更

根據執行元件的使用者變更檔案擁有權

CAP_DAC_OVERRIDE

繞過檔案讀取、寫入和執行許可檢查

允許 Greengrass 核使用者在搭配 使用指令碼時執行檔案 RequiresPrivilege

CAP_DAC_READ_SEARCH

略過檔案讀取許可檢查和目錄讀取和執行許可檢查

即使對於 Greengrass 核使用者沒有讀取許可的資料夾,也要步行資料夾階層

CAP_FOWNER

對通常需要程序之檔案系統 UID 以符合檔案 UID 的操作進行繞過許可檢查

略過檔案所有權檢查

CAP_SETUID

任意操作程序 UIDs

以與執行 Greengrass 核的使用者不同的使用者身分執行指令碼sudo時使用

CAP_SETGID

任意操作程序 GIDs

在以與執行 Greengrass 核的群組不同的群組執行指令碼sudo時使用

CAP_SYS_RESOURCE

覆寫資源限制

設定元件程序的資源限制,即使未在部署中指定限制

CAP_AUDIT_WRITE

將記錄寫入核心稽核日誌

允許 sudo寫入核心稽核日誌