Recupere 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.

Recupere valores secretos

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

Versiones mínimas de SDK

En la siguiente tabla, se enumeran las versiones mínimas de SDK para dispositivos con AWS IoT que debe utilizar para recuperar los valores ocultos 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, consulte Autorización de los componentes para realizar operaciones de IPC.

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

Identificador de servicio IPC: aws.greengrass.SecretManager

Operación Descripción Recursos

aws.greengrass#GetSecretValue or *

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

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

Ejemplos de políticas de autorización

Puede consultar el siguiente ejemplo de política de autorización con el fin de 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 ARN secretos cuando implementa 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 de Secrets Manager, que puede utilizar para obtener el valor de un secreto en Nube de AWS. Para obtener más información, consulte GetNamespace en la Referencia de la API de AWS Secrets Manager.

Solicitud

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

refresh (Python: refresh)

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

Si se establece en verdadero, el administrador de secreto solicitará al servicio de AWS Secrets Manager 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 parámetro versionId en la solicitud. Este parámetro funciona cuando se utiliza junto con la versión 2.13.0 y posteriores del núcleo.

secretId (Python: secret_id)

El nombre del secreto que se obtendrá. Puede especificar el Nombre de recurso de Amazon (ARN) o el nombre fácil de recordar del secreto.

versionId (Python: version_id)

(Opcional) El ID de versión que se obtendrá.

Puede especificar versionId o versionStage.

Si no especifica versionId o versionStage, esta operación se establece de forma predeterminada en la versión con la etiqueta AWSCURRENT.

versionStage (Python: version_stage)

(Opcional) La etiqueta de fase de la versión que se obtendrá.

Puede especificar versionId o versionStage.

Si no especifica versionId o versionStage, esta operación se establece de forma predeterminada en la versión con la etiqueta AWSCURRENT.

Respuesta

Esta respuesta de 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 fase adjunta a la 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 proporcionó 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 creó el secreto en la consola de Secrets Manager.

Ejemplos

En los ejemplos siguientes, se muestra cómo llamar a esta operación en código de componente personalizado.

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

En este ejemplo, se utiliza una clase IPCUtils para crear una conexión con el servicio AWS IoT Greengrass Core IPC. Para obtener más información, consulte Conexión al servicio de IPC de 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)
ejemplo Ejemplo: obtener un valor secreto
nota

En este ejemplo se supone que está utilizando la versión 1.5.4 o posterior del SDK para dispositivos con AWS IoT para Python versión 2.

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 servicio IPC del administrador de secretos 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.

Recipe

La siguiente receta de ejemplo define un parámetro de configuración de ARN oculto 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 ARN secretos cuando implementa 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 demuestra cómo utilizar el servicio IPC del 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.

Cómo crear, implementar e imprimir un secreto de prueba
  1. Crear un secreto en Secrets Manager con datos de prueba.

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

    Guarde el ARN del secreto para utilizarlo en los pasos siguientes.

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

  2. Implemente el componente de administrador de secretos (aws.greengrass.SecretManager) con la siguiente actualización de combinación de configuraciones. Especifique el ARN del 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 implementación de la CLI 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 el ARN del 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 Creación de componentes de AWS IoT Greengrass

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