擷取秘密值 - AWS IoT Greengrass

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

擷取秘密值

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

最低 SDK 版本

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

授權

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

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

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

操作 描述 資源

aws.greengrass#GetSecretValue*

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

秘密經理秘密 ARN,或*允許訪問所有秘密。

授權政策範例

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

範例 授權政策範例

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

注意

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

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

GetSecretValue

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

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

請求

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

secretId(蟒蛇:secret_id)

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

versionId(蟒蛇:version_id)

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

您可指定為 versionIdversionStage

如果您沒有指定versionId或者versionStage,此作業預設為AWSCURRENT標籤。

versionStage(蟒蛇:version_stage)

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

您可指定為 versionIdversionStage

如果您沒有指定versionId或者versionStage,此作業預設為AWSCURRENT標籤。

回應

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

secretId(蟒蛇:secret_id)

密碼的識別碼。

versionId(蟒蛇:version_id)

此密碼版本的識別碼。

versionStage(蟒蛇:version_stage)

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

secretValue(蟒蛇:secret_value)

這個版本的密碼的值。這個對象,SecretValue,包含下列資訊。

secretString(蟒蛇:secret_string)

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

secretBinary(蟒蛇:secret_binary)

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

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

範例

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

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

此範例使用IPCUtils類來創建一個連接到AWS IoT Greengrass核心工業電腦服務。如需詳細資訊,請參閱連接到AWS IoT Greengrass核心工業電腦服務

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)
範例:取得秘密值
注意

此範例假設您使用的是 1.5.4 版或更新版本AWS IoT Device SDK對於蟒蛇 V2。

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)

用量

您可以搭配使用此範例元件秘密管理器組件在核心設備上部署和打印密碼的價值。

若要建立、部署和列印測試密碼
  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元件部署到裝置格林格拉斯 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日誌