Progetta una sicurezza rete cloud enterprise con VPC e segmentazione. Best practice AWS, Azure, GCP per architetti IT.
Un container esposto a internet senza controlli di rete ha causato la violazione dati di 57 milioni di record in un'azienda fintech nel 2023. Il costo medio di una breach cloud-based è arrivato a 4,45 milioni di dollari secondo IBM. La segmentazione rete cloud non è un'opzione — è sopravvivenza aziendale.
Perché la Sicurezza della Rete Cloud È Fallita Fin Dall'Inizio
Il problema è strutturale. Quando le aziende migrano workload su cloud pubblico, applicano mentalità on-premise a un'infrastruttura che funziona in modo radicalmente diverso. Su AWS, Azure e GCP, il network è virtualizzato, elastico e globale per natura. Deleghi la segmentazione fisica a qualcun altro — ma i confini logici restano responsabilità tua.
Il dato è inequivocabile**: il 67% delle violazioni cloud nel 2024 è avvenuto per configurazione errata dei security group, secondo il rapporto Verizon Data Breach Investigations. Non si tratta di attacchi sofisticati. Si tratta di architetture progettate senza comprendere i primitives di rete cloud.
Le Tre Dimensioni del Fallimento
1. Complessità accidentalmente introdotta
Ogni VPC che crei senza design metodico diventa un sistema a spaghetti. Ho visto VPC con 340 regole di peering, nessuna documentazione, e un team che temeva toccare qualsiasi cosa perché "funzionava". Questo è debito tecnico che si paga in ore di incident response.
2. Lateral movement non controllato
In un'architettura flat, un attacker che compromette un'istanza ha potenzialmente accesso a tutto. Il 2023 Mandiant M-Trends report ha documentato che il dwell time medio — il tempo tra compromissione iniziale e discovery — è di 16 giorni in ambienti cloud. Sedici giorni di movimento laterale indisturbato.
3. Compliance che diventa teatro
PCI-DSS 4.0 richiede esplicitamente segmentazione delle reti di pagamento. GDPR impone misure tecniche adeguate. ISO 27001 parla di controlli di accesso alla rete. Se la tua segmentazione rete cloud è un monolite con security group applicati inconsistentemente, non sei compliant — sei un audit waiting to fail.
Perché Gli Approcci Tradizionali Non Funzionano
Firewall tradizionali hanno concetti come "zona demilitarizzata" e "rete interna". Su cloud pubblico, le zone esistono solo come costrutti logici che crei tu. AWS Transit Gateway non è un firewall — è un hub di routing. Azure Virtual WAN non segmenta per te. GCP Network Connectivity Center connette, non isola.
La responsabilità della segmentazione è tua, e il toolsset è diverso.
Architettura di Segmentazione: VPC Cloud Moderno
La segmentazione efficace richiede un approccio a strati. Non esiste una soluzione singola — esiste un stack di controlli che lavorano insieme.
Layer 1: VPC Design Con Multi-Tier Architecture
Il foundation layer è come strutturi i Virtual Private Cloud. Opzioni principali:
Single VPC con Subnet per Ambiente
Adatto per startup o workload isolati. Tutto in un VPC, subnet pubbliche per load balancer, private per application tier, isolated per database.
VPC: 10.0.0.0/16
├── Subnet Pubblica (Web Tier): 10.0.1.0/24
├── Subnet Applicazione (App Tier): 10.0.2.0/24
├── Subnet Dati (Data Tier): 10.0.3.0/24
└── Subnet Isolata (Security/Tools): 10.0.4.0/24
Questo modello funziona per MVP e team piccoli. Ma scala male oltre 50 risorse — il blast radius di un errore diventa sistemico.
Multi-VPC Architecture con Transit Gateway
Per aziende enterprise, la right answer è multi-VPC con AWS Transit Gateway o equivalenti Azure/GCP. Ogni workload o dominio ha il proprio VPC isolato. Transit Gateway agisce come hub centrale per comunicazione controllata.
| Architettura | Caso d'Uso | Complessità | Costo Mensile Stimato | Scalabilità |
|---|---|---|---|---|
| Single VPC + Subnet | MVP, Startup | Bassa | $50-150 | Fino a 100 istanze |
| Multi-VPC + TGW | Mid-market | Media | $500-2000 | Fino a 500 risorse |
| Hub & Spoke Federato | Enterprise | Alta | $2000-10000+ | Illimitata |
| Landing Zone AWS | Enterprise Globale | Molto Alta | $5000-50000+ | Multi-account |
Layer 2: Security Groups come Firewall Stateful
Security groups sono stateful — se permetti inbound su porta 443, il traffico di ritorno è automatico. Questa è la foundation del controllo, ma anche la trappola.
Best Practice Security Groups
Regola 1: Never allow 0.0.0.0/0 su porte elevate. Mai.
# Security Group per Application Tier - BEST PRACTICE
resource "aws_security_group" "app_tier" {
name = "app-tier-sg"
description = "Security group per application tier"
vpc_id = aws_vpc.main.id
ingress {
description = "HTTPS from Web Tier only"
from_port = 443
to_port = 443
protocol = "tcp"
security_groups = [aws_security_group.web_tier.id]
}
ingress {
description = "SSH from Bastion only"
from_port = 22
to_port = 22
protocol = "tcp"
security_groups = [aws_security_group.bastion.id]
}
egress {
description = "HTTPS outbound to internet"
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Environment = "production"
Compliance = "PCI-DSS"
}
}
Il vantaggio di referenziare security groups invece di CIDR ranges è che le regole sopravvivono ai cambiamenti IP. Se una instance viene ricreata, le regole continuano a funzionare.
Layer 3: Network ACLs come Firewall Stateless Secondario
Network ACLs operano a livello subnet — sono stateless e valutano ogni pacchetto. Usali come controllo difensivo aggiuntivo, non primario.
Quando NACLs hanno senso:
- Bloccare ranges IP specifici a livello subnet
- Implementare regole di deny esplicite
- Segmentare tra tier di rete
Quando NACLs sono overkill:
- Controllo per-instance (usare security groups)
- Traffico East-West tra tier (security groups sono sufficienti)
# NACL per subnet database - blocca tutto tranne accesso specifico
Rule #: 100 | Type: Custom | Protocol: TCP | Port: 3306 | Source: 10.0.2.0/24 | Allow
Rule #: 200 | Type: Custom | Protocol: ALL | Source: 0.0.0.0/0 | Deny
Rule #: * | Type: All | Protocol: All | Source: All | Deny
Il DENY esplicito finale è mandatory. NACLs hanno regole evaluate in ordine numerico — tutto ciò che non match esplicitamente viene negato.
Layer 4: PrivateLink e VPC Endpoint per Accesso Zero-Internet
Per servizi AWS come S3, DynamoDB, Secrets Manager, il traffico non deve mai uscire su internet. VPC Endpoint con PrivateLink crea connessioni private al servizio.
# VPC Endpoint per S3 con bucket policy restrittiva
resource "aws_vpc_endpoint" "s3_endpoint" {
vpc_id = aws_vpc.main.id
service_name = "com.amazonaws.eu-west-1.s3"
route_table_ids = [aws_route_table.private_rt.id]
policy = jsonencode({
Version = "2012-10-17"
Statement = [{
Effect = "Deny"
Principal = "*"
Action = "s3:*"
Resource = ["arn:aws:s3:::production-data-bucket"]
Condition = {
StringNotEquals = {
"aws:sourceVpce" = aws_vpc_endpoint.s3_endpoint.id
}
}
}]
})
}
Con questa configurazione, anche se qualcuno ottiene credenziali, non può accedere al bucket da outside del VPC.
Framework di Decisione: Quale Modello di Segmentazione?
Domande critiche per scegliere:
Quanti team/lavoreload devono essere isolati?
- < 5 team → Single VPC con strong security groups
- 5-20 team → Multi-VPC con Shared Services centrali
20 team → AWS Landing Zone o Azure Landing Zones con governance automatizzata
Requisiti di compliance?
- Solo SOC2 → Network segmentation base
- PCI-DSS → VPC dedicati per cardholder data environment
- HIPAA → VPC isolati con crittografia e audit trail
Necessità di network inspection?
- Nessuna → Security groups sufficienti
- IDS/IPS basic → AWS Gateway Load Balancer con partner solutions
- Deep packet inspection → Transit Gateway + Appliance virtuali dedicate
Implementazione Pratica: Step-by-Step su AWS
Fase 1: Landing Zone Foundation
# Creazione VPC con Terraform - approccio infrastruttura come codice
# Sempre preferire IaC a click-ops per reproducibility
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "eu-west-1"
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "5.0.0"
name = "production-vpc"
cidr = "10.0.0.0/16"
azs = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
public_subnets = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
database_subnets = ["10.0.201.0/24", "10.0.202.0/24", "10.0.203.0/24"]
enable_nat_gateway = true
single_nat_gateway = false # Alta disponibilità
tags = {
Environment = "production"
ManagedBy = "terraform"
}
}
Fase 2: Bastion Host e Accesso Privilegiato
Mai SSH direttamente su istanze production. Il pattern corretto:
- AWS Systems Manager Session Manager per accesso senza bastion (best option)
- Bastion host in public subnet se SSM non è praticabile (sempre con strict security groups)
# Security Group per bastion - porta 22 solo dal management network
Ingress:
- FromPort: 22
ToPort: 22
Source: 10.255.0.0/24 # Management network dedicato
Description: SSH from on-premises VPN
Egress:
- ToPort: 443
FromPort: 443
Destination: 0.0.0.0/0
Description: HTTPS per Session Manager agent
Fase 3: Transit Gateway per Multi-VPC
Per architetture con più VPC, Transit Gateway centralizza il routing.
# Transit Gateway con route tables segmentate
resource "aws_ec2_transit_gateway" "main" {
description = "Central transit gateway"
auto_accept_shared_attachments = "enable"
default_route_table_propagation = "enable"
default_route_table_association = "enable"
dns_support = "enable"
vpn_ecmp_support = "enable"
}
# Route table per spoke production - default deny
resource "aws_ec2_transit_gateway_route_table" "production" {
transit_gateway_id = aws_ec2_transit_gateway.main.id
route {
destination_cidr_block = "0.0.0.0/0"
transit_gateway_attachment_id = "tgw-attach-internet-vpc"
}
}
Fase 4: Network Watcher e Monitoring
# Abilitare VPC Flow Logs per tutti i VPC production
aws logs create-log-group --log-group-name /aws/vpc/flow-logs/production
aws ec2 create-flow-logs \
--resource-type VPC \
--resource-ids vpc-0123456789abcdef \
--traffic-type ALL \
--log-destination-type cloud-watch-logs \
--log-group-name /aws/vpc/flow-logs/production \
--deliver-logs-permission-arn arn:aws:iam::123456789012:role/FlowLogsRole
Con Flow Logs in CloudWatch, puoi interrogare pattern anomali:
-- Query Athena per identificare connection refused anomali
SELECT
srcaddr,
dstaddr,
dstport,
count(*) as attempts
FROM vpc_flow_logs
WHERE action = 'REJECT'
AND dstport IN (22, 3389, 3306, 5432)
AND date_diff('hour', from_iso8601_timestamp(partition_0), current_timestamp) < 24
GROUP BY srcaddr, dstaddr, dstport
ORDER BY attempts DESC
LIMIT 20;
Errori Critici che Ho Visto in Produzione
Errore 1: Security Group Universale "Allow All"
Il problema: Assegnare 0.0.0.0/0 su tutte le porte a "testing" e dimenticarsene in production.
Perché succede: Urgency vs. security. Il developer che chiede accesso urgentemente, il sysadmin che approva senza review. Lavo fatto — tutti lo abbiamo fatto.
Come evitarlo: Policy as code con AWS Config rules che rilevano e auto-remediano security groups permissivi.
# AWS Config rule che blocca security groups permissivi
resource "aws_config_config_rule" "restricted-sg" {
name = "restricted-common-ports-sg"
source {
owner = "AWS"
source_identifier = "INCOMING_SSH_DISABLED"
}
scope {
compliance_types = ["COMPLIANT", "NON_COMPLIANT"]
}
}
Errore 2: Peering Cross-Account Senza Route Planning
Il problema: VPC Peering creati senza considerare transitivity. A può parlare con B, B può parlare con C, quindi A parla con C? No — ma confusione causa errore umano.
Perché succede: Peering sembra semplice. Due click. Ma dimentichi che route tables devono essere aggiornate su entrambe le sides.
Come evitarlo: Documentare ogni peering con diagramma di flusso e test di connettività post-deployment con nc o telnet.
Errore 3: Nuvola Pubblica per Database Critici Senza Encryption at Rest
Il problema: RDS instances senza KMS encryption. GDPR violation in piena regola.
Perché succede: Encryption è disabilitato by default su alcune configurazioni. Terraform non forza encryption se non specificato.
Come evitarlo: Terraform module che强制 encryption su tutte le risorse data.
# Terraform che forza encryption per default
variable "enable_encryption" {
description = "Force encryption on all storage resources"
type = bool
default = true
}
resource "aws_db_instance" "main" {
# ... altre config ...
storage_encrypted = var.enable_encryption
kms_key_id = var.enable_encryption ? aws_kms_key.main.arn : null
}
Errore 4: Secrets in Environment Variables invece di Secrets Manager
Il problema: Database passwords in environment variables, visibili in AWS Console, nei log, nel codice versionato.
Perché succede: Quick & dirty. Funziona. Rotate è un nightmare ma "lo farai dopo".
Come evitarlo: AWS Secrets Manager con rotation configurata. Kubernetes External Secrets Operator se su EKS.
Errore 5: Ignoring Egress Traffic
Il problema: Security groups configurati solo per inbound. Tutto l'egress è allow by default in AWS. Un compromised workload diventa exfiltration machine.
Perché succede: Stateful per natura significa che "il default è aperto in uscita". Non pensi al outbound finché non succede qualcosa.
Come evitarlo: Security groups con egress espliciti. Site-to-Site VPN per accesso internet centralizzato e ispezionato.
Raccomandazioni Opzionee e Concrete
Usa Terraform per tutto. Mai click-ops su production. Il giorno che hai un incident e devi capire perché la regola è così, il version control è l'unica source of truth.
Implementa AWS Verified Access per applicazioni SaaS internal. Quando Zscaler o Similar costano $15/user/month, Verified Access a $6/month per accesso zero-VPN è la scelta giusta per team sotto 500 utenti.
Segmenta by ownership, not by tier. Il team di payments non dovrebbe condividere subnet con team marketing, anche se entrambi hanno web-app tier. Ownership boundary è più importante di layer boundary.
Automatizza compliance con Prowler o ScoutSuite. Scan settimanali automatici di tutte le risorse contro CIS benchmarks. Configura CloudWatch Events per alert in tempo reale su finding critici.
Quando scegliere AWS vs. Azure vs. GCP per networking:
AWS: L'ecosistema è il più maturo. Transit Gateway, PrivateLink, VPC Lattice per service mesh networking. Right choice quando hai workload eterogenei e нуждаешься в vendor lock-in controllato.
Azure: Seориентируешься su Microsoft stack (Office 365, Teams, Active Directory). Azure Virtual WAN è competitivo per branch connectivity. Good choice per hybrid scenarios con strong Windows integration.
GCP: Autopilot GKE con built-in network policies è donde il gioco. Anthos per multi-cloud management. Scegli per container-native architectures.
Il prossimo passo concreto: Audit dei tuoi security groups esistenti con questo one-liner che genera report di tutte le regole permissivе:
aws ec2 describe-security-groups \
--query 'SecurityGroups[*].{Name:GroupName,ID:GroupId,Rules:IpPermissions}' \
--output table \
--profile production | grep -E "0.0.0.0|/0|::/0"
Se l'output è più lungo di 10 righe, hai lavoro da fare.
La sicurezza rete cloud non è un progetto con data di fine. È un processo continuo di monitoraggio, adattamento, e improvement. Ma con la struttura giusta dal giorno uno, i 16 giorni di dwell time diventano ore. Il breach da 4.45 milioni diventa un near-miss investigato e bloccato. La difference tra architecture fatta bene e architecture fatta per necessity è il costo che paghi quando qualcosa va storto — e quanto recovery costa in tempo, reputation, e denaro.
Weekly cloud insights — free
Practical guides on cloud costs, security and strategy. No spam, ever.
Comments