Wymagaj SSL, miej włączony SELinux, monitoruj logi i używaj aktualnej wersji PostgreSQL .
Po stronie serwera
Wymagaj SSL
W postgresql.conf
zestawie ssl=on
i upewnij się, że plik klucza i plik certyfikatu są odpowiednio zainstalowane (zobacz dokumenty i komentarze w postgresql.conf
).
Może być konieczne wykupienie certyfikatu od urzędu certyfikacji, jeśli chcesz, aby klienci ufali mu bez specjalnej konfiguracji na kliencie.
W pg_hba.conf
użyciu coś takiego:
hostssl theuser thedatabase 1.2.3.4/32 md5
... prawdopodobnie z „all” dla użytkownika i / lub bazy danych oraz ewentualnie z szerszym źródłowym filtrem adresów IP.
Ogranicz użytkowników, którzy mogą się zalogować, odmów logowania do zdalnego administratora
Nie zezwalaj użytkownikom na „wszystko”, jeśli to możliwe; nie chcesz zezwalać na logowanie superużytkownika zdalnie, jeśli możesz tego uniknąć.
Ogranicz prawa użytkowników
Ogranicz prawa użytkowników, którzy mogą się zalogować. Nie udzielaj im CREATEDB
ani CREATEUSER
praw.
REVOKE
CONNECT
prawo od PUBLIC
wszystkich baz danych, a następnie oddać tylko do użytkowników / ról, które powinny mieć dostęp do tej bazy danych. (Grupuj użytkowników w role i przyznawaj uprawnienia rolom, a nie bezpośrednio poszczególnym użytkownikom).
Upewnij się, że użytkownicy z dostępem zdalnym mogą łączyć się tylko z tymi DB, których potrzebują, i mają prawa tylko do schematów, tabel i kolumn w obrębie, których faktycznie potrzebują. Jest to dobra praktyka również dla lokalnych użytkowników, to po prostu rozsądne bezpieczeństwo.
Konfiguracja klienta
W PgJDBC przekaż parametrssl=true
:
Aby poinstruować sterownik JDBC o próbie nawiązania połączenia SSL, należy dodać parametr adresu URL połączenia ssl = true.
... i zainstaluj certyfikat serwera w magazynie zaufania klienta lub użyj certyfikatu serwera, któremu ufa jeden z urzędów certyfikacji we wbudowanym magazynie zaufanych certyfikatów Java, jeśli nie chcesz, aby użytkownik musiał zainstalować certyfikat.
Trwająca akcja
Teraz upewnij się, że aktualizujesz PostgreSQL . PostgreSQL ma tylko kilka luk w zabezpieczeniach przed uwierzytelnieniem, ale jest to więcej niż zero, więc bądź na bieżąco. W każdym razie powinieneś, poprawki błędów to dobra rzecz.
Dodaj zaporę z przodu, jeśli istnieją duże bloki / regiony, o których wiesz, że nigdy nie potrzebujesz dostępu.
Rejestruj połączenia i rozłączenia (patrz postgresql.conf
). Rejestruj zapytania, jeśli jest to praktyczne. Uruchom system wykrywania włamań lub fail2ban lub podobny z przodu, jeśli jest to praktyczne. W przypadku fail2ban z postgresiem jest wygodny poradnik tutaj
Monitoruj pliki dziennika.
Bonusowa paranoja
Dodatkowe kroki, aby pomyśleć o ...
Wymagaj certyfikatów klienta
Jeśli chcesz, możesz także użyć pg_hba.conf
żądania, aby klient przedstawił certyfikat klienta X.509 zaufany przez serwer. Nie musi używać tego samego urzędu certyfikacji co certyfikat serwera, możesz to zrobić za pomocą homebrew openssl CA. Użytkownik JDBC musi zaimportować certyfikat klienta do swojego magazynu kluczy Java keytool
i ewentualnie skonfigurować niektóre właściwości systemu JSSE, aby wskazywał Javę w swoim magazynie kluczy, więc nie jest to całkowicie przezroczyste.
Poddaj kwarantannie instancję
Jeśli chcesz być naprawdę paranoikiem, uruchom instancję dla klienta w osobnym kontenerze / maszynie wirtualnej lub przynajmniej na innym koncie użytkownika, używając tylko potrzebnej bazy danych.
W ten sposób, jeśli skompromitują instancję PostgreSQL, nie dostaną się dalej.
Użyj SELinux
Nie powinienem tego mówić, ale ...
Uruchom maszynę z obsługą SELinux, taką jak RHEL 6 lub 7, i nie wyłączaj SELinuksa ani nie włączaj go w tryb zezwolenia . Trzymaj go w trybie wymuszania.
Użyj portu innego niż domyślny
Bezpieczeństwo tylko przez zaciemnienie to głupota. Bezpieczeństwo, które wykorzystuje trochę niejasności po wykonaniu rozsądnych czynności, prawdopodobnie nie zaszkodzi.
Uruchom Pg na porcie innym niż domyślny, aby utrudnić życie automatycznym atakującym.
Umieść serwer proxy z przodu
Możesz także uruchomić PgBouncer lub PgPool-II przed PostgreSQL, działając jako pula połączeń i proxy. W ten sposób możesz pozwolić proxy obsługiwać SSL, a nie prawdziwego hosta bazy danych. Serwer proxy może znajdować się na osobnej maszynie wirtualnej lub maszynie.
Korzystanie z serwerów proxy pul połączeń jest ogólnie dobrym pomysłem w PostgreSQL, chyba że aplikacja kliencka ma już wbudowaną pulę. Większość serwerów aplikacji Java, Railsów itp. Ma wbudowane buforowanie. Nawet wtedy serwer proxy po stronie serwera jest w najgorszym wypadku nieszkodliwy.