0Pricing
Cloud & IT Cert Prep · Lezione

Secrets Manager e Parameter Store

Ruotare automaticamente le credenziali dei database con Secrets Manager, archiviare la configurazione non segreta in Parameter Store e integrare entrambi con Lambda ed ECS

Secrets Manager e Parameter Store è una lezione Cloud & IT Cert Prep gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Cloud & IT Cert Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Cloud & IT Cert Prep include 4 lezioni in totale.

Il problema dei segreti nel codice

Un anti-pattern comune e pericoloso consiste nell'archiviare segreti (password di database, chiavi API, token OAuth) nel codice sorgente dell'applicazione, nelle variabili d'ambiente o nei file di configurazione inseriti nel controllo versione. Quando questi repository vengono esposti — perché resi pubblici accidentalmente o perché vi accede un attaccante — tutti i segreti vengono immediatamente compromessi. AWS offre due servizi gestiti per eliminare questo problema: AWS Secrets Manager per le credenziali che richiedono la rotazione automatica e AWS Systems Manager Parameter Store per i valori di configurazione e i segreti che non richiedono rotazione.

# Anti-pattern: secrets in code (NEVER do this)
# db_password = 'supersecret123'
# api_key = 'sk-abc123def456'

# Best practice: retrieve at runtime
import boto3

client = boto3.client('secretsmanager', region_name='us-east-1')
response = client.get_secret_value(SecretId='prod/myapp/db-password')
password = response['SecretString']  # fresh value, always current

Panoramica di AWS Secrets Manager

AWS Secrets Manager è un servizio gestito per archiviare, recuperare e ruotare automaticamente i segreti. Crittografa tutti i segreti con KMS (utilizzando per impostazione predefinita una chiave gestita da AWS o la Sua CMK). I segreti possono contenere dati strutturati di qualsiasi tipo sotto forma di stringa JSON chiave-valore. Secrets Manager costa 0,40 $ per segreto al mese, oltre a 0,05 $ ogni 10.000 chiamate API. La differenza principale rispetto a Parameter Store è la rotazione automatica integrata per RDS, Redshift, DocumentDB e segreti personalizzati tramite funzioni Lambda di rotazione: durante la rotazione non sono necessarie modifiche all'applicazione.

# Create a secret in Secrets Manager
aws secretsmanager create-secret \
  --name 'prod/myapp/database' \
  --description 'Production MySQL credentials' \
  --secret-string '{"username":"admin","password":"changeme123","host":"mydb.rds.amazonaws.com","port":3306,"dbname":"orders"}'

# Retrieve the secret (by application)
aws secretsmanager get-secret-value \
  --secret-id 'prod/myapp/database' \
  --query 'SecretString' \
  --output text | python3 -c 'import sys,json; s=json.load(sys.stdin); print(s["password"])'

Rotazione automatica con Secrets Manager

La rotazione automatica è la funzionalità più potente di Secrets Manager. Per i database RDS, Secrets Manager ruota nativamente le password: 1) genera una nuova password; 2) aggiorna la password dell'utente del database in RDS; 3) aggiorna il segreto con la nuova password; 4) verifica che le nuove credenziali funzionino. Tutto questo avviene mentre l'applicazione è in esecuzione: nessun downtime e nessun intervento manuale. Le applicazioni chiamano sempre get-secret-value per recuperare la password corrente, quindi utilizzano automaticamente le credenziali ruotate.

# Enable automatic rotation for RDS secret
aws secretsmanager rotate-secret \
  --secret-id 'prod/myapp/database' \
  --rotation-rules AutomaticallyAfterDays=30 \
  --rotation-lambda-arn arn:aws:lambda:us-east-1:123:function:SecretsManagerRDSMySQLRotationSingleUser

# AWS provides pre-built rotation Lambda functions for:
# - RDS MySQL/PostgreSQL/MariaDB/Oracle/SQL Server
# - DocumentDB
# - Redshift
# - Custom: write your own Lambda for other services

# Application code: always call GetSecretValue, never cache long-term

Memorizzazione locale dei segreti nella cache

Chiamare Secrets Manager per ogni query al database sarebbe costoso e lento. La best practice consiste nel memorizzare nella cache il segreto localmente, in memoria, per un breve periodo. AWS fornisce client ufficiali di caching di Secrets Manager per Java e Python, che memorizzano i segreti nella cache per un TTL configurabile. Quando la cache scade, il client recupera nuovamente il segreto da Secrets Manager. Se un'applicazione riceve un errore di autenticazione, a indicare che la password è stata ruotata, aggiorna immediatamente la cache e riprova. Questo pattern garantisce prestazioni e dati aggiornati senza sovraccaricare l'API di Secrets Manager.

# Python: Secrets Manager caching client
# pip install aws-secretsmanager-caching

from botocore.session import get_session
from aws_secretsmanager_caching import SecretCache, SecretCacheConfig

client = get_session().create_client('secretsmanager')
cache = SecretCache(
    config=SecretCacheConfig(secret_refresh_interval=3600),  # cache 1 hour
    client=client
)

# Returns cached value unless refresh interval expired
secret = cache.get_secret_string('prod/myapp/database')

AWS Systems Manager Parameter Store

AWS Systems Manager (SSM) Parameter Store è un archivio gerarchico di coppie chiave-valore, gratuito per i parametri standard, destinato ai dati di configurazione e ai segreti. Supporta i tipi di parametro String, StringList e SecureString. SecureString crittografa i valori con KMS. A differenza di Secrets Manager, Parameter Store NON supporta la rotazione automatica: è progettato per valori di configurazione che cambiano raramente. I parametri standard sono gratuiti e possono contenere fino a 4 KB. I parametri avanzati supportano valori più grandi, fino a 8 KB, policy dei parametri, come scadenze e promemoria per la rotazione, e hanno un costo di 0,05 USD per parametro al mese.

# Create Parameter Store parameters
aws ssm put-parameter \
  --name '/prod/myapp/db-host' \
  --value 'mydb.cluster-abc.us-east-1.rds.amazonaws.com' \
  --type String

aws ssm put-parameter \
  --name '/prod/myapp/db-password' \
  --value 'mysecretpassword' \
  --type SecureString \
  --key-id alias/my-kms-key

# Retrieve parameter
aws ssm get-parameter \
  --name '/prod/myapp/db-password' \
  --with-decryption \
  --query 'Parameter.Value' --output text

Gerarchia di Parameter Store e IAM

Organizzi i valori di Parameter Store utilizzando una struttura gerarchica dei percorsi che rispecchi l'ambiente e l'architettura dell'applicazione. Questo consente di creare policy IAM granulari che concedono l'accesso ai parametri in base al prefisso del percorso. Ad esempio, può concedere a una funzione Lambda l'accesso esclusivamente ai parametri sotto /prod/payment-service/: non potrà accedere ai parametri di altri servizi. Questo principio del privilegio minimo applicato alla configurazione impedisce a un servizio compromesso di leggere i segreti di un altro servizio.

# Parameter hierarchy
/prod/payment-service/db-password
/prod/payment-service/stripe-api-key
/prod/order-service/db-password
/prod/order-service/redis-url
/staging/payment-service/db-password

# IAM policy: payment-service Lambda can ONLY read its params
{
  'Effect': 'Allow',
  'Action': ['ssm:GetParameter', 'ssm:GetParameters', 'ssm:GetParametersByPath'],
  'Resource': 'arn:aws:ssm:us-east-1:123:parameter/prod/payment-service/*'
}

# Get all parameters for an app at once
aws ssm get-parameters-by-path \
  --path '/prod/payment-service/' \
  --with-decryption --recursive

Secrets Manager e Parameter Store: quando utilizzare ciascuno

Scelga tra i due servizi in base ai requisiti: utilizzi Secrets Manager quando: è necessaria la rotazione automatica dei segreti; sta memorizzando credenziali di database; il segreto deve essere condiviso tra più account AWS; oppure la conformità richiede policy di rotazione documentate. Utilizzi Parameter Store quando: sono necessari valori di configurazione non segreti; desidera una soluzione gratuita per una semplice memorizzazione di coppie chiave-valore; è necessaria una configurazione gerarchica con controllo degli accessi basato sui percorsi; oppure deve memorizzare la cronologia delle versioni dei parametri. Molte architetture utilizzano entrambi: Parameter Store per la configurazione e Secrets Manager per le credenziali.

# Usage comparison:
# Secrets Manager:
#   Cost: $0.40/secret/month
#   Rotation: Automatic (RDS, custom Lambda)
#   Cross-account: Yes
#   Best for: Database passwords, API keys, OAuth tokens

# Parameter Store:
#   Cost: Free (standard) / $0.05/month (advanced)
#   Rotation: Manual only
#   Cross-account: No (use Secrets Manager)
#   Best for: Config values, feature flags, non-rotating secrets

Integrazione con Lambda ed ECS

Le funzioni Lambda e i task ECS dovrebbero recuperare i segreti all'avvio, non a ogni invocazione. Per Lambda: recuperi i segreti nel codice di inizializzazione, all'esterno della funzione handler, e li memorizzi nella cache in variabili globali. L'ambiente di esecuzione Lambda persiste tra un'invocazione e l'altra, quindi i segreti vengono recuperati una sola volta per tutta la durata dell'ambiente. Per ECS: utilizzi il campo secrets nella definizione del task per iniettare i valori di Secrets Manager o i valori SecureString di Parameter Store come variabili d'ambiente. ECS li recupera e li inietta all'avvio del task, senza richiedere modifiche al codice dell'applicazione.

# ECS task definition: inject secret as environment variable
{
  'containerDefinitions': [{
    'name': 'api',
    'image': 'my-api:latest',
    'secrets': [
      {
        'name': 'DB_PASSWORD',
        'valueFrom': 'arn:aws:secretsmanager:us-east-1:123:secret:prod/myapp/database:password::'
      },
      {
        'name': 'API_KEY',
        'valueFrom': '/prod/myapp/api-key'
      }
    ]
  }]
}
# Application reads DB_PASSWORD from env var
# ECS injects the current secret value at task start

Parameter Store per gli ID AMI

Un uso pratico, ma spesso trascurato, di Parameter Store consiste nel memorizzare gli ID AMI e altri riferimenti al deployment. Invece di inserire gli ID AMI direttamente nei template CloudFormation, che diventano obsoleti quando vengono rilasciate nuove AMI, faccia riferimento a un valore di Parameter Store. La pipeline CI/CD aggiorna l'ID AMI in Parameter Store ogni volta che viene creata una nuova AMI golden. CloudFormation legge l'ID AMI più recente da Parameter Store al momento del deployment. AWS pubblica inoltre gli ID AMI più recenti di Amazon Linux in percorsi pubblici di Parameter Store a cui è possibile fare riferimento direttamente.

# Get AWS public AMI ID from Parameter Store
aws ssm get-parameter \
  --name '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64' \
  --query 'Parameter.Value' --output text

# CloudFormation: reference public AMI parameter
Parameters:
  LatestAmiId:
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64'

Resources:
  MyEC2:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref LatestAmiId

Audit e conformità per i segreti

La governance dei segreti richiede di sapere chi vi ha avuto accesso e quando. AWS CloudTrail registra ogni chiamata API a Secrets Manager e Parameter Store: GetSecretValue, PutParameter, GetParameter. Questo fornisce una traccia di audit completa ai fini della conformità. Utilizzi CloudWatch Alarms sulle metriche di CloudTrail per ricevere avvisi quando i segreti vengono consultati in circostanze non usuali: ad esempio, se un segreto di produzione viene consultato da un principal IAM insolito o da un IP non incluso nell'intervallo noto, generi un avviso per avviare un'indagine.

# CloudTrail metric filter: alert on unexpected secret access
aws logs put-metric-filter \
  --log-group-name CloudTrail/management-events \
  --filter-name 'SecretAccessOutsideHours' \
  --filter-pattern '{ $.eventSource = "secretsmanager.amazonaws.com" && $.eventName = "GetSecretValue" && $.userAgent != "lambda.amazonaws.com" }' \
  --metric-transformations \
    metricName=UnexpectedSecretAccess,metricNamespace=Security,metricValue=1

# Then create CloudWatch alarm on this metric
# Alert fires when non-Lambda principal accesses secrets

Condivisione dei segreti tra account

Nelle architetture con più account, le applicazioni di un account devono talvolta utilizzare segreti gestiti in un altro account, ad esempio quando un account Security centrale gestisce tutte le password RDS. Le policy delle risorse di Secrets Manager consentono l'accesso tra account. Configuri una policy basata sulle risorse del segreto che conceda a un ruolo nell'account utilizzatore l'autorizzazione a chiamare GetSecretValue. Il ruolo dell'account utilizzatore deve disporre anche di una policy IAM che consenta le chiamate all'ARN del segreto. Le policy della chiave KMS devono inoltre concedere all'account utilizzatore l'accesso alla CMK utilizzata per crittografare il segreto.

# Secret resource policy: allow cross-account access
aws secretsmanager put-resource-policy \
  --secret-id 'prod/shared/rds-password' \
  --resource-policy '{
    "Statement": [{
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::999999999999:role/AppRole"
      },
      "Action": "secretsmanager:GetSecretValue",
      "Resource": "*"
    }]
  }'

# KMS key policy must also allow account 999999999999
# IAM policy in 999999999999 must allow GetSecretValue on ARN

Verifica rapida

Verifichi la sua comprensione dei concetti di AWS Solutions Architect (SAA-C03) trattati in questa lezione.

Riepilogo della lezione

In questa lezione ha imparato che: Secrets Manager fornisce la rotazione automatica delle credenziali dei database e delle chiavi API ed è la scelta preferita per i segreti che devono essere ruotati; Parameter Store offre una memorizzazione gerarchica e gratuita della configurazione, con controllo degli accessi IAM basato sui percorsi; inoltre, ECS e Lambda possono iniettare i segreti come variabili d'ambiente senza modifiche al codice dell'applicazione. CloudTrail fornisce tracce di audit per tutti gli accessi ai segreti. Nella prossima lezione esploreremo WAF, Shield e Network Firewall.

Domande Frequenti

La lezione «Secrets Manager e Parameter Store» è gratuita?

Sì — il testo completo di «Secrets Manager e Parameter Store» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Cloud & IT Cert Prep, passa a CoddyKit PRO. Il corso Cloud & IT Cert Prep include 4 lezioni in totale.

Cosa imparerò in «Secrets Manager e Parameter Store»?

Ruotare automaticamente le credenziali dei database con Secrets Manager, archiviare la configurazione non segreta in Parameter Store e integrare entrambi con Lambda ed ECS Eserciti Cloud & IT Cert Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Cloud & IT Cert Prep?

Non è richiesta alcuna esperienza precedente. Cloud & IT Cert Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Secrets Manager e Parameter Store»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Cloud & IT Cert Prep?

Sì. Ogni lezione Cloud & IT Cert Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. KMS, ACM e pattern di crittografia
  2. GuardDuty, Inspector e Macie
  3. Secrets Manager e Parameter Store
  4. WAF, Shield e Network Firewall
← Torna a Cloud & IT Cert Prep