#!/bin/bash # Lab 05 - Database & RDS # Test 02: Private Network Isolation # Verifica che il database sia in una rete privata e non sia accessibile dall'host set -euo pipefail # Colori per output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # Contatori pass_count=0 fail_count=0 skip_count=0 # Funzioni helper inc_pass() { ((pass_count++)) || true; } inc_fail() { ((fail_count++)) || true; } inc_skip() { ((skip_count++)) || true; } echo "==========================================" echo "Lab 05 - Test 02: Private Network Isolation" echo "==========================================" echo "" # Verifica che docker-compose.yml esista echo -n "[TEST] Verifica docker-compose.yml esista... " if [ -f "docker-compose.yml" ]; then echo -e "${GREEN}PASS${NC}" inc_pass else echo -e "${YELLOW}SKIP${NC} (docker-compose.yml non trovato)" inc_skip echo "" echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP" exit 0 fi # Verifica che il database sia in una rete privata echo -n "[TEST] Verifica database in rete 'vpc-private'... " if grep -A 10 "database:" docker-compose.yml | grep -q "vpc-private"; then echo -e "${GREEN}PASS${NC}" inc_pass else echo -e "${RED}FAIL${NC} (database non in rete vpc-private)" inc_fail echo "Il database deve essere nella rete privata per simulare RDS in VPC" fi # Verifica che la rete privata sia configurata come internal echo -n "[TEST] Verifica rete 'vpc-private' con flag internal... " if grep -A 5 "vpc-private:" docker-compose.yml | grep -q "internal: true"; then echo -e "${GREEN}PASS${NC}" inc_pass else echo -e "${YELLOW}WARN${NC} (rete privata senza flag internal)" inc_skip fi # Verifica che NON ci siano porte esposte per il database (INF-02) echo -n "[TEST] Verifica NESSUNA porta esposta per database (INF-02)... " if grep -A 20 "database:" docker-compose.yml | grep -q "ports:"; then # Se ci sono porte, verifica che siano solo 127.0.0.1 if grep -A 20 "database:" docker-compose.yml | grep "ports:" -A 1 | grep -q "127.0.0.1"; then echo -e "${YELLOW}WARN${NC} (porta su 127.0.0.1 - database RDS reale non espone porte)" inc_skip else echo -e "${RED}FAIL${NC} (porta esposta su host - INF-02 violation)" inc_fail echo "RDS in VPC privata NON espone porte sull'host" fi else echo -e "${GREEN}PASS${NC} (nessuna porta esposta)" inc_pass fi # Se i container non sono in esecuzione, skip i test dinamici echo "" echo -n "[TEST] Verifica container database in esecuzione... " if ! docker ps --format '{{{{Names}}}}' | grep -q "^lab05-db$"; then echo -e "${YELLOW}SKIP${NC} (container non in esecuzione)" inc_skip echo -e "${YELLOW}Avviare i container con: docker-compose up -d${NC}" echo "" echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP" exit 0 fi echo -e "${GREEN}PASS${NC}" inc_pass # Verifica che il database NON sia accessibile dall'host echo "" echo "[TEST] Verifica database NON accessibile dall'host..." # Ottieni porta se esposta db_port=$(docker port lab05-db 5432 2>/dev/null || echo "") if [ -z "$db_port" ]; then echo -e " ${GREEN}PASS${NC} (nessuna porta mappata su host)" inc_pass else echo -e " ${RED}FAIL${NC} (porta $db_port mappata su host)" inc_fail echo " RDS in VPC privata NON deve essere accessibile dall'host" fi # Verifica che il container sia nella rete privata echo -n "[TEST] Verifica container connesso a rete vpc-private... " if docker inspect lab05-db --format '{{range $net, $conf := .NetworkSettings.Networks}}{{$net}}{{end}}' | grep -q "lab05-vpc-private"; then echo -e "${GREEN}PASS${NC}" inc_pass else echo -e "${RED}FAIL${NC} (container non in rete vpc-private)" inc_fail fi # Verifica isolamento - container in rete pubblica NON può connettersi echo "" echo "[TEST] Verifica isolamento tra reti..." # Cerca container in rete pubblica public_container=$(docker ps --format '{{{{Names}}}}' | grep -E "lab05-(web|app|test)" | head -1) if [ -n "$public_container" ]; then echo -n "[TEST] Container pubblico $public_container può connettersi al database... " if docker exec $public_container pg_isready -h lab05-db -U lab05_user &>/dev/null; then echo -e "${GREEN}PASS${NC} (connessione consentita - multi-homed app scenario)" inc_pass else echo -e "${YELLOW}SKIP${NC} (connessione fallita - potrebbe essere corretta isolazione)" inc_skip fi else echo -e "${YELLOW}SKIP${NC} (nessun container pubblico trovato)" inc_skip fi echo "" echo "==========================================" echo "Risultato: $pass_count PASS, $fail_count FAIL, $skip_count SKIP" echo "==========================================" if [ $fail_count -gt 0 ]; then exit 1 fi exit 0