Recuperar valores secretos - AWS IoT Greengrass

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Recuperar valores secretos

Use o serviço IPC do gerenciador de segredos para recuperar valores secretos dos segredos no dispositivo principal. Você usa o componente gerenciador de segredos para implantar segredos criptografados nos dispositivos principais. Em seguida, você pode usar uma operação IPC para descriptografar o segredo e usar seu valor em seus componentes personalizados.

Versões mínimas do SDK

A tabela a seguir lista as versões mínimas do AWS IoT Device SDK que você deve usar para recuperar valores secretos de segredos no dispositivo principal.

Autorização

Para usar o gerenciador de segredos em um componente personalizado, você deve definir políticas de autorização que permitam que seu componente obtenha o valor dos segredos que você armazena no dispositivo principal. Para obter informações sobre como definir políticas de autorização, consulteAutorize componentes a realizar operações de IPC.

As políticas de autorização para o gerenciador secreto têm as seguintes propriedades.

Identificador de serviço IPC: aws.greengrass.SecretManager

Operation Descrição Recursos

aws.greengrass#GetSecretValue ou *

Permite que um componente obtenha o valor dos segredos criptografados no dispositivo principal.

Um ARN secreto do Secrets Manager, ou * para permitir acesso a todos os segredos.

Exemplos de políticas de autorização

Você pode consultar o exemplo de política de autorização a seguir para ajudá-lo a configurar políticas de autorização para seus componentes.

exemplo Exemplo de política de autorização

O exemplo de política de autorização a seguir permite que um componente obtenha o valor de qualquer segredo no dispositivo principal.

nota

Recomendamos que, em um ambiente de produção, você reduza o escopo da política de autorização para que o componente recupere somente os segredos que ele usa. Você pode alterar o * caractere curinga para uma lista de ARNs secretos ao implantar o componente.

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

GetSecretValue

Obtém o valor de um segredo que você armazena no dispositivo principal.

Essa operação é semelhante à operação do Secrets Manager que você pode usar para obter o valor de um segredo noNuvem AWS. Para obter mais informações, consulte GetSecretValue na Referência da API do AWS Secrets Manager.

Solicitação

A solicitação dessa operação tem os seguintes parâmetros:

secretId(Python:) secret_id

O nome do segredo a ser descoberto. Você pode especificar o Amazon Resource Name (ARN) ou o nome amigável do segredo.

versionId(Python:) version_id

(Opcional) O ID da versão a ser obtida.

Você pode especificar versionId ou versionStage.

Se você não especificar versionId ouversionStage, essa operação usará como padrão a versão com o AWSCURRENT rótulo.

versionStage(Python:) version_stage

(Opcional) O rótulo de teste da versão a ser obtida.

Você pode especificar versionId ou versionStage.

Se você não especificar versionId ouversionStage, essa operação usará como padrão a versão com o AWSCURRENT rótulo.

Resposta

A resposta dessa operação tem as seguintes informações:

secretId(Python:) secret_id

A identificação do segredo.

versionId(Python:) version_id

O ID dessa versão do segredo.

versionStage(Python:) version_stage

A lista de etiquetas de teste anexadas a esta versão do segredo.

secretValue(Python:) secret_value

O valor dessa versão do segredo. Esse objeto,SecretValue, contém as seguintes informações.

secretString(Python:) secret_string

A parte descriptografada das informações secretas protegidas que você forneceu ao Secrets Manager como uma string.

secretBinary(Python:) secret_binary

(Opcional) A parte descriptografada das informações secretas protegidas que você forneceu ao Secrets Manager como dados binários na forma de uma matriz de bytes. Essa propriedade contém os dados binários como uma string codificada em base64.

Essa propriedade não será usada se você criou o segredo no console do Secrets Manager.

Exemplos

Os exemplos a seguir demonstram como chamar essa operação no código de componente personalizado.

Java (IPC client V1)
exemplo Exemplo: Obter um valor secreto
nota

Este exemplo usa uma IPCUtils classe para criar uma conexão com o serviço AWS IoT Greengrass Core IPC. Para ter mais informações, consulte Conecte-se ao serviço AWS IoT Greengrass Core 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)
exemplo Exemplo: Obter um valor secreto
nota

Este exemplo pressupõe que você esteja usando a versão 1.5.4 ou posterior do for AWS 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
exemplo Exemplo: Obter um valor secreto
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();

Exemplos

Use os exemplos a seguir para aprender a usar o serviço IPC do gerenciador secreto em seus componentes.

Esse componente de exemplo imprime o valor de um segredo que você implanta no dispositivo principal.

Importante

Esse componente de exemplo imprime o valor de um segredo, portanto, use-o somente com segredos que armazenam dados de teste. Não use esse componente para imprimir o valor de um segredo que armazena informações importantes.

Fórmula

O exemplo de receita a seguir define um parâmetro secreto de configuração do ARN e permite que o componente obtenha o valor de qualquer segredo no dispositivo principal.

nota

Recomendamos que, em um ambiente de produção, você reduza o escopo da política de autorização para que o componente recupere somente os segredos que ele usa. Você pode alterar o * caractere curinga para uma lista de ARNs secretos ao implantar o componente.

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}"

Artefatos

O exemplo de aplicativo Python a seguir demonstra como usar o serviço IPC do gerenciador de segredos para obter o valor de um segredo no dispositivo principal.

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)

Uso

Você pode usar esse componente de exemplo com o componente gerenciador de segredos para implantar e imprimir o valor de um segredo em seu dispositivo principal.

Para criar, implantar e imprimir um segredo de teste
  1. Crie um segredo do Secrets Manager com dados de teste.

    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"}'

    Salve o ARN do segredo para usar nas etapas a seguir.

    Para obter mais informações, consulte Criação de um segredo no Guia AWS Secrets Manager do usuário.

  2. Implante o componente do gerenciador secreto (aws.greengrass.SecretManager) com a seguinte atualização de mesclagem de configuração. Especifique o ARN do segredo que você criou anteriormente.

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

    Para obter mais informações, consulte Implemente AWS IoT Greengrass componentes em dispositivos ou o comando de implantação da CLI do Greengrass.

  3. Crie e implante o componente de exemplo nesta seção com a seguinte atualização de mesclagem de configuração. Especifique o ARN do segredo que você criou anteriormente.

    { "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" ] } } } }

    Para obter mais informações, consulte Crie AWS IoT Greengrass componentes.

  4. Visualize os registros do software AWS IoT Greengrass principal para verificar se as implantações foram bem-sucedidas e veja o registro do com.example.PrintSecret componente para ver o valor secreto impresso. Para ter mais informações, consulte Monitore AWS IoT Greengrass os registros.