本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將 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
主題
選擇非根解決方案
使用下表來比較非根解決方案並了解其權衡。每個解決方案都根據您的安全需求和裝置限制提供不同的功能。
| 解決方案 | 需要根存取 | 可以不同的使用者身分執行元件 | 將 Greengrass 執行為系統服務 | 最適合 |
|---|---|---|---|---|
否 |
否 |
否 (使用者服務選用) |
您沒有根存取權的裝置 |
|
是 (僅限設定) |
否 |
是 |
以非根使用者身分執行 Greengrass,並將所有元件以相同使用者身分執行 |
|
是 (僅限設定) |
是 |
是 |
以非根使用者身分執行 Greengrass,同時以不同使用者身分執行元件 |
|
是 |
是 |
是 |
以一組有限的 Linux 功能執行 Greengrass 做為根目錄 |
下列流程圖會引導您根據裝置限制條件和需求選擇適當的解決方案。
解決方案 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 的情況下安裝和執行
-
從 完成下列步驟使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體:設定您的裝置環境、提供登入資料,以及下載 AWS IoT Greengrass 核心軟體。
-
建立安裝目錄,並確保您的使用者擁有該目錄。
mkdir -p $HOME/greengrass/v2 -
在沒有 的情況下執行安裝程式
sudo。將--component-default-user設定為您目前的使用者。java -Droot="$HOME/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-regionregion\ --thing-nameMyGreengrassCore\ --thing-group-nameMyGreengrassCoreGroup\ --thing-policy-nameGreengrassV2IoTThingPolicy\ --tes-role-nameGreengrassV2TokenExchangeRole\ --tes-role-alias-nameGreengrassCoreTokenExchangeRoleAlias\ --component-default-user $USER \ --provision true請勿使用 ,
--setup-system-service true因為您沒有建立系統服務的根存取權。
(選用) 設定系統化使用者服務
您可以設定系統化使用者服務來管理 AWS IoT Greengrass Core 軟體。這可讓軟體在您登入時自動啟動。
設定系統化使用者服務
-
如果 AWS IoT Greengrass 核心軟體目前正在執行,請停止它。
kill $(cat $HOME/greengrass/v2/alts/loader.pid) -
建立系統化使用者服務目錄。
mkdir -p $HOME/.config/systemd/user -
$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 安裝的路徑。 -
啟用並啟動服務。
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 安裝和執行為非根目錄
-
從 完成下列步驟使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體:設定您的裝置環境、提供登入資料,以及下載 AWS IoT Greengrass 核心軟體。
-
建立將執行 AWS IoT Greengrass Core 軟體和所有元件的非根使用者。
sudo useradd --create-home gg_non_root -
以非根使用者身分登入並執行安裝程式。
--component-default-user設定為相同的使用者。請勿使用sudo,也不設定系統服務。java -Droot="/home/gg_non_root/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-regionregion\ --thing-nameMyGreengrassCore\ --thing-group-nameMyGreengrassCoreGroup\ --thing-policy-nameGreengrassV2IoTThingPolicy\ --tes-role-nameGreengrassV2TokenExchangeRole\ --tes-role-alias-nameGreengrassCoreTokenExchangeRoleAlias\ --component-default-user gg_non_root \ --provision true \ --setup-system-service false -
做為根目錄,使用
/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 -
停止執行中 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 的非根安裝和執行
-
從 完成下列步驟使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體:設定您的裝置環境、提供登入資料,以及下載 AWS IoT Greengrass 核心軟體。
-
建立將執行 AWS IoT Greengrass Core 軟體的非根使用者。
sudo useradd --create-home gg_non_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 -
以非根使用者身分登入並執行安裝程式。請勿使用
sudo,也不設定系統服務。java -Droot="/home/gg_non_root/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-regionregion\ --thing-nameMyGreengrassCore\ --thing-group-nameMyGreengrassCoreGroup\ --thing-policy-nameGreengrassV2IoTThingPolicy\ --tes-role-nameGreengrassV2TokenExchangeRole\ --tes-role-alias-nameGreengrassCoreTokenExchangeRoleAlias\ --component-default-user ggc_user:ggc_group \ --provision true \ --setup-system-service false -
做為根目錄,使用
/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指定服務可寫入的唯一目錄。
-
停止執行中 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 以具有有限功能的根安裝和執行
-
從 完成下列步驟使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體:設定您的裝置環境、提供登入資料,以及下載 AWS IoT Greengrass 核心軟體。
-
在您下載 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 /tmpCapabilityBoundingSet是一種系統化安全功能,可限制 AWS IoT Greengrass 核心軟體及其所有子程序可用的 Linux 功能。透過設定週框集,您可以限制 Greengrass 核程序和元件可以執行的操作,即使以根執行也是如此。如需每個功能的資訊,請參閱 所需的 Linux 功能 AWS IoT Greengrass V2。ProtectSystem=strict會讓整個檔案系統為 服務唯讀,防止修改作業系統。這可提供系統化沙盒,即使惡意元件以更高的權限執行,也能保護系統檔案。ReadWritePaths指定服務可寫入的唯一目錄。搭配ProtectSystem=strict,這會將服務限制為僅寫入 AWS IoT Greengrass V2 根目錄 和/tmp。
-
使用 執行安裝程式
--setup-system-service true。sudo -E java -Droot="/greengrass/v2" -Dlog.store=FILE \ -jar ./GreengrassInstaller/lib/Greengrass.jar \ --aws-regionregion\ --thing-nameMyGreengrassCore\ --thing-group-nameMyGreengrassCoreGroup\ --thing-policy-nameGreengrassV2IoTThingPolicy\ --tes-role-nameGreengrassV2TokenExchangeRole\ --tes-role-alias-nameGreengrassCoreTokenExchangeRoleAlias\ --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。
| 功能 | Description | 的必要項目 |
|---|---|---|
|
對檔案 UIDs和 GIDs 進行任意變更 |
根據執行元件的使用者變更檔案擁有權 |
|
繞過檔案讀取、寫入和執行許可檢查 |
允許 Greengrass 核使用者在搭配 使用指令碼時執行檔案 |
|
略過檔案讀取許可檢查和目錄讀取和執行許可檢查 |
即使對於 Greengrass 核使用者沒有讀取許可的資料夾,也要步行資料夾階層 |
|
對通常需要程序之檔案系統 UID 以符合檔案 UID 的操作進行繞過許可檢查 |
略過檔案所有權檢查 |
|
任意操作程序 UIDs |
以與執行 Greengrass 核的使用者不同的使用者身分執行指令碼 |
|
任意操作程序 GIDs |
在以與執行 Greengrass 核的群組不同的群組執行指令碼 |
|
覆寫資源限制 |
設定元件程序的資源限制,即使未在部署中指定限制 |
|
將記錄寫入核心稽核日誌 |
允許 |