AWS Secrets Manager Agente - AWS Secrets Manager

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

AWS Secrets Manager Agente

Il AWS Secrets Manager Agent è un HTTP servizio lato client che è possibile utilizzare per standardizzare il consumo dei segreti di Secrets Manager in ambienti come AWS Lambda, Amazon Elastic Container Service, Amazon Elastic Kubernetes Service e Amazon Elastic Compute Cloud. L'agente Secrets Manager può recuperare e memorizzare nella cache i segreti in memoria in modo che le applicazioni possano utilizzare i segreti direttamente dalla cache. Ciò significa che puoi recuperare i segreti di cui la tua applicazione ha bisogno dal localhost invece di effettuare chiamate a Secrets Manager. L'agente Secrets Manager può solo effettuare richieste di lettura a Secrets Manager e non può modificare i segreti.

L'agente Secrets Manager utilizza il AWS credenziali fornite nel proprio ambiente per effettuare chiamate a Secrets Manager. L'agente Secrets Manager offre protezione contro Server Side Request Forgery (SSRF) per contribuire a migliorare la sicurezza segreta. È possibile configurare l'agente Secrets Manager impostando il numero massimo di connessioni, il time to live (TTL), la HTTP porta localhost e la dimensione della cache.

Poiché Secrets Manager Agent utilizza una cache in memoria, si ripristina al riavvio di Secrets Manager Agent. L'agente Secrets Manager aggiorna periodicamente il valore segreto memorizzato nella cache. L'aggiornamento avviene quando si tenta di leggere un segreto dall'agente Secrets Manager dopo TTL la scadenza. La frequenza di aggiornamento predefinita (TTL) è 300 secondi ed è possibile modificarla utilizzando una frequenza File di configurazione che si passa all'agente Secrets Manager utilizzando l'argomento della --config riga di comando. L'agente Secrets Manager non include l'invalidazione della cache. Ad esempio, se un segreto ruota prima della scadenza della voce della cache, l'agente Secrets Manager potrebbe restituire un valore segreto non aggiornato.

L'agente Secrets Manager restituisce valori segreti nello stesso formato della risposta diGetSecretValue. I valori segreti non sono crittografati nella cache.

Per scaricare il codice sorgente, vedi https://github.com/aws/aws-secretsmanager-agentsu GitHub.

Fase 1: Creare il file binario dell'agente Secrets Manager

Per creare il binario Secrets Manager Agent in modo nativo, sono necessari gli strumenti di sviluppo standard e gli strumenti Rust. In alternativa, puoi eseguire la compilazione incrociata per i sistemi che la supportano oppure puoi usare Rust cross per la compilazione incrociata.

RPM-based systems
  1. Su sistemi RPM basati come AL2 023, è possibile installare gli strumenti di sviluppo utilizzando il gruppo Development Tools.

    sudo yum -y groupinstall "Development Tools"
  2. Segui le istruzioni riportate in Install Rust nella documentazione di Rust.

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh . "$HOME/.cargo/env"
  3. Crea l'agente usando il comando cargo build:

    cargo build --release

    Troverai l'eseguibile sottotarget/release/aws-secrets-manager-agent.

Debian-based systems
  1. Su sistemi basati su Debian come Ubuntu, è possibile installare gli strumenti di sviluppo utilizzando il pacchetto build-essential.

    sudo apt install build-essential
  2. Segui le istruzioni su Install Rust nella documentazione di Rust.

    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh . "$HOME/.cargo/env"
  3. Crea l'agente usando il comando cargo build:

    cargo build --release

    Troverai l'eseguibile sottotarget/release/aws-secrets-manager-agent.

Windows

Per creare su Windows, segui le istruzioni in Configurare l'ambiente di sviluppo su Windows per Rust nella documentazione di Microsoft Windows.

Cross-compile natively

Nelle distribuzioni in cui è disponibile il pacchetto mingw-w64, come Ubuntu, puoi eseguire la compilazione incrociata in modo nativo.

# Install the cross compile tool chain sudo add-apt-repository universe sudo apt install -y mingw-w64 # Install the rust build targets rustup target add x86_64-pc-windows-gnu # Cross compile the agent for Windows cargo build --release --target x86_64-pc-windows-gnu

L'eseguibile è disponibile all'indirizzo. target/x86_64-pc-windows-gnu/release/aws-secrets-manager-agent.exe

Cross compile with Rust cross

Se gli strumenti di compilazione incrociata non sono disponibili in modo nativo sul sistema, puoi usare il progetto Rust cross. Per ulteriori informazioni, consulta https://github.com/cross-rs/ cross.

Importante

Consigliamo 32 GB di spazio su disco per l'ambiente di compilazione.

# Install and start docker sudo yum -y install docker sudo systemctl start docker sudo systemctl enable docker # Make docker start after reboot # Give ourselves permission to run the docker images without sudo sudo usermod -aG docker $USER newgrp docker # Install cross and cross compile the executable cargo install cross cross build --release --target x86_64-pc-windows-gnu

Fase 2: Installare l'agente Secrets Manager

In base al tipo di elaborazione, sono disponibili diverse opzioni per l'installazione dell'agente Secrets Manager.

Amazon EKS, Amazon EC2, and Amazon ECS
Per installare l'agente Secrets Manager
  1. Usa lo install script fornito nel repository.

    Lo script genera un SSRF token casuale all'avvio e lo memorizza nel file/var/run/awssmatoken. Il token è leggibile dal awssmatokenreader gruppo creato dallo script di installazione.

  2. Per consentire all'applicazione di leggere il file del token, è necessario aggiungere al awssmatokenreader gruppo l'account utente con cui viene eseguita l'applicazione. Ad esempio, potete concedere all'applicazione le autorizzazioni per leggere il file del token con il seguente comando usermod, dove <APP_USER> è l'ID utente con cui viene eseguita l'applicazione.

    sudo usermod -aG awssmatokenreader <APP_USER>
Docker

Puoi eseguire Secrets Manager Agent come contenitore secondario insieme all'applicazione utilizzando Docker. Quindi l'applicazione può recuperare i segreti dal HTTP server locale fornito dall'agente Secrets Manager. Per informazioni su Docker, consulta la documentazione Docker.

Per creare un contenitore sidecar per l'agente Secrets Manager con Docker
  1. Crea un Dockerfile per il contenitore sidecar Secrets Manager Agent. L'esempio seguente crea un contenitore Docker con il binario Secrets Manager Agent.

    # Use the latest Debian image as the base FROM debian:latest # Set the working directory inside the container WORKDIR /app # Copy the Secrets Manager Agent binary to the container COPY secrets-manager-agent . # Install any necessary dependencies RUN apt-get update && apt-get install -y ca-certificates # Set the entry point to run the Secrets Manager Agent binary ENTRYPOINT ["./secrets-manager-agent"]
  2. Crea un Dockerfile per la tua applicazione client.

  3. Crea un file Docker Compose per eseguire entrambi i contenitori, assicurandoti che utilizzino la stessa interfaccia di rete. Ciò è necessario perché l'agente Secrets Manager non accetta richieste dall'esterno dell'interfaccia localhost. L'esempio seguente mostra un file Docker Compose in cui la network_mode chiave collega il secrets-manager-agent contenitore allo spazio dei nomi di rete del client-application contenitore, il che consente loro di condividere la stessa interfaccia di rete.

    Importante

    È necessario caricare AWS credenziali e il SSRF token per consentire all'applicazione di utilizzare l'agente Secrets Manager. Consulta quanto segue:

    version: '3' services: client-application: container_name: client-application build: context: . dockerfile: Dockerfile.client command: tail -f /dev/null # Keep the container running secrets-manager-agent: container_name: secrets-manager-agent build: context: . dockerfile: Dockerfile.agent network_mode: "container:client-application" # Attach to the client-application container's network depends_on: - client-application
  4. Copia il file secrets-manager-agent binario nella stessa directory che contiene i file Dockerfiles e Docker Compose.

  5. Crea ed esegui i contenitori in base ai Dockerfile forniti utilizzando il seguente comando. docker-compose

    docker-compose up --build
  6. Nel contenitore del client, ora puoi utilizzare l'agente Secrets Manager per recuperare i segreti. Per ulteriori informazioni, consulta Fase 3: Recupera i segreti con l'agente Secrets Manager.

AWS Lambda

Puoi impacchettare l'agente Secrets Manager come AWS Lambda estensione. Quindi puoi aggiungerlo alla tua funzione Lambda come livello e chiamare l'agente Secrets Manager dalla tua funzione Lambda per ottenere segreti.

Le seguenti istruzioni mostrano come ottenere un nome segreto MyTest utilizzando lo script secrets-manager-agent-extension.sh di esempio https://github.com/aws/aws-secretsmanager-agentper installare l'agente Secrets Manager come estensione Lambda.

Nota

Lo script di esempio utilizza il curl comando, incluso nei runtime basati su Amazon Linux 2023 come Python 3.12 e Node.js 20. Se utilizzi un ambiente di runtime basato su Amazon Linux 2 come Python 3.11 o Node.js 18, devi prima installarlo curl nell'immagine del contenitore Lambda. Per istruzioni, consulta Come posso usare i pacchetti binari AMI nativi di Amazon Linux 2 con Lambda su AWS Re:POST.

Per creare un'estensione Lambda che racchiuda l'agente Secrets Manager
  1. Crea una funzione Lambda in Python che esegue una query http://localhost:2773/secretsmanager/get?secretId=MyTest per ottenere il segreto. Assicurati di implementare la logica dei tentativi nel codice dell'applicazione per evitare ritardi nell'inizializzazione e nella registrazione dell'estensione Lambda.

  2. Dalla radice del pacchetto di codice Secrets Manager Agent, esegui i seguenti comandi per testare l'estensione Lambda.

    AWS_ACCOUNT_ID=<AWS_ACCOUNT_ID> LAMBDA_ARN=<LAMBDA_ARN> # Build the release binary cargo build --release --target=x86_64-unknown-linux-gnu # Copy the release binary into the `bin` folder mkdir -p ./bin cp ./target/x86_64-unknown-linux-gnu/release/aws_secretsmanager_agent ./bin/secrets-manager-agent # Copy the `secrets-manager-agent-extension.sh` script into the `extensions` folder. mkdir -p ./extensions cp aws_secretsmanager_agent/examples/example-lambda-extension/secrets-manager-agent-extension.sh ./extensions # Zip the extension shell script and the binary zip secrets-manager-agent-extension.zip bin/* extensions/* # Publish the layer version LAYER_VERSION_ARN=$(aws lambda publish-layer-version \ --layer-name secrets-manager-agent-extension \ --zip-file "fileb://secrets-manager-agent-extension.zip" | jq -r '.LayerVersionArn') # Attach the layer version to the Lambda function aws lambda update-function-configuration \ --function-name $LAMBDA_ARN \ --layers "$LAYER_VERSION_ARN"
  3. Invocate la funzione Lambda per verificare che il segreto venga recuperato correttamente.

Fase 3: Recupera i segreti con l'agente Secrets Manager

Per utilizzare l'agente, si chiama l'endpoint locale dell'agente Secrets Manager e si include il nome o il segreto come parametro ARN di interrogazione. Per impostazione predefinita, l'agente Secrets Manager recupera la AWSCURRENT versione del segreto. Per recuperare una versione diversa, puoi impostare versionStage o. versionId

Per proteggere l'agente Secrets Manager, è necessario includere un'intestazione SSRF token come parte di ogni richiesta:X-Aws-Parameters-Secrets-Token. L'agente Secrets Manager nega le richieste che non hanno questa intestazione o che hanno un token non validoSSRF. È possibile personalizzare il nome dell'SSRFintestazione in. File di configurazione

L'agente Secrets Manager utilizza il AWS SDKper Rust, che utilizza la catena di provider di credenziali predefinita. L'identità di queste IAM credenziali determina le autorizzazioni di cui dispone l'agente Secrets Manager per recuperare i segreti.

Autorizzazioni richieste:

  • secretsmanager:DescribeSecret

  • secretsmanager:GetSecretValue

Per ulteriori informazioni, consulta Riferimento per le autorizzazioni.

Importante

Dopo aver inserito il valore segreto nell'agente Secrets Manager, qualsiasi utente con accesso all'ambiente di calcolo e al SSRF token può accedere al segreto dalla cache di Secrets Manager Agent. Per ulteriori informazioni, consulta Considerazioni relative alla sicurezza.

curl

Il seguente esempio curl mostra come ottenere un segreto dall'agente Secrets Manager. L'esempio si basa sul fatto che SSRF sia presente in un file, che è dove viene memorizzato dallo script di installazione.

curl -v -H \ "X-Aws-Parameters-Secrets-Token: $(</var/run/awssmatoken)" \ 'http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>}'; \ echo
Python

Il seguente esempio in Python mostra come ottenere un segreto dall'agente Secrets Manager. L'esempio si basa sul fatto che SSRF sia presente in un file, che è dove viene memorizzato dallo script di installazione.

import requests import json # Function that fetches the secret from Secrets Manager Agent for the provided secret id. def get_secret(): # Construct the URL for the GET request url = f"http://localhost:2773/secretsmanager/get?secretId=<YOUR_SECRET_ID>}" # Get the SSRF token from the token file with open('/var/run/awssmatoken') as fp: token = fp.read() headers = { "X-Aws-Parameters-Secrets-Token": token.strip() } try: # Send the GET request with headers response = requests.get(url, headers=headers) # Check if the request was successful if response.status_code == 200: # Return the secret value return response.text else: # Handle error cases raise Exception(f"Status code {response.status_code} - {response.text}") except Exception as e: # Handle network errors raise Exception(f"Error: {e}")

Configurazione dell'agente Secrets Manager

Per modificare la configurazione dell'agente Secrets Manager, crea un file di TOMLconfigurazione, quindi chiama./aws-secrets-manager-agent --config config.toml.

L'elenco seguente mostra le opzioni che è possibile configurare per l'agente Secrets Manager.

  • log_level — Il livello di dettaglio riportato nei log per l'agente Secrets Manager:DEBUG,, INFOWARN, ERROR o. NONE L'impostazione predefinita è. INFO

  • http_port — La porta per il HTTP server locale, nell'intervallo da 1024 a 65535. L'impostazione predefinita è 2773.

  • regione: AWS Regione da utilizzare per le richieste. Se non viene specificata alcuna regione, l'agente Secrets Manager determina la regione daSDK. Per ulteriori informazioni, consulta Specificare le credenziali e la regione predefinita nella AWS SDKper la Rust Developer Guide.

  • ttl_seconds — I secondi per gli elementi memorizzati TTL nella cache, compresi tra 1 e 3600. Il valore predefinito è 300. Questa impostazione non viene utilizzata se la dimensione della cache è 0.

  • cache_size — Il numero massimo di segreti che possono essere archiviati nella cache, compreso tra 0 e 1000. 0 indica che non è presente alcuna memorizzazione nella cache. Il valore predefinito è 1000.

  • ssrf_headers — Un elenco di nomi di intestazione che l'agente Secrets Manager controlla per il token. SSRF L'impostazione predefinita è «X-Aws-Parameters-Secrets-Token, X-Vault-Token».

  • ssrf_env_variables — Un elenco di nomi di variabili di ambiente che l'agente Secrets Manager controlla per il token. SSRF La variabile di ambiente può contenere il token o un riferimento al file del token come in:. AWS_TOKEN=file:///var/run/awssmatoken L'impostazione predefinita è "AWS_TOKEN, AWS_SESSION _TOKEN».

  • path_prefix — Il URI prefisso utilizzato per determinare se la richiesta è una richiesta basata sul percorso. L'impostazione predefinita è «/v1/».

  • max_conn — Il numero massimo di connessioni dai HTTP client consentito dall'agente Secrets Manager, compreso tra 1 e 1000. Il valore predefinito è 800.

Registrazione

L'agente Secrets Manager registra gli errori localmente nel filelogs/secrets_manager_agent.log. Quando l'applicazione chiama l'agente Secrets Manager per ottenere un segreto, tali chiamate vengono visualizzate nel registro locale. Non compaiono nei CloudTrail log.

L'agente Secrets Manager crea un nuovo file di registro quando il file raggiunge i 10 MB e memorizza fino a cinque file di registro in totale.

Il registro non viene inviato a Secrets Manager CloudTrail, o CloudWatch. Le richieste di ottenere segreti dall'agente Secrets Manager non vengono visualizzate in questi registri. Quando l'agente Secrets Manager effettua una chiamata a Secrets Manager per ottenere un segreto, tale chiamata viene registrata CloudTrail con una stringa agente utente contenenteaws-secrets-manager-agent.

È possibile configurare la registrazione in. File di configurazione

Considerazioni relative alla sicurezza

Per un'architettura ad agenti, il dominio di fiducia è il luogo in cui sono accessibili l'endpoint e il SSRF token dell'agente, che di solito è l'intero host. Il dominio di fiducia per l'agente Secrets Manager deve corrispondere al dominio in cui sono disponibili le credenziali di Secrets Manager per mantenere lo stesso livello di sicurezza. Ad esempio, su Amazon EC2 il dominio di fiducia per l'agente Secrets Manager sarebbe lo stesso del dominio delle credenziali quando si utilizzano i ruoli per AmazonEC2.

Le applicazioni attente alla sicurezza che non utilizzano già una soluzione agente con le credenziali di Secrets Manager bloccate sull'applicazione dovrebbero prendere in considerazione l'utilizzo delle credenziali specifiche del linguaggio AWS SDKso soluzioni di caching. Per ulteriori informazioni, consulta Ottieni segreti da AWS Secrets Manager.