擷取秘密值 - AWS IoT Greengrass

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

擷取秘密值

使用密碼管理員 IPC 服務從核心裝置上的密碼擷取密碼值。您可以使用 Secret Manager 元件將加密的密碼部署到核心裝置。然後,您可以使用 IPC 作業解密,並在自訂元件中使用其值。

最低 SDK 版本

下表列出從核心裝置上AWS IoT Device SDK的密碼擷取秘密值所必須使用的最低版本。

授權

若要在自訂元件中使用密碼管理員,您必須定義授權原則,讓元件取得儲存在核心裝置上的密碼值。如需有關定義授權原則的資訊,請參閱授權元件執行 IPC 作業

密碼管理員的授權原則具有下列屬性。

IPC 服務識別碼:aws.greengrass.SecretManager

操作 描述 資源

aws.greengrass#GetSecretValue*

允許元件取得核心裝置上加密的密碼值。

Secrets Manager 秘密 ARN,或*允許訪問所有秘密。

授權政策範例

您可以參考下列授權原則範例,協助您設定元件的授權原則。

範例 授權政策範例

下列範例授權原則可讓元件取得核心裝置上任何密碼的值。

注意

建議您在實際執行環境中減少授權原則的範圍,以便元件只擷取其使用的密碼。您可以在部署元件時,將*萬用字元變更為秘密 ARN 清單。

{ "accessControl": { "aws.greengrass.SecretManager": { "com.example.MySecretComponent:secrets:1": { "policyDescription": "Allows access to a secret.", "operations": [ "aws.greengrass#GetSecretValue" ], "resources": [ "*" ] } } } }

GetSecretValue

取得您儲存在核心裝置上的密碼值。

此作業類似於您可以用來取得中密碼值的 Secret Manager 作業AWS 雲端。如需詳細資訊,請參閱 AWS Secrets Manager API 參考中的 GetSecretValue

請求

此操作的請求具有以下參數:

secretId(Python:secret_id)

要獲得的秘密的名稱。您可以指定 Amazon 資源名稱 (ARN) 或密碼的易記名稱。

versionId(Python:version_id)

(選擇性) 要取得的版本 ID。

您可指定為 versionIdversionStage

如果未指定versionIdversionStage,則此作業預設為帶有AWSCURRENT標籤的版本。

versionStage(Python:version_stage)

(選擇性) 要取得之版本的暫存標籤。

您可指定為 versionIdversionStage

如果未指定versionIdversionStage,則此作業預設為帶有AWSCURRENT標籤的版本。

回應

此作業的回應包含下列資訊:

secretId(Python:secret_id)

密碼的識別碼。

versionId(Python:version_id)

此密碼版本的識別碼。

versionStage(Python:version_stage)

附加至此密碼版本的暫存標籤清單。

secretValue(Python:secret_value)

這個版本的密碼的值。此物件SecretValue包含下列資訊。

secretString(Python:secret_string)

您以字串形式提供給 Secret Secrets Manager 之受保護機密資訊的解密部分。

secretBinary(Python:secret_binary)

(選擇性) 受保護機密資訊的解密部分,您以位元組陣列的二進位資料形式提供給 Secrets Manager。此內容包含以 base64 編碼字串的二進位資料。

如果您在秘密管理員主控台中建立密碼,則不會使用此屬性。

範例

下列範例示範如何在自訂元件程式碼中呼叫此作業。

Java (IPC client V1)
範例:取得秘密值
注意

此範例會使用IPCUtils類別來建立與 AWS IoT Greengrass Core IPC 服務的連線。如需詳細資訊,請參閱 Connect 到 AWS IoT Greengrass 酷睿 IPC 服務

package com.aws.greengrass.docs.samples.ipc; import com.aws.greengrass.docs.samples.ipc.util.IPCUtils; import software.amazon.awssdk.aws.greengrass.GetSecretValueResponseHandler; import software.amazon.awssdk.aws.greengrass.GreengrassCoreIPCClient; import software.amazon.awssdk.aws.greengrass.model.GetSecretValueRequest; import software.amazon.awssdk.aws.greengrass.model.GetSecretValueResponse; import software.amazon.awssdk.aws.greengrass.model.UnauthorizedError; import software.amazon.awssdk.eventstreamrpc.EventStreamRPCConnection; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class GetSecretValue { public static final int TIMEOUT_SECONDS = 10; public static void main(String[] args) { String secretArn = args[0]; String versionStage = args[1]; try (EventStreamRPCConnection eventStreamRPCConnection = IPCUtils.getEventStreamRpcConnection()) { GreengrassCoreIPCClient ipcClient = new GreengrassCoreIPCClient(eventStreamRPCConnection); GetSecretValueResponseHandler responseHandler = GetSecretValue.getSecretValue(ipcClient, secretArn, versionStage); CompletableFuture<GetSecretValueResponse> futureResponse = responseHandler.getResponse(); try { GetSecretValueResponse response = futureResponse.get(TIMEOUT_SECONDS, TimeUnit.SECONDS); response.getSecretValue().postFromJson(); String secretString = response.getSecretValue().getSecretString(); System.out.println("Successfully retrieved secret value: " + secretString); } catch (TimeoutException e) { System.err.println("Timeout occurred while retrieving secret: " + secretArn); } catch (ExecutionException e) { if (e.getCause() instanceof UnauthorizedError) { System.err.println("Unauthorized error while retrieving secret: " + secretArn); } else { throw e; } } } catch (InterruptedException e) { System.out.println("IPC interrupted."); } catch (ExecutionException e) { System.err.println("Exception occurred when using IPC."); e.printStackTrace(); System.exit(1); } } public static GetSecretValueResponseHandler getSecretValue(GreengrassCoreIPCClient greengrassCoreIPCClient, String secretArn, String versionStage) { GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest(); getSecretValueRequest.setSecretId(secretArn); getSecretValueRequest.setVersionStage(versionStage); return greengrassCoreIPCClient.getSecretValue(getSecretValueRequest, Optional.empty()); } }
Python (IPC client V1)
範例:取得秘密值
注意

這個範例假設您使用的是適用AWS IoT Device SDK於 Python v2 的 1.5.4 版或更新版本。

import json import awsiot.greengrasscoreipc from awsiot.greengrasscoreipc.model import ( GetSecretValueRequest, GetSecretValueResponse, UnauthorizedError ) secret_id = 'arn:aws:secretsmanager:us-west-2:123456789012:secret:MyGreengrassSecret-abcdef' TIMEOUT = 10 ipc_client = awsiot.greengrasscoreipc.connect() request = GetSecretValueRequest() request.secret_id = secret_id request.version_stage = 'AWSCURRENT' operation = ipc_client.new_get_secret_value() operation.activate(request) future_response = operation.get_response() response = future_response.result(TIMEOUT) secret_json = json.loads(response.secret_value.secret_string) # Handle secret value.
JavaScript
範例:取得秘密值
import { GetSecretValueRequest, } from 'aws-iot-device-sdk-v2/dist/greengrasscoreipc/model'; import * as greengrasscoreipc from "aws-iot-device-sdk-v2/dist/greengrasscoreipc"; class GetSecretValue { private readonly secretId : string; private readonly versionStage : string; private ipcClient : greengrasscoreipc.Client constructor() { this.secretId = "<define_your_own_secretId>" this.versionStage = "<define_your_own_versionStage>" this.getSecretValue().then(r => console.log("Started workflow")); } private async getSecretValue() { try { this.ipcClient = await getIpcClient(); const getSecretValueRequest : GetSecretValueRequest = { secretId: this.secretId, versionStage: this.versionStage, }; const result = await this.ipcClient.getSecretValue(getSecretValueRequest); const secretString = result.secretValue.secretString; console.log("Successfully retrieved secret value: " + secretString) } catch (e) { // parse the error depending on your use cases throw e } } } export async function getIpcClient(){ try { const ipcClient = greengrasscoreipc.createClient(); await ipcClient.connect() .catch(error => { // parse the error depending on your use cases throw error; }); return ipcClient } catch (err) { // parse the error depending on your use cases throw err } } const getSecretValue = new GetSecretValue();

範例

使用下列範例來瞭解如何在元件中使用密碼管理員 IPC 服務。

此範例元件會列印您部署至核心裝置的密碼值。

重要

這個範例元件會列印密碼的值,因此只能用於儲存測試資料的密碼。不要使用此組件來打印存儲重要信息的密鑰的值。

Recipe

下列範例方案定義秘密 ARN 組態參數,並允許元件取得核心裝置上任何密碼的值。

注意

建議您在實際執行環境中減少授權原則的範圍,以便元件只擷取其使用的密碼。您可以在部署元件時,將*萬用字元變更為秘密 ARN 清單。

JSON
{ "RecipeFormatVersion": "2020-01-25", "ComponentName": "com.example.PrintSecret", "ComponentVersion": "1.0.0", "ComponentDescription": "Prints the value of an AWS Secrets Manager secret.", "ComponentPublisher": "Amazon", "ComponentDependencies": { "aws.greengrass.SecretManager": { "VersionRequirement": "^2.0.0", "DependencyType": "HARD" } }, "ComponentConfiguration": { "DefaultConfiguration": { "SecretArn": "", "accessControl": { "aws.greengrass.SecretManager": { "com.example.PrintSecret:secrets:1": { "policyDescription": "Allows access to a secret.", "operations": [ "aws.greengrass#GetSecretValue" ], "resources": [ "*" ] } } } } }, "Manifests": [ { "Platform": { "os": "linux" }, "Lifecycle": { "install": "python3 -m pip install --user awsiotsdk", "run": "python3 -u {artifacts:path}/print_secret.py \"{configuration:/SecretArn}\"" } }, { "Platform": { "os": "windows" }, "Lifecycle": { "install": "py -3 -m pip install --user awsiotsdk", "run": "py -3 -u {artifacts:path}/print_secret.py \"{configuration:/SecretArn}\"" } } ] }
YAML
--- RecipeFormatVersion: '2020-01-25' ComponentName: com.example.PrintSecret ComponentVersion: 1.0.0 ComponentDescription: Prints the value of a Secrets Manager secret. ComponentPublisher: Amazon ComponentDependencies: aws.greengrass.SecretManager: VersionRequirement: "^2.0.0" DependencyType: HARD ComponentConfiguration: DefaultConfiguration: SecretArn: '' accessControl: aws.greengrass.SecretManager: com.example.PrintSecret:secrets:1: policyDescription: Allows access to a secret. operations: - aws.greengrass#GetSecretValue resources: - "*" Manifests: - Platform: os: linux Lifecycle: install: python3 -m pip install --user awsiotsdk run: python3 -u {artifacts:path}/print_secret.py "{configuration:/SecretArn}" - Platform: os: windows Lifecycle: install: py -3 -m pip install --user awsiotsdk run: py -3 -u {artifacts:path}/print_secret.py "{configuration:/SecretArn}"

成品

下面的示例 Python 應用程序演示了如何使用秘密管理器 IPC 服務來獲取核心設備上的密鑰的值。

import concurrent.futures import json import sys import traceback import awsiot.greengrasscoreipc from awsiot.greengrasscoreipc.model import ( GetSecretValueRequest, GetSecretValueResponse, UnauthorizedError ) TIMEOUT = 10 if len(sys.argv) == 1: print('Provide SecretArn in the component configuration.', file=sys.stdout) exit(1) secret_id = sys.argv[1] try: ipc_client = awsiot.greengrasscoreipc.connect() request = GetSecretValueRequest() request.secret_id = secret_id operation = ipc_client.new_get_secret_value() operation.activate(request) future_response = operation.get_response() try: response = future_response.result(TIMEOUT) secret_json = json.loads(response.secret_value.secret_string) print('Successfully got secret: ' + secret_id) print('Secret value: ' + str(secret_json)) except concurrent.futures.TimeoutError: print('Timeout occurred while getting secret: ' + secret_id, file=sys.stderr) except UnauthorizedError as e: print('Unauthorized error while getting secret: ' + secret_id, file=sys.stderr) raise e except Exception as e: print('Exception while getting secret: ' + secret_id, file=sys.stderr) raise e except Exception: print('Exception occurred when using IPC.', file=sys.stderr) traceback.print_exc() exit(1)

用量

您可以將這個範例元件與 secret Manager 元件搭配使用,在核心裝置上部署和列印密碼的值。

若要建立、部署和列印測試密碼
  1. 使用測試資料建立密碼管理員密碼。

    Linux or Unix
    aws secretsmanager create-secret \ --name MyTestGreengrassSecret \ --secret-string '{"my-secret-key": "my-secret-value"}'
    Windows Command Prompt (CMD)
    aws secretsmanager create-secret ^ --name MyTestGreengrassSecret ^ --secret-string '{"my-secret-key": "my-secret-value"}'
    PowerShell
    aws secretsmanager create-secret ` --name MyTestGreengrassSecret ` --secret-string '{"my-secret-key": "my-secret-value"}'

    儲存密碼的 ARN,以便在下列步驟中使用。

    若要取得更多資訊,請參閱《AWS Secrets Manager使用指南》中的〈建立密碼

  2. 使用下列組態合併更新部署秘密管理員元件 (aws.greengrass.SecretManager)。指定您先前建立之密碼的 ARN。

    { "cloudSecrets": [ { "arn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestGreengrassSecret-abcdef" } ] }

    如需詳細資訊,請參閱將AWS IoT Greengrass元件部署到裝置Greengrass CLI 部署命令。

  3. 使用下列組態合併更新,在本節中建立及部署範例元件。指定您先前建立之密碼的 ARN。

    { "SecretArn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestGreengrassSecret", "accessControl": { "aws.greengrass.SecretManager": { "com.example.PrintSecret:secrets:1": { "policyDescription": "Allows access to a secret.", "operations": [ "aws.greengrass#GetSecretValue" ], "resources": [ "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestGreengrassSecret-abcdef" ] } } } }

    如需更多資訊,請參閱 建立 AWS IoT Greengrass 元件

  4. 檢視AWS IoT Greengrass核心軟體記錄檔以確認部署是否成功,並檢視com.example.PrintSecret元件記錄以查看列印的密碼值。如需更多詳細資訊,請參閱 監控AWS IoT Greengrass日誌