Files

6.5 KiB

Tutorial: Security e Compliance per Database RDS

In questo tutorial imparerai a configurare e verificare la sicurezza del database, simulando RDS security best practices.

Obiettivo

Configurare PostgreSQL con sicurezza enterprise: non-root, private network, resource limits.

Prerequisiti

  • Tutorial 01-02 completati
  • Database in esecuzione con dati persistenti

Passo 1: Verifica INF-01 - Non-root Execution

PostgreSQL official image NON gira come root.

Esegui:

# Verifica l'utente del processo principale (PID 1)
docker exec lab05-db sh -c "ps -o user,pid,args | awk '\$2 == 1 {print \$1, \$2, \$3}'"

# Atteso: postgres 1 postgres

Verifica UID:

# Verifica UID del processo principale != 0
docker exec lab05-db sh -c "awk '/^Uid:/ {print \$2}' /proc/1/status"

# Atteso: un valore non-zero (nel lab osservato: 70)

Nota: docker exec ... whoami puo mostrare root per la shell di debug lanciata con exec, ma non rappresenta il processo principale del database. Per INF-01 devi controllare il processo PID 1.


Passo 2: Verifica INF-02 - Private Network Isolation

Il database NON deve essere accessibile dall'host.

Esegui:

# Verifica NESSUNA porta mappata
docker port lab05-db

# Atteso: (nessun output)

Verifica rete:

# Verifica container in rete privata
docker inspect lab05-db --format '{{range $net, $conf := .NetworkSettings.Networks}}{{$net}}{{end}}'

# Atteso: lab05-vpc-private (solo rete privata)

Test isolamento:

# Prova connessione dall'host (DEVE fallire)
psql -h localhost -U lab05_user -d lab05_db 2>&1 || echo "Corretto: non accessibile"

# Prova reachability dal container app (DEVE riuscire)
docker exec lab05-app ping -c 2 db

# Prova query SQL da un client nella rete privata (DEVE riuscire)
docker run --rm -it --network lab05-vpc-private \
  -e PGPASSWORD=lab05_password \
  postgres:16-alpine \
  psql -h db -U lab05_user -d lab05_db -c "SELECT 1;"

Passo 3: Verifica INF-03 - Resource Limits

Il database deve avere limiti CPU e memoria.

Esegui:

# Verifica limiti configurati
docker inspect lab05-db --format '{{.HostConfig.Memory}}'
docker inspect lab05-db --format '{{.HostConfig.NanoCpus}}'

Verifica i limiti risorse configurati nel compose:

docker inspect lab05-db --format '{{.HostConfig.Memory}} {{.HostConfig.NanoCpus}}'

Atteso:

  • Memory: 4294967296 (4 GB)
  • NanoCpus: 2000000000 (2 vCPU)

Test enforcement:

# Verifica limiti applicati
docker stats lab05-db --no-stream

Passo 4: Verifica INF-04 - Named Volume

I dati devono persistere in volume nominativo.

Esegui:

# Verifica volume esista
docker volume ls | grep lab-05-database_db-data

# Verifica montaggio
docker inspect lab05-db --format '{{range .Mounts}}{{if eq .Destination "/var/lib/postgresql/data"}}{{.Name}}{{end}}{{end}}'

Atteso: lab-05-database_db-data


Passo 5: Test Security Complete

Esegui lo script di verifica sicurezza.

Esegui:

bash tests/99-final-verification.sh

Lo script finale copre anche i controlli di sicurezza principali del lab.


Passo 6: Configura Credenziali Forti

Le credenziali nel docker-compose.yml sono solo per laboratorio.

Per visualizzarle, cerca le variabili POSTGRES_ nel file docker-compose.yml:

environment:
  POSTGRES_DB: lab05_db
  POSTGRES_USER: lab05_user
  POSTGRES_PASSWORD: lab05_password

Per produzione (simulazione RDS):

# NON usare password in chiaro
# Usa Docker secrets o variabili ambiente

# Esempio (solo riferimento, non implementare nel lab):
environment:
  POSTGRES_PASSWORD_FILE: /run/secrets/db_password
secrets:
  db_password:
    external: true

Passo 7: Limita Accessi con Security Groups

Simula security groups controllando chi può connettersi.

Esegui:

# Container app PUÒ connettersi (stessa rete privata)
docker exec lab05-app ping -c 2 db

# Container test-public NON può connettersi (rete diversa)
docker exec lab05-test-public ping -c 2 db || echo "Isolamento corretto"

Questo simula:

  • Security group permette accessi da stessa VPC
  • Security group blocca accessi da internet

Passo 8: Abilita Logging e Monitoring

RDS fornisce logs metriche. Simula con Docker logs.

Esegui:

# Segui log PostgreSQL
docker logs -f lab05-db

# Filtra per errori
docker logs lab05-db 2>&1 | grep -i error

# Filtra per connessioni
docker logs lab05-db 2>&1 | grep -i connection

Per produzione:

# Configura PostgreSQL logging
# Aggiungi a postgresql.conf:
log_statement = 'all'
log_duration = on
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '

Verifica Finale

Esegui la verifica finale completa.

Esegui:

bash tests/99-final-verification.sh

Tutti i test devono PASSARE, inclusi:

  • INF-01: Non-root
  • INF-02: Private network
  • INF-03: Resource limits
  • INF-04: Named volume

Parallelismo con RDS Security

Locale AWS RDS
Non-root container AWS IAM authentication
Private network VPC security group
Resource limits Instance class limits
Named volume EBS encryption
Docker logs CloudWatch logs
pg_isready RDS health check

Security Checklist

Prima di passare al production (simulato):

  • Database gira come non-root
  • NESSUNA porta esposta su host
  • Limiti CPU e memoria configurati
  • Volume nominativo per dati
  • Credenziali non in chiaro (production)
  • Logging abilitato
  • Healthcheck configurato
  • Backup strategy (production)

Troubleshooting

Container gira come root

# Verifica il processo principale, non la shell lanciata con docker exec
docker exec lab05-db sh -c "ps -o user,pid,args | awk '\$2 == 1 {print \$1, \$2, \$3}'"
docker exec lab05-db sh -c "awk '/^Uid:/ {print \$2}' /proc/1/status"

Database accessibile dall'host

# Verifica porte mappate
docker port lab05-db

# Se porta mappata, rimuovi 'ports:' da docker-compose.yml

Limiti non applicati

# Verifica Docker versione (>= 20.10 per deploy.resources)
docker version --format '{{.Server.Version}}'

# Verifica che 'deploy' sia configurato nel compose
docker compose config | grep -A 5 "deploy:"

Completamento Lab 05

Congratulazioni! Hai completato Lab 05 - Database & RDS.

Competenze acquisite:

  • Deploy PostgreSQL in private network
  • Configurare persistenza dati con volumi
  • Implementare security best practices
  • Simulare RDS con Docker

Prossimi step:

  • Lab 06: Integration & Testing
  • Lab 07: Repository Structure
  • Lab 08: Troubleshooting Docs