Recuperar valores secretos - AWS IoT Greengrass

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Recuperar valores secretos

Utilice el IPC servicio de administración de secretos para recuperar los valores secretos de los secretos del dispositivo principal. El componente de administrador de secretos se utiliza para implementar secretos cifrados en los dispositivos principales. A continuación, puede utilizar una IPC operación para descifrar el secreto y utilizar su valor en los componentes personalizados.

Versiones mínimas SDK

En la siguiente tabla se enumeran las versiones mínimas de las SDK para dispositivos con AWS IoT que debe utilizar para recuperar los valores secretos de los secretos del dispositivo principal.

Autorización

Para usar el administrador de secretos en un componente personalizado, debe definir políticas de autorización que permitan a su componente obtener el valor de los secretos que almacena en el dispositivo principal. Para obtener información sobre cómo definir las políticas de autorización, consulteAutorice a los componentes a realizar operaciones IPC.

Las políticas de autorización del administrador secreto tienen las siguientes propiedades.

IPCidentificador de servicio: aws.greengrass.SecretManager

Operación Descripción Recursos

aws.greengrass#GetSecretValue o *

Permite que un componente obtenga el valor de los secretos que están cifrados en el dispositivo principal.

Un secreto de ARN Secrets Manager o * para permitir el acceso a todos los secretos.

Ejemplos de políticas de autorización

Puede hacer referencia al siguiente ejemplo de política de autorización para ayudarle a configurar las políticas de autorización para sus componentes.

ejemplo Ejemplo de política de autorización

El siguiente ejemplo de política de autorización permite a un componente obtener el valor de cualquier secreto del dispositivo principal.

nota

En un entorno de producción, se recomienda reducir el alcance de la política de autorización para que el componente recupere solo los secretos que utiliza. Puede cambiar el * comodín por una lista de secretos ARNs al implementar el componente.

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

GetSecretValue

Obtiene el valor de un secreto que se almacena en el dispositivo principal.

Esta operación es similar a la operación Secrets Manager, que puede utilizar para obtener el valor de un secreto en Nube de AWS. Para obtener más información, consulte GetSecretValuela AWS Secrets Manager APIReferencia.

Solicitud

La solicitud de esta operación tiene los siguientes parámetros:

refresh(Python:refresh)

(opcional): si se debe sincronizar el secreto solicitado con su último valor del AWS Secrets Manager servicio.

Si se establece en true, el administrador de secretos solicitará al AWS Secrets Manager servicio el valor más reciente de la etiqueta secreta especificada y devolverá ese valor como respuesta. De lo contrario, se devolverá el valor secreto que estaba almacenado localmente.

Este parámetro no funcionará junto con el versionId parámetro de la solicitud.

secretId(Python:secret_id)

El nombre del secreto que hay que obtener. Puede especificar el nombre del recurso de Amazon (ARN) o el nombre descriptivo del secreto.

versionId(Python:version_id)

(Opcional) El ID de la versión que se va a obtener.

Puede especificar versionId o versionStage.

Si no se especifica versionId oversionStage, esta operación toma como valor predeterminado la versión con la AWSCURRENT etiqueta.

versionStage(Python:version_stage)

(Opcional) La etiqueta provisional de la versión que se va a obtener.

Puede especificar versionId o versionStage.

Si no especifica versionId oversionStage, esta operación toma como valor predeterminado la versión con la AWSCURRENT etiqueta.

Respuesta

La respuesta de esta operación contiene la siguiente información:

secretId(Python:secret_id)

El ID del secreto.

versionId(Python:version_id)

El ID de esta versión del secreto.

versionStage(Python:version_stage)

La lista de etiquetas de puesta en escena adjunta a esta versión del secreto.

secretValue(Python:secret_value)

El valor de esta versión del secreto. Este objeto,SecretValue, contiene la siguiente información.

secretString(Python:secret_string)

La parte descifrada de la información secreta protegida que proporcionaste a Secrets Manager en forma de cadena.

secretBinary(Python:secret_binary)

(Opcional) La parte descifrada de la información secreta protegida que proporcionó a Secrets Manager como datos binarios en forma de matriz de bytes. Esta propiedad contiene los datos binarios como una cadena codificada en base64.

Esta propiedad no se utiliza si ha creado el secreto en la consola de Secrets Manager.

Ejemplos

Los siguientes ejemplos muestran cómo llamar a esta operación en un código de componente personalizado.

Java (IPC client V1)
ejemplo Ejemplo: obtener un valor secreto
nota

En este ejemplo, se utiliza una IPCUtils clase para crear una conexión con el IPC servicio AWS IoT Greengrass principal. Para obtener más información, consulte Conéctese al IPC servicio AWS IoT Greengrass principal.

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)
ejemplo Ejemplo: obtener un valor secreto
nota

En este ejemplo se supone que está utilizando la versión 1.5.4 o posterior de SDK para dispositivos con AWS IoT 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
ejemplo Ejemplo: obtener un 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();

Ejemplos

Utilice los siguientes ejemplos para aprender a utilizar el IPC servicio de administrador secreto en sus componentes.

Este componente de ejemplo imprime el valor de un secreto que se implementa en el dispositivo principal.

importante

Este componente de ejemplo imprime el valor de un secreto, así que utilícelo solo con los secretos que almacenan datos de prueba. No utilice este componente para imprimir el valor de un secreto que almacena información importante.

Receta

La siguiente receta de ejemplo define un parámetro de ARN configuración secreto y permite que el componente obtenga el valor de cualquier secreto del dispositivo principal.

nota

En un entorno de producción, se recomienda reducir el alcance de la política de autorización para que el componente recupere solo los secretos que utiliza. Puede cambiar el * comodín por una lista de secretos ARNs al implementar el 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}"

Artefactos

El siguiente ejemplo de aplicación de Python muestra cómo utilizar el IPC servicio de administrador de secretos para obtener el valor de un secreto en el 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

Puede usar este componente de ejemplo con el componente de administrador de secretos para implementar e imprimir el valor de un secreto en su dispositivo principal.

Para crear, implementar e imprimir un secreto de prueba
  1. Crea un secreto de Secrets Manager con los datos de las pruebas.

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

    ARNGuarde el secreto para usarlo en los siguientes pasos.

    Para obtener más información, consulte Creación de un secreto en la Guía del AWS Secrets Manager usuario.

  2. Implemente el componente de administrador de secretos (aws.greengrass.SecretManager) con la siguiente actualización de combinación de configuraciones. Especifique ARN el secreto que creó anteriormente.

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

    Para obtener más información, consulte Implemente AWS IoT Greengrass componentes en los dispositivos o el comando de CLIdespliegue de Greengrass.

  3. Cree e implemente el componente de ejemplo de esta sección con la siguiente actualización de combinación de configuraciones. Especifique ARN el secreto que creó 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 obtener más información, consulte Crear AWS IoT Greengrass componentes

  4. Consulte los registros del software AWS IoT Greengrass principal para comprobar que las implementaciones se han realizado correctamente y consulte el registro de com.example.PrintSecret componentes para ver impreso el valor secreto. Para obtener más información, consulte Supervisar AWS IoT Greengrass registros.