Recuperar valores de segredos - AWS IoT Greengrass

Recuperar valores de segredos

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 a definição de políticas de autorização, consulte Autorizar componentes a realizar operações de IPC.

As políticas de autorização do gerenciador de segredo 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ítica de autorização

Consulte o exemplo de política de autorização a seguir para 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 na Nuvem AWS. Para obter mais informações, consulte GetSecretValue na Referência de APIs do AWS Secrets Manager.

Solicitação

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

refresh (Python: refresh)

(opcional): se o segredo solicitado deve ser sincronizado com o valor mais recente do serviço AWS Secrets Manager.

Quando definido como verdadeiro, o gerenciador secreto solicitará ao serviço AWS Secrets Manager o valor mais recente do rótulo secreto especificado e retornará esse valor como resposta. Caso contrário, o valor secreto que foi armazenado localmente será retornado.

Esse parâmetro não funcionará em conjunto com o parâmetro versionId na solicitação. Esse parâmetro funciona quando usado em conjunto com o Nucleus 2.13.0 e versões posteriores.

secretId (Python: secret_id)

O nome do segredo a ser obtido. É possível especificar o nome de recurso da Amazon (ARN) ou o nome amigável do segredo.

versionId (Python: version_id)

(Opcional) O ID da versão do segredo a ser obtido.

Você pode especificar versionId ou versionStage.

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

versionStage (Python: version_stage)

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

Você pode especificar versionId ou versionStage.

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

Resposta

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

secretId (Python: secret_id)

O ID do segredo.

versionId (Python: version_id)

O ID dessa versão do segredo.

versionStage (Python: version_stage)

A lista de etiquetas de preparação anexadas a essa versão do segredo.

secretValue (Python: secret_value)

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

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 do componente personalizado.

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

Este exemplo usa uma classe IPCUtils para criar uma conexão com o serviço de IPC do AWS IoT Greengrass Core. Para ter mais informações, consulte Conecte-se ao serviço de IPC do AWS IoT Greengrass Core.

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 de segredo
nota

Este exemplo pressupõe que você esteja usando a versão 1.5.4 ou posterior do AWS IoT Device SDK para 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 de segredo
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 fórmula 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 aplicação 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. Criar 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 próximas etapas

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

  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 criado anteriormente.

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

    Para obter mais informações, consulte Implantar componentes AWS IoT Greengrass 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 criado 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 ter mais informações, consulte Criar componentes do AWS IoT Greengrass.

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