Documentation (6 files, 1500+ lines): Tutorials (3): - 01-deploy-rds-database.md: Deploy PostgreSQL in private network - 02-data-persistence.md: Data persistence with named volumes - 03-security-compliance.md: INF-01/02/03/04 compliance How-to Guides (1): - connect-to-postgresql.md: Connection methods Reference (1): - postgresql-commands.md: PostgreSQL command reference Explanation (1): - database-rds-parallels.md: Docker↔RDS parallels with architecture diagrams Key concepts: - PostgreSQL container → RDS Instance - Private network → VPC Private Subnet - Named volume → EBS volume - Resource limits → DB instance class Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
5.8 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 utente nel container
docker exec lab05-db whoami
# Atteso: postgres
Verifica UID:
# Verifica UID != 0
docker exec lab05-db id -u
# Atteso: 999 (postgres user UID)
Se l'utente è root o UID 0, c'è una violazione di sicurezza.
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 connessione da container app (DEVE successo)
docker exec lab05-app 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 con docker-compose:
# Verifica configurazione compose
grep -A 10 "deploy:" docker-compose.yml | grep -A 5 "resources:"
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 lab05_db-data
# Verifica montaggio
docker inspect lab05-db --format '{{range .Mounts}}{{if eq .Destination "/var/lib/postgresql/data"}}{{.Name}}{{end}}{{end}}'
Atteso: lab05_db-data
Passo 5: Test Security Complete
Esegui lo script di verifica sicurezza.
Esegui:
cd tests
./04-security-test.sh
Tutti i test devono PASSARE.
Passo 6: Configura Credenziali Forti
Le credenziali nel docker-compose.yml sono solo per laboratorio.
Esegui:
# Verifica credenziali attuali
grep POSTGRES_PASSWORD docker-compose.yml
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:
cd 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 image
docker inspect lab05-db --format '{{.Config.User}}'
# PostgreSQL official image deve usare 'postgres'
# Se root, controlla Dockerfile
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
grep -A 20 "db:" docker-compose.yml | grep "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