0Pricing
Security+ Academy · Lezione

Gestione sicura dei segreti e variabili d'ambiente

Eviti i segreti hardcoded nel codice sorgente utilizzando secrets manager (Vault, AWS Secrets Manager) e l'iniezione delle variabili d'ambiente a runtime.

Gestione sicura dei segreti e variabili d'ambiente è una lezione Security+ Academy gratuita su CoddyKit. Questa è la lezione 2 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 Security+ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Security+ Academy include 4 lezioni in totale.

Il problema dei secret hardcoded

I secret hardcoded — chiavi API, password di database, chiavi private TLS e token OAuth incorporati direttamente nel codice sorgente — sono tra le vulnerabilità di sicurezza più comuni e più facilmente prevenibili. I secret presenti nel codice sorgente rimangono esposti nella cronologia del controllo versione (anche dopo l'eliminazione), sono visibili a tutti gli sviluppatori con accesso al repository e vengono spesso divulgati quando i repository vengono accidentalmente resi pubblici. Strumenti come GitGuardian e truffleHog eseguono scansioni continue alla ricerca di secret divulgati su piattaforme come GitHub.

# DANGEROUS: hardcoded secret in source code
# db_password = 'P@ssw0rd#2026'
# api_key = 'sk-live-abc123xyz789'
# aws_secret = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'

# These secrets are now:
# - In git history (even if later deleted)
# - Visible to all repo contributors
# - Potentially in CI/CD logs
# - Often leaked when repos go public accidentally

Variabili d'ambiente: meglio, ma non abbastanza

Le variabili d'ambiente rimuovono i secret dal codice sorgente inserendoli a runtime tramite il sistema operativo host o l'orchestratore dei container. L'applicazione legge os.environ['DB_PASSWORD'] invece di un valore hardcoded. È una soluzione migliore rispetto all'hardcoding, ma le variabili d'ambiente presentano dei punti deboli: compaiono negli elenchi dei processi, vengono ereditate dai processi figli, finiscono spesso nei crash dump e nei log di debug e richiedono una rotazione manuale. Sono appropriate per lo sviluppo, ma da sole non sono sufficienti per la gestione dei secret in produzione.

# Environment variable pattern:
# In .env file (NEVER commit to git):
# DB_PASSWORD=P@ssw0rd#2026
# API_KEY=sk-live-abc123xyz789

# In .gitignore:
# .env
# *.env
# .env.*

# In application code:
# db_password = os.environ.get('DB_PASSWORD')
# api_key = os.environ.get('API_KEY')

# Risk: env vars visible in 'ps aux' output,
# inherited by child processes, appear in /proc/<pid>/environ

Gestori di secret dedicati

I gestori di secret sono sistemi progettati appositamente per archiviare, ruotare e sottoporre a audit l'accesso ai secret. Tra le soluzioni principali figurano HashiCorp Vault (open source ed enterprise), AWS Secrets Manager, Azure Key Vault e Google Cloud Secret Manager. Le applicazioni eseguono l'autenticazione presso il gestore di secret a runtime, recuperano il secret e lo utilizzano: nessun secret viene mai archiviato su disco o nelle variabili d'ambiente. Ogni accesso viene registrato, consentendo di verificare chi ha avuto accesso a quale secret e quando.

# HashiCorp Vault secret retrieval (conceptual):
# Application authenticates to Vault using:
#   - AWS IAM role (in cloud environments)
#   - Kubernetes service account token
#   - AppRole credentials

# After authentication, retrieve secret:
# vault kv get -field=password secret/prod/database

# In application (Python SDK):
# client = hvac.Client(url='https://vault.company.com')
# client.auth.aws.iam_login(role='prod-app')
# secret = client.secrets.kv.read_secret('prod/database')
# db_password = secret['data']['password']

Rotazione automatica dei secret

Un vantaggio fondamentale dei gestori di secret rispetto alle variabili d'ambiente è la rotazione automatica. AWS Secrets Manager può ruotare automaticamente le password dei database RDS secondo una pianificazione (ad esempio, ogni 30 giorni), senza richiedere il nuovo deployment dell'applicazione. Il gestore di secret aggiorna contemporaneamente la password nel database e il secret archiviato. Le applicazioni che recuperano i secret a ogni connessione ricevono automaticamente la nuova credenziale. In questo modo si elimina la pratica comune di utilizzare password «permanenti» per gli account di servizio, che non vengono mai ruotate.

# AWS Secrets Manager rotation configuration:
# Secret:         prod/app-database-credentials
# Rotation:       enabled
# Frequency:      every 30 days
# Lambda function: SecretsManager-MyRDSRotation

# Rotation process:
# 1. Lambda creates new DB password
# 2. Updates secret in Secrets Manager
# 3. Updates password on RDS instance
# 4. Tests new credentials work
# 5. Deprecates old credentials
# Application: always calls GetSecretValue at runtime -> gets fresh value

La difesa di .gitignore

La prima linea di difesa contro i segreti sottoposti a commit è un file .gitignore gestito correttamente che escluda tutti i file che potrebbero contenere segreti. Tuttavia, .gitignore impedisce solo i commit futuri: i segreti già sottoposti a commit rimangono nella cronologia di git. Se dei segreti vengono sottoposti accidentalmente a commit, devono essere considerati immediatamente compromessi: ruotate il segreto, quindi, facoltativamente, utilizzate strumenti come git filter-repo per riscrivere la cronologia (operazione richiesta ai fini della conformità, ma da sola insufficiente poiché il segreto potrebbe essere già stato estratto).

# Recommended .gitignore entries for secret files:
# .env
# .env.*
# *.pem
# *.key
# *.p12
# *.pfx
# credentials.json
# service_account*.json
# secrets.yaml
# config/secrets.yml
# terraform.tfvars  (may contain cloud credentials)
# .aws/credentials

# Pre-commit hook to scan for secrets before commit:
# pre-commit install
# hook: detect-secrets / gitleaks / truffleHog

Segreti nell'Infrastructure as Code

I file di Infrastructure as Code (IaC) (Terraform, CloudFormation, manifest Kubernetes) contengono spesso segreti: stringhe di connessione ai database, chiavi API nelle dichiarazioni delle variabili d'ambiente e certificati TLS. Questi file vengono spesso sottoposti a commit nei sistemi di controllo versione, creando un rischio di esposizione dei segreti. Tra le soluzioni vi sono i segreti dinamici di Vault (Vault genera una credenziale a breve durata specificamente per ogni esecuzione di Terraform), i Secrets di Kubernetes (archiviati in etcd, devono essere crittografati a riposo) e external-secrets-operator, che sincronizza i segreti da un secrets manager a Kubernetes durante l'esecuzione.

Principio del privilegio minimo per i segreti

Ogni applicazione o servizio dovrebbe accedere solo ai segreti di cui ha effettivamente bisogno: è il principio del privilegio minimo applicato ai segreti. Un'applicazione web ha bisogno della password del database, ma non della chiave privata della CA. Un processo di generazione di report ha bisogno di credenziali di sola lettura per il database, non dell'accesso in scrittura. I secrets manager applicano questo principio tramite policy di accesso che specificano quali identità (ruoli IAM, account di servizio, AppRoles) possono leggere quali segreti, registrando ogni accesso ai fini dell'audit.

# Vault policy: web application can read DB password only
# policy name: web-app-policy
# path 'secret/prod/database' {
#   capabilities = ['read']
# }
# path 'secret/prod/tls-certs/*' {
#   capabilities = []  # DENY - app does not need TLS keys
# }

# This policy is assigned to the web app's AppRole.
# The reporting service gets a separate policy with
# only 'secret/prod/reporting-db-readonly' access.

Segreti dinamici

I segreti dinamici vengono generati su richiesta per uno specifico richiedente e scadono automaticamente. Vault può generare una credenziale temporanea per il database valida per 1 ora e associata al servizio specifico che l'ha richiesta. Alla scadenza, la credenziale viene revocata automaticamente dal database. In questo modo non esistono credenziali statiche di lunga durata che possano essere sottratte: anche se un attaccante intercetta una credenziale dinamica, questa scade rapidamente ed è associata all'identità richiedente nei log di audit.

# Vault dynamic secrets: temporary DB credentials
# Application calls Vault to get a DB credential:
# vault read database/creds/web-app-role
#
# Vault response:
# username: v-web-app-x7k2m-1234567890  (unique, temporary)
# password: A1b2C3d4E5f6G7h8            (randomly generated)
# lease_duration: 1h                     (auto-expires)
#
# After 1 hour, Vault instructs DB to revoke this user.
# No static password ever exists for the attacker to steal.

Segreti nelle pipeline CI/CD

Le pipeline CI/CD richiedono spesso dei segreti: credenziali dei provider cloud per la distribuzione, token dei registry Docker e chiavi di firma. Non archiviate mai i segreti negli script o nei file di configurazione della pipeline. Utilizzate invece il secrets store integrato nella piattaforma della pipeline (GitHub Actions Secrets, GitLab CI Variables, Jenkins Credentials Store) oppure recuperate i segreti da un vault centralizzato durante l'esecuzione, usando un'identità macchina. Contrassegnate le variabili contenenti segreti come mascherate nei log, per impedirne l'esposizione accidentale nell'output della build.

# GitHub Actions: using secrets in pipeline
# secrets.yml in GitHub Settings -> Secrets (encrypted storage)
# Secret: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY

# In .github/workflows/deploy.yml:
# env:
#   AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
#   AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

# Best practice: use OIDC federation instead
# GitHub -> AWS trust relationship via OIDC token
# -> No static AWS keys needed at all

Audit degli accessi ai segreti

I secrets manager forniscono log di audit completi di ogni evento di accesso ai segreti: quale identità ha effettuato l'accesso a quale segreto, da quale IP, a quale ora e se l'accesso è riuscito o è stato negato. Questi log sono fondamentali per la conformità (SOC 2, PCI-DSS) e per la risposta agli incidenti. Quando si sospetta che una credenziale sia stata compromessa, i log di audit mostrano quali sistemi vi hanno avuto accesso e quando, consentendo di identificare rapidamente i sistemi potenzialmente interessati e di decidere come contenerli.

Hook pre-commit per prevenire l'inserimento di segreti

Gli hook pre-commit sono script eseguiti automaticamente prima del completamento di ogni commit git e consentono di rilevare i segreti prima che entrino nella cronologia del controllo versione. Strumenti come detect-secrets (Yelp), GitLeaks e git-secrets (AWS) si integrano come hook pre-commit ed esaminano i file nell'area di staging alla ricerca di pattern corrispondenti a chiavi API, stringhe di connessione, chiavi private e token JWT. Se viene rilevato un segreto, il commit viene rifiutato e al developer viene richiesto di rimuovere la credenziale. Il framework pre-commit facilita l'aggiunta e la condivisione delle configurazioni degli hook tra i team.

# Installing detect-secrets as pre-commit hook:
# 1. Install: pip install detect-secrets
# 2. Create baseline: detect-secrets scan > .secrets.baseline
# 3. Add to .pre-commit-config.yaml:
#    repos:
#      - repo: https://github.com/Yelp/detect-secrets
#        rev: v1.4.0
#        hooks:
#          - id: detect-secrets
#            args: ['--baseline', '.secrets.baseline']
# 4. Install hooks: pre-commit install

# Now every commit attempt is scanned:
# git commit -m 'add config'
# -> detect-secrets runs
# -> if AWS key pattern found: COMMIT BLOCKED
# -> developer must remove secret and use secrets manager

Verifica rapida

Verificate la vostra comprensione dei concetti di CompTIA Security+ (SY0-701) trattati in questa lezione.

Riepilogo della lezione

In questa lezione avete imparato che: i segreti hardcoded nel codice sorgente devono essere eliminati e sostituiti con secrets manager come Vault o AWS Secrets Manager; la rotazione automatica elimina le credenziali di lunga durata che gli attaccanti potrebbero sfruttare anche dopo la compromissione iniziale; infine, i segreti dinamici e le policy di accesso basate sul privilegio minimo riducono al minimo il valore di ogni singolo segreto esposto. Nella prossima lezione esploreremo la sicurezza delle dipendenze e la software composition analysis.

Domande Frequenti

La lezione «Gestione sicura dei segreti e variabili d'ambiente» è gratuita?

Sì — il testo completo di «Gestione sicura dei segreti e variabili d'ambiente» è 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 Security+ Academy, passa a CoddyKit PRO. Il corso Security+ Academy include 4 lezioni in totale.

Cosa imparerò in «Gestione sicura dei segreti e variabili d'ambiente»?

Eviti i segreti hardcoded nel codice sorgente utilizzando secrets manager (Vault, AWS Secrets Manager) e l'iniezione delle variabili d'ambiente a runtime. Eserciti Security+ Academy 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 Security+ Academy?

Non è richiesta alcuna esperienza precedente. Security+ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Gestione sicura dei segreti e variabili d'ambiente»?

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 Security+ Academy?

Sì. Ogni lezione Security+ Academy 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. Convalida degli input e codifica degli output
  2. Gestione sicura dei segreti e variabili d'ambiente
  3. Sicurezza delle dipendenze e analisi della composizione del software
  4. DevSecOps: spostare la sicurezza a sinistra nelle pipeline
← Torna a Security+ Academy