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

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

检索密码值

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

Authorization

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

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

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

Request

此操作的请求包含以下参数:

secretId

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

versionId

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

您可指定 versionIdversionStage

如果您未指定versionId或者versionStage,则此操作默认为AWSCURRENT标签。

versionStage

(可选)要获取的版本的临时标签。

您可指定 versionIdversionStage

如果您未指定versionId或者versionStage,则此操作默认为AWSCURRENT标签。

Response

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

secretId

密钥的 ID。

versionId

此版本的密钥的此版本。

versionStage

附加到此版本的密钥的附加到此版本的暂存标签。

secretValue

此版本的密钥。这个对象,SecretValue包含以下信息。

secretString

作为字符串提供给 Secrets Manager 的受保护机密信息的解密部分。

secretBinary

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

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

Examples

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

Java

例如:获取密钥值

String secretId = "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyGreengrassSecret-abcdef"; String versionStage = "AWSCURRENT"; int TIMEOUT = 10; GetSecretValueRequest request = new GetSecretValueRequest(); request.setSecretId(secretId); request.setVersionStage(versionStage); CompletableFuture<GetSecretValueResponse> futureResponse = greengrassCoreIPCClient .getSecretValue(request, Optional.empty()).getResponse(); GetSecretValueResponse result = futureResponse.get(TIMEOUT, TimeUnit.SECONDS); result.getSecretValue().postFromJson(); // Set the SecretValue's internal union. String secretString = result.getSecretValue().getSecretString(); # Handle secret value.
Python

例如:获取密钥值

注意

此示例假设您使用的是版本 1.5.4 或更高版本。Amazon IoT Device SDK适用于 Python v2。如果使用 SDK 的版本 1.5.3,请参阅。使用Amazon IoT Device SDK适用于 Python v2,了解有关连接到Amazon IoT Greengrass核心 IPC 服务。

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) futureResponse = operation.get_response() response = futureResponse.result(TIMEOUT) secret_json = json.loads(response.secret_value.secret_string) # Handle secret value.

Examples

使用以下示例了解如何在组件中使用密钥管理器 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": [ { "Lifecycle": { "Install": "python3 -m pip install --user awsiotsdk", "Run": "python3 -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: - Lifecycle: Install: python3 -m pip install --user awsiotsdk Run: python3 -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) futureResponse = operation.get_response() try: response = futureResponse.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)

Usage

您可以将此示例组件与密钥管理器组件在核心设备上部署和打印密钥的价值。

创建、部署和打印测试密钥

  1. 使用测试数据创建 Secrets Manager 密钥。

    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 GreengrassCore 软件日志查看组件日志