

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

# 將 AWS IoT Greengrass V2 核心裝置設定為非根裝置
<a name="setup-greengrass-non-root"></a>

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

**注意**  
本頁面上的非根解決方案僅適用於 Linux 裝置上的 AWS IoT Greengrass 核。不包含 Windows，因為 AWS IoT Greengrass V2 必須以系統服務的形式在 Windows 上執行。如需 Linux 上的標準根安裝，請參閱 [使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體](quick-installation.md)。  
若要以非根使用者身分執行 AWS IoT Greengrass nucleus lite，請參閱 nucleus lite GitHub 儲存庫中的[使用 Podman](https://github.com/aws-greengrass/aws-greengrass-lite/blob/main/docs/BUILD.md#optional-using-podman)。 AWS IoT Greengrass 

**Topics**
+ [選擇非根解決方案](#non-root-choose-solution)
+ [解決方案 1：在沒有根存取權 AWS IoT Greengrass V2 的情況下設定](#non-root-solution-1)
+ [解決方案 2：將 AWS IoT Greengrass V2 設定為無元件使用者分隔的非根目錄](#non-root-solution-2)
+ [解決方案 3：使用元件使用者分隔 AWS IoT Greengrass V2 將 設定為非根目錄](#non-root-solution-3)
+ [解決方案 4：將 AWS IoT Greengrass V2 設定為功能有限的根目錄](#non-root-solution-4)
+ [所需的 Linux 功能 AWS IoT Greengrass V2](#linux-capabilities-reference)

## 選擇非根解決方案
<a name="non-root-choose-solution"></a>

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


**非根解決方案**  

| 解決方案 | 需要根存取 | 可以不同的使用者身分執行元件 | 將 Greengrass 執行為系統服務 | 最適合 | 
| --- | --- | --- | --- | --- | 
| [解決方案 1：無根存取](#non-root-solution-1) | 否 | 否 | 否 （使用者服務選用） | 您沒有根存取權的裝置 | 
| [解決方案 2：非根、單一使用者](#non-root-solution-2) | 是 （僅限設定） | 否 | 是 | 以非根使用者身分執行 Greengrass，並將所有元件以相同使用者身分執行 | 
| [解決方案 3：非根、多使用者](#non-root-solution-3) | 是 （僅限設定） | 是 | 是 | 以非根使用者身分執行 Greengrass，同時以不同使用者身分執行元件 | 
| [解決方案 4：功能有限的根目錄](#non-root-solution-4) | 是 | 是 | 是 | 以一組有限的 Linux 功能執行 Greengrass 做為根目錄 | 

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

![\[流程圖顯示選擇非根解決方案的決策程序。首先，詢問您是否擁有核心裝置上的根存取權。如果否，請使用解決方案 1。如果是，詢問是否需要以不同的 Linux 使用者身分執行元件。如果否，請使用解決方案 2。如果是，詢問您是否希望 Greengrass 以功能有限的根使用者身分執行。如果是，請使用解決方案 4。如果否，請使用解決方案 3。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v2/developerguide/images/non-root-solution-decision-flow.png)


## 解決方案 1：在沒有根存取權 AWS IoT Greengrass V2 的情況下設定
<a name="non-root-solution-1"></a>

當您在裝置上沒有根存取權時，請使用此解決方案。在此組態中， 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 核心軟體](quick-installation.md)：設定您的裝置環境、提供登入資料，以及下載 AWS IoT Greengrass 核心軟體。

1. 建立安裝目錄，並確保您的使用者擁有該目錄。

   ```
   mkdir -p $HOME/greengrass/v2
   ```

1. 在沒有 的情況下執行安裝程式`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)
   ```

1. 建立系統化使用者服務目錄。

   ```
   mkdir -p $HOME/.config/systemd/user
   ```

1. `$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 安裝的路徑。

1. 啟用並啟動服務。

   ```
   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 核心軟體](configure-greengrass-core-v2.md)。

## 解決方案 2：將 AWS IoT Greengrass V2 設定為無元件使用者分隔的非根目錄
<a name="non-root-solution-2"></a>

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

**取捨**  
此解決方案有下列限制：
+ **無元件使用者區隔** – 所有元件都以執行 AWS IoT Greengrass Core 軟體的相同使用者身分執行。您無法使用`posixUser`組態以不同的使用者身分執行元件。
+ 已**忽略 RequiresPrivilege ** – Core AWS IoT Greengrass 軟體會忽略元件配方中的 `RequiresPrivilege`選項。元件無法請求提升的權限。

**先決條件**  
此解決方案需要：
+ 初始設定的根存取權
+ 在您的裝置上系統化

**在沒有元件使用者分隔的情況下 AWS IoT Greengrass V2 安裝和執行為非根目錄**

1. 從 完成下列步驟[使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體](quick-installation.md)：設定您的裝置環境、提供登入資料，以及下載 AWS IoT Greengrass 核心軟體。

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

   ```
   sudo useradd --create-home gg_non_root
   ```

1. 以非根使用者身分登入並執行安裝程式。`--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
   ```

1. 做為根目錄，使用`/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
   ```

1. 停止執行中 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 核心軟體](configure-greengrass-core-v2.md)。

## 解決方案 3：使用元件使用者分隔 AWS IoT Greengrass V2 將 設定為非根目錄
<a name="non-root-solution-3"></a>

當您擁有初始設定的根存取權，但希望 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 核心軟體](quick-installation.md)：設定您的裝置環境、提供登入資料，以及下載 AWS IoT Greengrass 核心軟體。

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

   ```
   sudo useradd --create-home gg_non_root
   ```

1. 將非根使用者新增至 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
   ```

1. 以非根使用者身分登入並執行安裝程式。請勿使用 `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
   ```

1. 做為根目錄，使用`/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](#linux-capabilities-reference)。
   + `AmbientCapabilities` 會將指定的 Linux 功能授予執行服務的非根使用者。這可讓 AWS IoT Greengrass Core 軟體執行特殊權限操作，例如在執行元件時切換使用者，而不以根執行。
   + `CapabilityBoundingSet` 會限制服務及其子程序可以使用的功能集上限。未在此集中的功能會永久捨棄。
   + `ProtectSystem=strict` 會讓整個檔案系統為 服務唯讀，防止修改作業系統。
   + `ReadWritePaths` 指定服務可寫入的唯一目錄。

1. 停止執行中 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 設定為功能有限的根目錄
<a name="non-root-solution-4"></a>

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

**取捨**  
此解決方案有下列考量：
+ **具有 RequiresPrivilege 的元件具有有限的功能** – 使用與 AWS IoT Greengrass Core 軟體相同的一組有限功能`RequiresPrivilege`執行的元件，而非完整的根權限。

**先決條件**  
此解決方案需要：
+ 根存取
+ 在您的裝置上系統化

**AWS IoT Greengrass V2 以具有有限功能的根安裝和執行**

1. 從 完成下列步驟[使用自動資源佈建安裝 AWS IoT Greengrass 核心軟體](quick-installation.md)：設定您的裝置環境、提供登入資料，以及下載 AWS IoT Greengrass 核心軟體。

1. 在您下載 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](#linux-capabilities-reference)。
   + `ProtectSystem=strict` 會讓整個檔案系統為 服務唯讀，防止修改作業系統。這可提供系統化沙盒，即使惡意元件以更高的權限執行，也能保護系統檔案。
   + `ReadWritePaths` 指定服務可寫入的唯一目錄。搭配 `ProtectSystem=strict`，這會將服務限制為僅寫入 AWS IoT Greengrass V2 根目錄 和 `/tmp`。

1. 使用 執行安裝程式`--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
<a name="linux-capabilities-reference"></a>

下表說明在非根組態中執行 時， 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`寫入核心稽核日誌 | 