Laptop programisty przekracza limit czasu przy łączeniu z prywatnym punktem końcowym RDS, podczas gdy te same dane logowania działają z hosta bastionu. Nic nie padło. Ścieżce między tym laptopem a bazą danych brakuje jednej z trzech rzeczy: nazwy, która się rozwiązuje, trasy, która niesie ruch, albo reguły w grupie zabezpieczeń, która przepuszcza źródło faktycznie widziane przez bazę danych. Ustal, czego brakuje, zanim zmienisz pozostałe dwie.

Czytaj awarię na właściwej warstwie

Przekroczenie limitu czasu nie jest jednym błędem. Nazwa, która się nie rozwiązuje, zawodzi, zanim pakiet opuści maszynę. Adres bez trasy wysyła pakiety w czarną dziurę. Filtrowany port daje oczekiwanie, które wygląda dokładnie jak zły host. Wykonaj kroki po kolei i zatrzymaj się na pierwszym, który zawiedzie.

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

Jeśli nazwa zwraca adres publiczny albo nic, tunel jeszcze nie jest problemem.

Jeśli nazwa się rozwiązuje, a test portu wisi, porównaj rozwiązany adres z adresem zgłaszanym przez bazę danych. Zarządzany punkt końcowy może rozwiązać się na prywatny adres wewnątrz VPC i na nic użytecznego poza nim, a adres skopiowany ze starego wyszukiwania wskaże host, który już nie odpowiada.

Oddziel tunel od trasy

Połączenie z VPN klienta nie trasuje automatycznie każdego zakresu prywatnego. Profil niesie trasy wypychane przez usługę, a klient może zainstalować tylko niektóre z nich. Sprawdź, które zakresy klient faktycznie dodał i czy adres bazy danych mieści się w jednym z nich.

ip route get 10.20.40.15
ip addr show tun0

Trasa wskazująca interfejs tunelu jest konieczna; nie jest wystarczająca, bo druga strona nadal musi przyjąć ruch.

Profile tunelu dzielonego są zwykłym źródłem tej połowicznej awarii. Działają dla aplikacji, dla której profil powstał, i zostawiają zakres bazy danych poza tunelem, co daje dokładnie taki limit czasu, jaki dałaby zapora.

Dopasuj grupę zabezpieczeń do rzeczywistego źródła

Grupa zabezpieczeń RDS wpuszcza źródła, nie ludzi. W zależności od architektury źródłem może być pula klientów VPN, prywatny adres bastionu albo adres NAT, na który tłumaczony jest ruch. Czytaj regułę i rzeczywiste źródło pakietu razem.

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

Reguła dla domowego adresu jednego laptopa to problem utrzymania, a nie projekt dostępu.

Gdy na ścieżce stoi VPN klienta albo brama NAT, baza danych może widzieć adres tłumacza zamiast adresu tunelu programisty. Dlatego reguła skopiowana z działającej konfiguracji bastionu może zawieść dla laptopa: obie ścieżki przychodzą z różnych źródeł, choć obie wyglądają na wewnętrzne.

Preferuj wąską ścieżkę zamiast szerokiej

Gdy jeden programista potrzebuje jednej bazy danych, przekazywanie oparte na sesji jest często tańsze w utrzymaniu niż pełny tunel sieciowy. Lokalny klient łączy się z przekierowanym portem, a zdalny komponent nawiązuje połączenie z bazą od wewnątrz sieci.

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

Zachowaj w tym projekcie weryfikację TLS bez zmian. Klient nadal powinien sprawdzać certyfikat serwera względem oczekiwanej nazwy; lokalny przekierowany port nie jest powodem do wyłączenia weryfikacji, a jej wyłączenie ukrywa dokładnie ten problem tożsamości, który warto złapać.

Wybór między pełnym tunelem a wąskim przekazywaniem to decyzja o zakresie, nie o teatrze bezpieczeństwa.

Zostaw po sobie powtarzalną ścieżkę

Udokumentuj nazwę punktu końcowego zamiast rozwiązanego adresu, zakres źródłowy wpuszczany przez grupę zabezpieczeń i rolę bazy danych, której używa programista. Te trzy fakty wyjaśniają większość przyszłych awarii bez telefonu. Dodaj też wersję profilu klienta, bo zmiana profilu może usunąć trasę, którą niósł stary.

Potem raz sprawdź przypadek negatywny: klient spoza zatwierdzonego źródła nadal powinien zostać odrzucony.

Prywatna baza danych, która działa tylko dla osoby, która ją skonfigurowała, nie jest prywatnym dostępem; to nieudokumentowany wyjątek czekający na ponowne odkrycie. Zapisz ścieżkę, a następny programista odziedziczy metodę zamiast zagadki.

Powiązane artykuły