Recupera valori segreti - AWS IoT Greengrass

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Recupera valori segreti

Utilizza il servizio IPC di gestione dei segreti per recuperare i valori segreti dai segreti sul dispositivo principale. Utilizzi il componente secret manager per distribuire segreti crittografati sui dispositivi principali. Quindi, puoi utilizzare un'operazione IPC per decrittografare il segreto e utilizzarne il valore nei componenti personalizzati.

Versioni SDK minime

La tabella seguente elenca le versioni minime di da utilizzare per recuperare i valori segreti dai segreti sul dispositivo principale. SDK per dispositivi AWS IoT

Autorizzazione

Per utilizzare il gestore segreto in un componente personalizzato, è necessario definire politiche di autorizzazione che consentano al componente di ottenere il valore dei segreti archiviati sul dispositivo principale. Per informazioni sulla definizione delle politiche di autorizzazione, vedereAutorizza i componenti a eseguire operazioni IPC.

Le politiche di autorizzazione per il gestore segreto hanno le seguenti proprietà.

Identificatore del servizio IPC: aws.greengrass.SecretManager

Operazione Descrizione Risorse

aws.greengrass#GetSecretValue o *

Consente a un componente di ottenere il valore dei segreti crittografati sul dispositivo principale.

Un ARN segreto di Secrets Manager o * per consentire l'accesso a tutti i segreti.

Esempi di politiche di autorizzazione

È possibile fare riferimento al seguente esempio di politica di autorizzazione per configurare le politiche di autorizzazione per i componenti.

Esempio di politica di autorizzazione

Il seguente esempio di politica di autorizzazione consente a un componente di ottenere il valore di qualsiasi segreto sul dispositivo principale.

Nota

In un ambiente di produzione, si consiglia di ridurre l'ambito della politica di autorizzazione, in modo che il componente recuperi solo i segreti che utilizza. È possibile modificare il carattere * jolly in un elenco di ARN segreti quando si distribuisce il componente.

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

GetSecretValue

Ottiene il valore di un segreto archiviato nel dispositivo principale.

Questa operazione è simile all'operazione Secrets Manager che è possibile utilizzare per ottenere il valore di un segreto inCloud AWS. Per ulteriori informazioni, consulta GetSecretValue nella documentazione di riferimento dell'API AWS Secrets Manager.

Richiesta

La richiesta di questa operazione ha i seguenti parametri:

secretId(Python:) secret_id

Il nome del segreto da ottenere. Puoi specificare l'Amazon Resource Name (ARN) o il nome descrittivo del segreto.

versionId(Python:) version_id

(Facoltativo) L'ID della versione da ottenere.

È possibile specificare versionId o versionStage.

Se non specifichi versionId oversionStage, per impostazione predefinita per questa operazione viene utilizzata la versione con l'AWSCURRENTetichetta.

versionStage(Python:) version_stage

(Facoltativo) L'etichetta temporanea della versione da scaricare.

È possibile specificare versionId o versionStage.

Se non specifichi versionId oversionStage, per impostazione predefinita per questa operazione viene utilizzata la versione con l'etichetta. AWSCURRENT

Risposta

La risposta di questa operazione contiene le seguenti informazioni:

secretId(Python:) secret_id

L'ID del segreto.

versionId(Python:) version_id

L'ID di questa versione del segreto.

versionStage(Python:) version_stage

L'elenco delle etichette di staging allegate a questa versione del segreto.

secretValue(Python:) secret_value

Il valore di questa versione del segreto. Questo oggetto contiene SecretValue le seguenti informazioni.

secretString(Python:) secret_string

La parte decrittografata delle informazioni segrete protette che hai fornito a Secrets Manager come stringa.

secretBinary(Python:) secret_binary

(Facoltativo) La parte decrittografata delle informazioni segrete protette fornite a Secrets Manager come dati binari sotto forma di matrice di byte. Questa proprietà contiene i dati binari sotto forma di stringa con codifica Base64.

Questa proprietà non viene utilizzata se hai creato il segreto nella console Secrets Manager.

Esempi

Gli esempi seguenti mostrano come chiamare questa operazione nel codice componente personalizzato.

Java (IPC client V1)
Esempio: ottieni un valore segreto
Nota

Questo esempio utilizza una IPCUtils classe per creare una connessione al servizio AWS IoT Greengrass Core IPC. Per ulteriori informazioni, consulta Connect al IPC servizio 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)
Esempio: ottieni un valore segreto
Nota

Questo esempio presuppone che si stia utilizzando la versione 1.5.4 o successiva di for SDK per dispositivi AWS IoT 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
Esempio: ottieni un valore segreto
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();

Esempi

Utilizza i seguenti esempi per imparare a utilizzare il servizio IPC di gestione segreta nei tuoi componenti.

Questo componente di esempio stampa il valore di un segreto che viene distribuito sul dispositivo principale.

Importante

Questo componente di esempio stampa il valore di un segreto, quindi usalo solo con i segreti che memorizzano i dati di test. Non utilizzate questo componente per stampare il valore di un segreto che memorizza informazioni importanti.

Recipe

La seguente ricetta di esempio definisce un parametro di configurazione ARN segreto e consente al componente di ottenere il valore di qualsiasi segreto sul dispositivo principale.

Nota

In un ambiente di produzione, si consiglia di ridurre l'ambito della politica di autorizzazione, in modo che il componente recuperi solo i segreti che utilizza. È possibile modificare il carattere * jolly in un elenco di ARN segreti quando si distribuisce il 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}"

Artifacts

L'esempio seguente di applicazione Python dimostra come utilizzare il servizio IPC del gestore segreto per ottenere il valore di un segreto sul dispositivo principale.

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)

Utilizzo

È possibile utilizzare questo componente di esempio con il componente secret manager per distribuire e stampare il valore di un segreto sul dispositivo principale.

Per creare, distribuire e stampare un segreto di test
  1. Crea un segreto di Secrets Manager con i dati di test.

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

    Salva l'ARN del segreto da utilizzare nei passaggi seguenti.

    Per ulteriori informazioni, consulta Creazione di un segreto nella Guida per l'AWS Secrets Managerutente.

  2. Distribuite il componente secret manager (aws.greengrass.SecretManager) con il seguente aggiornamento di fusione della configurazione. Specificate l'ARN del segreto che avete creato in precedenza.

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

    Per ulteriori informazioni, consulta Implementazione AWS IoT Greengrass dei componenti sui dispositivi o il comando di distribuzione della CLI di Greengrass.

  3. Crea e distribuisci il componente di esempio in questa sezione con il seguente aggiornamento di configurazione merge. Specificate l'ARN del segreto che avete creato in precedenza.

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

    Per ulteriori informazioni, consultare Crea AWS IoT Greengrass componenti

  4. Visualizza i log del software AWS IoT Greengrass Core per verificare che le distribuzioni abbiano esito positivo e visualizza il registro dei com.example.PrintSecret componenti per vedere il valore segreto stampato. Per ulteriori informazioni, consulta Monitora AWS IoT Greengrass i registri.