使用秘密資源 - AWS IoT Greengrass

AWS IoT Greengrass Version 1 於 2023 年 6 月 30 日進入延長使用壽命階段。如需詳細資訊,請參閱AWS IoT Greengrass V1 維護政策。在此日期之後, AWS IoT Greengrass V1 將不會發行提供功能、增強功能、錯誤修正或安全性修補程式的更新。在上運行的設備 AWS IoT Greengrass V1 不會中斷,並將繼續運行並連接到雲。我們強烈建議您移轉至 AWS IoT Greengrass Version 2,這會增加重要的新功能,並支援其他平台

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

使用秘密資源

AWS IoT Greengrass 使用「秘密資源」,將秘密從 AWS Secrets Manager 整合到 Greengrass 群組。秘密資源是秘 Secrets Manager 碼的參考。如需詳細資訊,請參閱將私密部署至 AWS IoT Greengrass 核心

在AWS IoT Greengrass核心裝置上,連接器和 Lambda 函數可以使用秘密資源,透過服務和應用程式進行驗證,而無需對密碼、權杖或其他認證進行硬式編碼。

建立和管理秘密

在 Greengrass 群組中,秘密資源會參考秘 Secrets Manager 秘密的 ARN。將秘密資源部署到核心時,密碼的值會加密,並可供關聯連接器和 Lambda 函數使用。如需詳細資訊,請參閱私密加密

您可以使用 Secrets Manager 來建立和管理密碼的雲端版本。您可以使用 AWS IoT Greengrass 來建立、管理和部署您的私密資源。

重要

我們建議您遵循在秘密 Secrets Manager 中旋轉秘密的最佳做法。然後,部署 Greengrass 群組以更新您私密的本機副本。如需詳細資訊,請參閱AWS Secrets Manager使用指南的旋轉AWS Secrets Manager密碼

讓秘密可在 Greengrass 核心上使用

  1. 在 Secrets Manager 中建立秘密。這是你的秘密的雲版本,它集中存儲和管理在秘密管理器。管理任務包括輪換私密值和套用資源政策。

  2. 在 AWS IoT Greengrass 中建立秘密資源。這是依 ARN 參考雲端私密之群組資源的類型。每個群組您只能參考私密一次。

  3. 設定您的連接器或 Lambda 函數。您必須指定對應參數或屬性,將資源與連接器或函數建立隸屬關係。這可讓它們取得本機部署之私密資源的值。如需詳細資訊,請參閱在連接器和 Lambda 函數中使用本機密

  4. 部署 Greengrass 群組。在部署期間,AWS IoT Greengrass 會擷取雲端私密的值,並在核心上建立 (或更新) 本機私密。

Secrets Manager 會在AWS CloudTrail每次AWS IoT Greengrass擷取密碼值時記錄一個事件。 AWS IoT Greengrass不會記錄與部署或使用本機密相關的任何事件。如需有關 Secrets Manager 記錄的詳細資訊,請參閱使用AWS Secrets Manager者指南中的監控AWS Secrets Manager密碼的使用情況。

包括私密資源中的預備標籤

Secrets Manager 會使用暫存標籤來識別特定版本的秘密值。暫存標籤可以是系統定義或使用者定義的。Secrets Manager 會將AWSCURRENT標籤指派給密碼值的最新版本。預備標籤通常用來管理私密輪換。如需有關 Secrets Manager 版本控制的詳細資訊,請參閱《AWS Secrets Manager使用者指南》AWS Secrets Manager的主要術語和概念

秘密資源始終包含AWSCURRENT測試標籤,如果 Lambda 函數或連接器需要其他臨時標籤,它們可以選擇性地包含其他臨時標籤。在群組部署期間,AWS IoT Greengrass 會擷取群組中參考之預備標籤的值,然後在核心上建立或更新對應值。

建立和管理私密資源 (主控台)

建立私密資源 (主控台)

在AWS IoT Greengrass主控台中,您可以從群組的 [資源] 頁面上的 [機] 索引標籤建立和管理秘密資源。如需建立私密資源,並將其新增到群組的詳細資訊,請參閱如何建立秘密資源 (主控台)Greengrass 連接器入門 (主控台)

Resources (資源) 頁面上 Secret (私密) 索引標籤上的私密資源。
注意

或者,控制台可讓您在設定連接器或 Lambda 函數時建立秘密和密碼資源。您可以從連接器的 [設定參數] 頁面或 Lambda 函數的 [資源] 頁面執行此操作。

管理私密資源 (主控台)

Greengrass 群組中秘密資源的管理工作包括將秘密資源新增至群組、從群組移除秘密資源,以及變更秘密資源中包含的暫存標籤集。

如果您指向秘密管理員的其他密碼,您也必須編輯任何使用該密碼的連接器:

  1. 在群組組態頁面上,選擇 Connectors (連接器)

  2. 從連接器的內容功能表中,選擇 Edit (編輯)

  3. Edit parameters (編輯參數) 頁面會顯示一則訊息,通知您私密 ARN 已變更。若要確認變更,請選擇 Save (儲存)

如果您刪除秘 Secrets Manager 中的密碼,請從群組以及參照該密碼的連接器和 Lambda 函數中移除對應的密碼資源。否則,在群組部署期間,會AWS IoT Greengrass傳回找不到密碼的錯誤。同時視需要更新您的 Lambda 函數程式碼。

建立和管理私密資源 (CLI)

建立私密資源 (CLI)

在 AWS IoT Greengrass API 中,私密是群組資源的類型。下列範例會建立一個資源定義,其初始版本包含名為 MySecretResource 的私密資源。如需建立私密資源,並將其新增到群組版本的教學課程,請參閱Greengrass 連接器入門 (CLI)

秘密資源會參考對應 Secrets Manager 密碼的 ARN,並且除了一律會包含兩個暫存標籤之外AWSCURRENT,還包含兩個暫存標籤。

aws greengrass create-resource-definition --name MyGreengrassResources --initial-version '{ "Resources": [ { "Id": "my-resource-id", "Name": "MySecretResource", "ResourceDataContainer": { "SecretsManagerSecretResourceData": { "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:greengrass-SomeSecret-KUj89s", "AdditionalStagingLabelsToDownload": [ "Label1", "Label2" ] } } } ] }'

管理私密資源 (CLI)

Greengrass 群組中秘密資源的管理工作包括將秘密資源新增至群組、從群組移除秘密資源,以及變更秘密資源中包含的暫存標籤集。

在 AWS IoT Greengrass API 中,這些變更是使用版本來實作的。

AWS IoT GreengrassAPI 使用版本來管理群組。版本是不可變的,因此若要新增或變更群組元件 (例如群組的用戶端裝置、函數和資源),您必須建立新元件或更新元件的版本。然後,您可以建立並部署包含每個元件目標版本的群組版本。若要進一步瞭解群組,請參閱AWS IoT Greengrass 群組

例如,若要變更私密資源的一組預備標籤,請:

  1. 建立一個資源定義版本,其中包含更新的私密資源。下列範例會將第三個預備標籤新增到來自前一節的私密資源。

    注意

    若要將更多資源新增到版本,請在 Resources 陣列中包括它們。

    aws greengrass create-resource-definition --name MyGreengrassResources --initial-version '{ "Resources": [ { "Id": "my-resource-id", "Name": "MySecretResource", "ResourceDataContainer": { "SecretsManagerSecretResourceData": { "ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:greengrass-SomeSecret-KUj89s", "AdditionalStagingLabelsToDownload": [ "Label1", "Label2", "Label3" ] } } } ] }'
  2. 如果私密資源的 ID 已變更,請更新使用私密資源的連接器和函數。在新的版本中,更新對應到資源 ID 的參數或屬性。如果私密的 ARN 已變更,您也須針對任何使用私密的連接器更新對應參數。

    注意

    資源 ID 是客戶提供的任意識別符。

  3. 建立一個群組版本,其中包含您要傳送到核心之每個元件的目標版本。

  4. 部署群組版本。

如需顯示如何建立和部署私密資源、連接器以及函數的教學課程,請參閱 Greengrass 連接器入門 (CLI)

如果您刪除秘 Secrets Manager 中的密碼,請從群組以及參照該密碼的連接器和 Lambda 函數中移除對應的密碼資源。否則,在群組部署期間,會AWS IoT Greengrass傳回找不到密碼的錯誤。同時視需要更新您的 Lambda 函數程式碼。您可以透過部署不包含對應密碼資源的資源定義版本來移除本機密碼。

在連接器和 Lambda 函數中使用本機密

Greengrass 連接器和 Lambda 函數會使用本機密與服務和應用程式互動。根據預設,會使用 AWSCURRENT 值,但也可以使用秘密資源中所含其他預備標籤的值。

您必須先設定連接器和函數,然後它們才能存取本機私密。這會將私密資源與連接器或函數建立隸屬關係。

連接器

如果連接器需要存取本機私密,則它會提供您使用其存取私密所需之資訊設定的參數。

如需個別連接器要求的相關資訊,請參閱 AWS-提供 Greengrass 連接器

連接器內建存取和使用私密的邏輯。

Lambda 函數

若要允許 Greengrass Lambda 函數存取本機密碼,您可以設定函數的屬性。

  • 要了解如何在AWS IoT Greengrass控制台中執行此操作,請參閱如何建立秘密資源 (主控台)

  • 若要在 AWS IoT Greengrass API 中這樣做,請在 ResourceAccessPolicies 屬性中提供下列資訊。

    • ResourceId:Greengrass 群組中私密資源的 ID。這是參考對應 Secrets Manager ARN 的資源。

    • Permission:函數對資源擁有的存取類型。私密資源僅支援 ro (唯讀) 許可。

    下列範例會建立可存取MyApiKey秘密資源的 Lambda 函數。

    aws greengrass create-function-definition --name MyGreengrassFunctions --initial-version '{ "Functions": [ { "Id": "MyLambdaFunction", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:myFunction:1", "FunctionConfiguration": { "Pinned": false, "MemorySize": 16384, "Timeout": 10, "Environment": { "ResourceAccessPolicies": [ { "ResourceId": "MyApiKey", "Permission": "ro" } ], "AccessSysfs": true } } } ] }'

     

    若要在執行階段存取本機密,Greengrass Lambda get_secret_value 函數會從AWS IoT Greengrass核心 SDK (v1.3.0 或更新版本) 中的secretsmanager用戶端呼叫函式。

    下面的例子演示了如何使用AWS IoT Greengrass核心 SDK 的 Python 來獲得一個秘密。它將秘密的名稱傳遞給get_secret_value函數。 SecretId可以是密碼 Secrets Manager 碼的名稱或 ARN(不是秘密資源)。

    import greengrasssdk secrets_client = greengrasssdk.client("secretsmanager") secret_name = "greengrass-MySecret-abc" def function_handler(event, context): response = secrets_client.get_secret_value(SecretId=secret_name) secret = response.get("SecretString")

    對於文字類型秘密,get_secret_value 函數會傳回一個字串。對於二進位類型秘密,它會傳回一個 base64 編碼字串。

    重要

    請確定您使用者定義的 Lambda 函數能安全地處理機密,而且不會記錄任何儲存在機密中的敏感資料。如需詳細資訊,請參閱AWS Secrets Manager使用者指南的降低記錄和偵錯 Lambda 函數的風險。雖然本文件特別提及旋轉函數,但此建議也適用於 Greengrass Lambda 函數。

    根據預設,會傳回秘密的目前值。這是連接了 AWSCURRENT 預備標籤的版本。若要存取不同的版本,請針對選用的 VersionStage 引數傳遞對應預備標籤的名稱。例如:

    import greengrasssdk secrets_client = greengrasssdk.client("secretsmanager") secret_name = "greengrass-TestSecret" secret_version = "MyTargetLabel" # Get the value of a specific secret version def function_handler(event, context): response = secrets_client.get_secret_value( SecretId=secret_name, VersionStage=secret_version ) secret = response.get("SecretString")

    如需另一個呼叫 get_secret_value 的函數範例,請參閱建立 Lambda 函數部署套件