Files
laboratori-cloud/labs/lab-05-database/tutorial/03-security-compliance.md
Luca Sacchi Ricciardi f8544afe35 docs(06-02): create Diátaxis documentation for Lab 05 Database & RDS
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>
2026-04-03 17:41:29 +02:00

292 lines
5.8 KiB
Markdown

# 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:
```bash
# Verifica utente nel container
docker exec lab05-db whoami
# Atteso: postgres
```
Verifica UID:
```bash
# 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:
```bash
# Verifica NESSUNA porta mappata
docker port lab05-db
# Atteso: (nessun output)
```
Verifica rete:
```bash
# 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:
```bash
# 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:
```bash
# Verifica limiti configurati
docker inspect lab05-db --format '{{.HostConfig.Memory}}'
docker inspect lab05-db --format '{{.HostConfig.NanoCpus}}'
```
Verifica con docker-compose:
```bash
# 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:
```bash
# Verifica limiti applicati
docker stats lab05-db --no-stream
```
---
## Passo 4: Verifica INF-04 - Named Volume
I dati devono persistere in volume nominativo.
Esegui:
```bash
# 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:
```bash
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:
```bash
# Verifica credenziali attuali
grep POSTGRES_PASSWORD docker-compose.yml
```
Per produzione (simulazione RDS):
```bash
# 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:
```bash
# 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:
```bash
# 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:
```bash
# 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
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
```bash
# Verifica image
docker inspect lab05-db --format '{{.Config.User}}'
# PostgreSQL official image deve usare 'postgres'
# Se root, controlla Dockerfile
```
### Database accessibile dall'host
```bash
# Verifica porte mappate
docker port lab05-db
# Se porta mappata, rimuovi 'ports:' da docker-compose.yml
```
### Limiti non applicati
```bash
# 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