fix(lab-05): align database lab with runtime behavior

This commit is contained in:
Luca Sacchi Ricciardi
2026-04-10 14:10:22 +00:00
parent 4b6777f600
commit 92c11d524f
7 changed files with 231 additions and 205 deletions
@@ -16,20 +16,20 @@ Deployare PostgreSQL in Docker private network che simula RDS in VPC privata AWS
## Passo 1: Verifica l'ambiente
Verifica che le reti private siano già state create.
Il compose di questo lab crea da solo le reti `lab05-vpc-public` e `lab05-vpc-private`. Lab 02 resta un prerequisito concettuale, non una dipendenza runtime.
Esegui:
```bash
# Verifica reti esistenti
docker network ls | grep vpc
# Verifica servizi e reti definiti nel compose
docker compose config --services
docker compose config | grep -A 20 "networks:"
# Atteso:
# lab05-vpc-private
# lab05-vpc-public
# app
# db
# test-public
```
Se le reti non esistono, consulta prima il Lab 02.
---
## Passo 2: Esamina docker-compose.yml
@@ -109,10 +109,13 @@ Atteso: `healthy` o `accepting connections`
Puoi connetterti SOLO da container nella stessa rete privata.
Esegui dal container `app`:
Esegui da un client PostgreSQL temporaneo collegato alla rete privata:
```bash
# Connettiti dal container app
docker exec lab05-app psql -h db -U lab05_user -d lab05_db
# Connettiti da un client nella stessa rete privata
docker run --rm --network lab05-vpc-private \
-e PGPASSWORD=lab05_password \
postgres:16-alpine \
psql -h db -U lab05_user -d lab05_db
# Una volta connesso, esegui:
lab05_db=> SELECT version();
@@ -163,8 +166,7 @@ Esegui lo script di verifica finale.
Esegui:
```bash
cd tests
./99-final-verification.sh
bash tests/99-final-verification.sh
```
Tutti i test devono PASSARE.
@@ -24,10 +24,10 @@ Esegui:
docker volume ls | grep db-data
# Atteso:
# local lab05_db-data
# local lab-05-database_db-data
```
Il volume è nominativo (`local` driver), quindi i dati sopravvivono.
Il volume e nominativo (`local` driver), quindi i dati sopravvivono. Nel repository il nome reale include il prefisso del progetto compose: `lab-05-database_db-data`.
---
@@ -142,10 +142,10 @@ Esplora il volume per capire come PostgreSQL memorizza i dati.
Esegui:
```bash
# Trova il mount point del volume
docker inspect lab05-db --format '{{range .Mounts}}{{if eq .Destination "/var/lib/postgresql/data"}}{{.Source}}{{end}}{{end}}'
docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}'
# Lista file nel volume (come root)
sudo ls -la /var/lib/docker/volumes/lab05_db-data/_data/
sudo ls -la $(docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}')
```
Struttura chiave:
@@ -215,7 +215,7 @@ Tutte le verifiche devono passare.
### Dati persi dopo riavvio
```bash
# Verifica che il volume sia nominativo
docker volume inspect lab05_db-data
docker volume inspect lab-05-database_db-data
# Verifica montaggio corretto
docker inspect lab05-db --format '{{json .Mounts}}' | jq
@@ -226,17 +226,17 @@ docker inspect lab05-db --format '{{json .Mounts}}' | jq
# Lista tutti i volumi
docker volume ls
# Se il volume non esiste, ricrea
docker volume create lab05_db-data
# Se il volume non esiste, ricrealo rialzando il compose
docker compose up -d
```
### Permesso negato su volume
```bash
# Verifica proprietà volume
sudo ls -la /var/lib/docker/volumes/lab05_db-data/
sudo ls -la $(docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}')
# PostgreSQL deve poter scrivere
sudo chown -R 999:999 /var/lib/docker/volumes/lab05_db-data/
sudo chown -R 999:999 $(docker volume inspect lab-05-database_db-data --format '{{.Mountpoint}}')
```
---
@@ -19,21 +19,21 @@ PostgreSQL official image NON gira come root.
Esegui:
```bash
# Verifica utente nel container
docker exec lab05-db whoami
# 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
# Atteso: postgres 1 postgres
```
Verifica UID:
```bash
# Verifica UID != 0
docker exec lab05-db id -u
# Verifica UID del processo principale != 0
docker exec lab05-db sh -c "awk '/^Uid:/ {print \$2}' /proc/1/status"
# Atteso: 999 (postgres user UID)
# Atteso: un valore non-zero (nel lab osservato: 70)
```
Se l'utente è `root` o UID `0`, c'è una violazione di sicurezza.
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.
---
@@ -62,8 +62,14 @@ 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;"
# 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 --network lab05-vpc-private \
-e PGPASSWORD=lab05_password \
postgres:16-alpine \
psql -h db -U lab05_user -d lab05_db -c "SELECT 1;"
```
---
@@ -104,13 +110,13 @@ I dati devono persistere in volume nominativo.
Esegui:
```bash
# Verifica volume esista
docker volume ls | grep lab05_db-data
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: `lab05_db-data`
Atteso: `lab-05-database_db-data`
---
@@ -120,11 +126,10 @@ Esegui lo script di verifica sicurezza.
Esegui:
```bash
cd tests
./04-security-test.sh
bash tests/99-final-verification.sh
```
Tutti i test devono PASSARE.
Lo script finale copre anche i controlli di sicurezza principali del lab.
---
@@ -205,8 +210,7 @@ Esegui la verifica finale completa.
Esegui:
```bash
cd tests
./99-final-verification.sh
bash tests/99-final-verification.sh
```
Tutti i test devono PASSARE, inclusi:
@@ -249,11 +253,9 @@ Prima di passare al production (simulato):
### Container gira come root
```bash
# Verifica image
docker inspect lab05-db --format '{{.Config.User}}'
# PostgreSQL official image deve usare 'postgres'
# Se root, controlla Dockerfile
# 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