Il portatile di uno sviluppatore scade connettendosi all’endpoint privato RDS, mentre le stesse credenziali funzionano da un host bastion. Nulla è caduto. Al percorso tra quel portatile e il database manca una di tre cose: un nome che risolve, una rotta che trasporta il traffico o una regola di gruppo di sicurezza che ammette l’origine che il database vede davvero. Scoprite quale manca prima di cambiare le altre due.

Leggete il guasto al livello giusto

Una scadenza non è un solo errore. Un nome che non risolve fallisce prima che un pacchetto lasci la macchina. Un indirizzo senza rotta manda i pacchetti in un buco nero. Una porta filtrata produce un’attesa che sembra esattamente un host sbagliato. Eseguite i passi in ordine e fermatevi al primo che fallisce.

dig +short db.internal.example
nc -vz db.internal.example 5432

Se il nome restituisce un indirizzo pubblico, o non restituisce nulla, il tunnel non è ancora il problema.

Se il nome risolve e il test della porta si blocca, confrontate l’indirizzo risolto con l’indirizzo che il database riporta. Un endpoint gestito può risolversi in un indirizzo privato dentro il VPC e in nulla di utile fuori, e un indirizzo copiato da una vecchia ricerca punterà a un host che non risponde più.

Separate il tunnel dalla rotta

Collegare una VPN client non instrada automaticamente ogni intervallo privato. Il profilo porta le rotte che il servizio spinge, e il client può installarne solo alcune. Guardate quali intervalli il client ha davvero aggiunto e se l’indirizzo del database cade dentro uno di essi.

ip route get 10.20.40.15
ip addr show tun0

Una rotta che punta all’interfaccia del tunnel è necessaria; non è sufficiente, perché il lato remoto deve ancora accettare il traffico.

I profili di tunnel diviso sono la fonte abituale di questo fallimento parziale. Funzionano per l’applicazione per cui il profilo è stato progettato e lasciano l’intervallo del database fuori dal tunnel, il che produce esattamente la scadenza che produrrebbe un firewall.

Allineate il gruppo di sicurezza all’origine reale

Il gruppo di sicurezza RDS ammette origini, non persone. Secondo l’architettura, l’origine può essere il pool di client VPN, l’indirizzo privato di un bastion o un indirizzo NAT verso cui il traffico viene tradotto. Leggete la regola e l’origine reale del pacchetto insieme.

aws ec2 describe-security-groups --group-ids sg-0123456789abcdef0 \
  --query 'SecurityGroups[].IpPermissions'

Una regola per l’indirizzo di casa di un solo portatile è un problema di manutenzione, non un progetto di accesso.

Quando una VPN client o un gateway NAT sta nel percorso, il database può vedere l’indirizzo del traduttore invece dell’indirizzo del tunnel dello sviluppatore. Per questo una regola copiata da una configurazione bastion funzionante può fallire per un portatile: i due percorsi arrivano da origini diverse anche se entrambi sembrano interni.

Preferite un percorso stretto a uno largo

Quando uno sviluppatore ha bisogno di un database, l’inoltro basato sulla sessione è spesso più economico da gestire di un tunnel di rete completo. Il client locale si connette a una porta inoltrata, e il componente remoto stabilisce la connessione al database dall’interno della rete.

ssh -N -L 5432:db.internal.example:5432 bastion.internal.example

Mantenete intatta la verifica TLS in quel progetto. Il client dovrebbe ancora validare il certificato del server rispetto al nome che si aspetta; una porta inoltrata locale non è un motivo per disattivare la verifica, e disattivarla nasconde esattamente il problema di identità che vale la pena cogliere.

La scelta tra un tunnel completo e un inoltro stretto è una decisione sulla portata, non sul teatro della sicurezza.

Lasciate dietro un percorso ripetibile

Documentate il nome dell’endpoint invece di un indirizzo risolto, l’intervallo di origine che il gruppo di sicurezza ammette e il ruolo del database che lo sviluppatore usa. Questi tre fatti spiegano la maggior parte dei fallimenti futuri senza una chiamata. Aggiungete anche la versione del profilo client, perché un cambio di profilo può rimuovere una rotta che il vecchio portava.

Poi provate una volta il caso negativo: un client fuori dall’origine approvata dovrebbe essere ancora rifiutato.

Un database privato che funziona solo per la persona che lo ha configurato non è accesso privato; è un’eccezione non documentata che attende di essere riscoperta. Scrivete il percorso, e il prossimo sviluppatore erediterà un metodo invece di un mistero.

Articoli correlati