检索秘密值 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

检索秘密值

使用密钥管理器 IPC 服务从核心设备上的密钥中检索机密值。你用秘密管理器组件将加密密钥部署到核心设备。然后,您可以使用 IPC 操作来解密密密钥并在自定义组件中使用其值。

SDK 的最低版本

下表列出了的最低版本Amazon IoT Device SDK您必须使用它来从核心设备上的密钥中检索机密值。

Authorization

要在自定义组件中使用密钥管理器,必须定义授权策略,允许您的组件获取存储在核心设备上的密钥的值。有关定义授权策略的信息,请参见授权组件执行 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

获取存储在核心设备上的密钥的值。

此操作类似于 Secrets Manager 操作,您可以使用该操作获取密钥的值Amazon Web Services 云。有关更多信息,请参阅《Amazon Secrets Manager API 参考》中的 GetSecretValue

请求

此操作的请求具有以下参数:

secretId(Python:secret_id)

要获取的秘密的名称。您可以指定密钥的亚马逊资源名称 (ARN) 或友好名称。

versionId(Python:version_id)

(可选)要获取的版本的 ID。

您可指定 versionIdversionStage

如果你没有指定versionId要么versionStage,则此操作默认为带有的版本AWSCURRENT标签。

versionStage(Python:version_stage)

(可选)要获取的版本的暂存标签。

您可指定 versionIdversionStage

如果你没有指定versionId要么versionStage,则此操作默认为带有的版本AWSCURRENT标签。

响应

此操作的响应包含以下信息:

secretId(Python:secret_id)

密钥的 ID。

versionId(Python:version_id)

此版本的密钥的 ID。

versionStage(Python:version_stage)

此版本机密所附的暂存标签列表。

secretValue(Python:secret_value)

这个版本的秘密的价值。这个物体,SecretValue,包含以下信息。

secretString(Python:secret_string)

您以字符串形式提供给 Secrets Manager 的受保护机密信息的解密部分。

secretBinary(Python:secret_binary)

(可选)您以字节数组形式作为二进制数据提供给 Secrets Manager 的受保护机密信息的解密部分。此属性包含以 base64 编码字符串形式存在的二进制数据。

如果您在 Secrets Manager 控制台中创建了密钥,则不会使用此属性。

示例

以下示例演示了如何在自定义组件代码中调用此操作。

Java (IPC client V1)
例 示例:获取密钥值
注意

此示例使用了IPCUtils用于创建与的连接的类Amazon IoT Greengrass核心 IPC 服务。有关更多信息,请参阅连接到Amazon 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)
例 示例:获取密钥值
注意

此示例假设您使用的是 1.5.4 或更高版本的Amazon IoT Device SDK适用于 Python 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 Amazon 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}"

Artifacts

以下示例 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,以便在以下步骤中使用。

    有关更多信息,请参阅创建密钥Amazon Secrets Manager用户指南

  2. 部署秘密管理器组件(aws.greengrass.SecretManager),其中包含以下配置合并更新。指定您之前创建的密钥的 ARN。

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

    有关更多信息,请参阅将Amazon 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" ] } } } }

    有关更多信息,请参阅 创建Amazon IoT Greengrass组件

  4. 查看Amazon IoT Greengrass核心软件日志,用于验证部署是否成功,并查看com.example.PrintSecret组件日志以查看打印的密钥值。有关更多信息,请参阅 监控Amazon IoT Greengrass日志