Kontakt
Close

Bezpieczeństwo

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