View a markdown version of this page

將 AWS IoT Greengrass V2 核心裝置遷移至非根目錄 - AWS IoT Greengrass

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

將 AWS IoT Greengrass V2 核心裝置遷移至非根目錄

重要

本主題說明建議的遷移方法。您可能需要針對裝置組態、作業系統和安裝的軟體調整這些步驟。

根據預設, 會在 Linux 裝置上以根使用者身分 AWS IoT Greengrass 執行。您可以透過遷移 AWS IoT Greengrass 核心裝置以僅具有 AWS IoT Greengrass 所需的 Linux 功能的非根使用者身分執行 ,來改善裝置的安全狀態。您可以遷移單一裝置或跨機群擴展遷移。

考量事項

遷移至非根目錄之前,請考慮下列事項:

  • 此遷移程序適用於在具有 systemd AWS IoT Greengrass 的 Linux 上執行 nucleus (Java 型) AWS IoT Greengrass 的核心裝置。它不適用於執行 nucleus lite AWS IoT Greengrass 的裝置。

  • 遷移生產機群之前,請在開發環境中的單一裝置上測試遷移。

遷移單一裝置

此遷移程序遵循中所述的方法解決方案 3:使用元件使用者分隔 AWS IoT Greengrass V2 將 設定為非根目錄。開始之前,請先完成該主題中的先決條件,包括允許非根使用者以個別使用者身分執行元件的 sudoers 組態。

使用此程序在遷移機群之前遷移單一裝置。

步驟 1:建立非根使用者和群組

連線至您的裝置,並建立 AWS IoT Greengrass 執行身分為 的系統使用者和群組。將 user-namegroup-name 取代為您要使用的名稱。

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

步驟 2:備份檔案擁有權

停止 AWS 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做為 AWS IoT Greengrass 根路徑。如果您安裝 AWS IoT Greengrass 到不同的位置,請將 取代/greengrass/v2為實際的 AWS IoT Greengrass 根路徑。

步驟 3:變更檔案擁有權

將 AWS IoT Greengrass 目錄的擁有權轉移給非根使用者。

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

步驟 4:建立系統化的捨棄覆寫

建立下拉式清單和組態檔案,指示 systemd 以具有必要 Linux 功能的非根使用者 AWS IoT Greengrass 身分執行。

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

遷移使用位於 的系統化插入式覆寫檔案/etc/systemd/system/greengrass.service.d/10-nonroot.conf。插入式覆寫會取代基礎服務檔案中的設定,而不直接修改。此覆寫會將系統化 設定為以具有一組有限 Linux 功能的非根使用者身分執行 AWS IoT Greengrass 服務。移除下拉式目錄會導致系統還原為基本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

如需這些系統化指令和所需功能的資訊,請參閱 解決方案 3:使用元件使用者分隔 AWS IoT Greengrass V2 將 設定為非根目錄

步驟 5:重新載入系統化並啟動 AWS IoT Greengrass

執行下列命令以重新載入系統化協助程式並啟動 AWS IoT Greengrass。

sudo systemctl daemon-reload sudo systemctl start greengrass.service

步驟 6:驗證遷移

確認 AWS IoT Greengrass 以非根使用者身分執行。

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

輸出會將非根使用者顯示為程序擁有者,而非 root

接著,確認所有部署的元件都在執行中。您必須在裝置上部署 aws.greengrass.Cli元件,才能執行此命令。

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

每個元件都應報告 RUNNINGStateFINISHEDFINISHED是 的預期終端狀態aws.greengrass.Nucleus。在您考慮遷移完成之前,請先調查處於 BROKENERRORED 狀態的任何元件。

復原單一裝置

如果您需要還原 AWS IoT Greengrass 以根身分執行,請移除插入式覆寫、還原檔案擁有權,然後重新啟動 AWS 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:驗證遷移 再次從 執行驗證命令,以確認 AWS IoT Greengrass 以根身分執行。程序應顯示root為擁有者。

確認轉返成功後,您可以選擇清除遷移成品:

  • 備份目錄/opt/greengrass-backup 如果您計劃稍後重試遷移,您可以保留 ,或將其移除:

    sudo rm -r /opt/greengrass-backup
  • 非根使用者和群組 — 如果您不再計劃以非根使用者 AWS IoT Greengrass 身分執行,您可以移除您在步驟 1 中建立的使用者和群組:

    sudo userdel user-name sudo groupdel group-name

    如果其他服務或元件使用此使用者,請勿移除使用者。

遷移裝置機群

在單一裝置上驗證遷移後,您可以跨機群擴展遷移。選擇下列其中一種方法:

使用自訂 AWS IoT Greengrass 引導元件

您可以建立自訂 AWS IoT Greengrass 元件,將整個機群的單一裝置遷移步驟自動化。此方法為獨立式,且僅使用 AWS IoT Greengrass 部署。它不需要外部工具,例如 Systems Manager。

元件使用引導生命週期,並將 RequiresPrivilege 設定為 true,在部署期間將元件做為根目錄執行。引導指令碼會執行與單一裝置程序相同的特殊權限操作:

  • 如果非根使用者和群組尚未存在,請建立這些使用者和群組。

  • 備份用於轉返的檔案擁有權結構。

  • 將 AWS IoT Greengrass 根目錄的擁有權變更為非根使用者。

  • 建立系統化的下拉式清單覆寫檔案。

  • 重新載入系統化協助程式。

  • 使用代碼 101 結束以重新啟動裝置。

重要

元件必須以代碼 101 而非 100 結束。結束程式碼 100 只會重新啟動 AWS IoT Greengrass JVM 程序,該程序使用已快取在記憶體中的系統化服務組態。完整重新啟動會強制系統化從磁碟讀取新的插入式覆寫,並以非根使用者 AWS IoT Greengrass 身分啟動。重新啟動會暫時中斷裝置上的所有服務。

讓元件等冪,以便在您已遷移裝置時重新部署不會失敗。

遷移部署完成後,請確認您的裝置是以非根使用者身分執行。如需詳細資訊,請參閱步驟 6:驗證遷移。您可以部署驗證元件來檢查執行中的使用者並報告結果,或在 AWS IoT Greengrass 主控台中監控部署狀態。

設定復原機制

若要在機群中遠端還原根組態,您的遷移元件必須設定復原機制。其中一種方法是使用 systemd 來監控觸發檔案。此方法需要下列系統化資源:

  • 移除捨棄覆寫、從備份還原原始檔案擁有權、重新載入系統化協助程式,並以 AWS IoT Greengrass 根目錄重新啟動的復原指令碼

  • 以根目錄執行轉返指令碼的系統化 oneshot 服務。一個 oneshot 服務會執行單一任務,然後結束,而不是做為長期協助程式執行。

  • 監控特定檔案路徑的系統化路徑單位,例如 /greengrass/v2/rollback/.rollback-trigger。當檔案出現時,路徑單位會自動啟動 oneshot 復原服務。

透過此機制,您可以部署建立觸發檔案的簡單 AWS IoT Greengrass 元件來復原裝置。系統化路徑單位會偵測檔案、執行復原服務做為根目錄,並還原 AWS IoT Greengrass 至其原始根組態。

使用 AWS Systems Manager

如果您使用 Systems Manager 來管理裝置,您可以建立 SSM 文件來自動化單一裝置遷移步驟。由於 SSM 獨立執行 AWS IoT Greengrass,因此可以直接停止並重新啟動 AWS IoT Greengrass 服務,而無需重新啟動裝置。

您的 SSM 文件必須符合下列要求:

  • 停止 AWS IoT Greengrass 並備份目前的服務組態和檔案擁有權結構。

  • 建立非根使用者和群組。

  • 將 AWS IoT Greengrass 目錄的擁有權變更為非根使用者。

  • 建立系統化的下拉式清單覆寫檔案。

  • 重新載入系統化協助程式並啟動 AWS IoT Greengrass。

  • 確認 以非根使用者身分成功 AWS IoT Greengrass 啟動。

若要跨機群執行遷移,請使用 Systems Manager Run Command,針對使用標籤或資源群組的裝置執行 SSM 文件。您可以在 Systems Manager 主控台中監控命令執行狀態,顯示每個目標裝置的結果,包括任何錯誤。

若要轉返,請建立個別的 SSM 文件以停止 AWS IoT Greengrass、移除捨棄覆寫、還原原始檔案擁有權、重新載入系統化協助程式,並以根 AWS IoT Greengrass 重新啟動。針對您需要復原的裝置執行本文件。

如需在受管節點上執行命令的詳細資訊,請參閱使用 Systems Manager Run Command 執行命令