Bezpieczeństwo bazy danych PostgreSQL
Bezpieczeństwo danych to fundament każdego profesjonalnego systemu IT. PostgreSQL, jako jedna z najbardziej zaawansowanych baz danych typu open source, oferuje szereg mechanizmów, które pozwalają skutecznie chronić dane – zarówno przed dostępem osób nieuprawnionych, jak i przed błędami aplikacji, utratą danych czy atakami z zewnątrz.
1. Autoryzacja i uwierzytelnianie (authentication & authorization)
I. Mechanizmy uwierzytelniania
- PostgreSQL obsługuje wiele metod logowania użytkowników, m.in.:
- md5 / scram-sha-256 – hasła przechowywane w formie zahashowanej (zalecane: SCRAM od wersji 10+)
- peer / ident – logowanie na podstawie użytkownika systemowego
- certyfikaty SSL – uwierzytelnianie za pomocą certyfikatów klienta
- GSSAPI, LDAP, PAM, Kerberos – integracja z systemami zewnętrznymi
Zasady uwierzytelniania konfiguruje się w pliku pg_hba.conf, gdzie dokładnie określamy:
- kto (użytkownik)
- skąd (adres IP lub domena)
- jak (metoda uwierzytelniania)
- do jakiej bazy może się połączyć
II. Uprawnienia użytkowników i ról
- PostgreSQL stosuje model ról (roles) – można tworzyć użytkowników i grupy z przypisanymi prawami
- Dobrą praktyką jest przyznawanie tylko minimalnych niezbędnych uprawnień (zasada least privilege)
- Uprawnienia kontrolują dostęp do tabel, widoków, funkcji, sekwencji, schematów, itp.
- Można stosować definiowane przez użytkownika role (np. analyst, readonly, admin) i nadawać je dynamicznie
2. Szyfrowanie danych (encryption)
I. Szyfrowanie połączeń (SSL/TLS)
- PostgreSQL wspiera szyfrowane połączenia klient-serwer (SSL/TLS)
- Zaleca się wymuszenie połączeń SSL przez ustawienie hostssl w pg_hba.conf i ssl = on w postgresql.conf
- Można też używać certyfikatów klienta do uwierzytelniania
II. Szyfrowanie danych w spoczynku
PostgreSQL nie szyfruje danych na dysku natywnie, ale można to zrealizować:
- na poziomie systemu plików (np. dm-crypt, LUKS)
- poprzez kontenery szyfrujące (np. ZFS, ecryptfs)
- w chmurze – dostawcy typu AWS/GCP/Azure oferują szyfrowanie storage’u na poziomie usługi
III. Szyfrowanie danych w aplikacji
- Wrażliwe dane (np. hasła, PESEL, dane finansowe) można szyfrować na poziomie aplikacji lub z użyciem rozszerzeń (np. pgcrypto)
3. Izolacja danych i bezpieczeństwo na poziomie wierszy
PostgreSQL wspiera tzw. Row Level Security (RLS):
- Umożliwia definiowanie reguł, które ograniczają dostęp do poszczególnych wierszy w tabeli na podstawie zalogowanego użytkownika
- Dzięki temu można w bezpieczny sposób przechowywać dane różnych użytkowników w tej samej tabeli (np. w aplikacjach SaaS)
4. Ochrona przed SQL Injection i innymi atakami
- PostgreSQL obsługuje przygotowane zapytania (prepared statements), które są skuteczne przeciwko SQL Injection
- Można korzystać z ORM (np. SQLAlchemy, Django ORM), które domyślnie parametryzują zapytania
- Warto włączyć logowanie błędnych zapytań (log_statement, log_min_error_statement) w postgresql.conf
5. Logowanie i audyt bezpieczeństwa
PostgreSQL umożliwia szczegółowe logowanie aktywności, m.in.:
- logowanie wszystkich zapytań (log_statement = 'all’)
- błędów uwierzytelniania (log_connections, log_disconnections)
- operacji na poziomie użytkownika (log_duration, log_checkpoints)
Można używać zewnętrznych narzędzi do analizy logów, takich jak:
- pgAudit – rozszerzenie pozwalające logować operacje DML i DDL na poziomie szczegółowym
- pgBadger – generator raportów na podstawie logów PostgreSQL
6. Kopie zapasowe i disaster recovery
Podstawą bezpieczeństwa danych są regularne backupy:
- pg_dump / pg_dumpall – dla pojedynczych baz lub całej instancji
- pg_basebackup + WAL archiving – do backupów ciągłych i przywracania do wybranego momentu
- Barman / pgBackRest – profesjonalne narzędzia do zarządzania backupami i archiwizacją WAL