Co to jest TLS?
TLS (Transport Layer Security) to protokół szyfrowania i zabezpieczania połączeń sieciowych, który chroni transmisję danych między aplikacją a bazą danych (np. PostgreSQL). Jest to ulepszona wersja wcześniejszego protokołu SSL (Secure Sockets Layer) i stanowi standard w zabezpieczaniu komunikacji sieciowej, aby chronić dane przed przechwyceniem i modyfikacją przez osoby trzecie.
Dlaczego TLS jest istotny przy połączeniu z bazą danych PostgreSQL?
Podczas połączenia aplikacji z bazą danych PostgreSQL, dane mogą być narażone na przechwycenie, jeśli przesyłane są przez sieć bez szyfrowania. TLS tworzy zaszyfrowany kanał między aplikacją a bazą danych, dzięki czemu zachowujemy poufność, zapewniamy integralność danych i weryfikujemy tożsamość serwera. Co to oznacza? Przez zachowanie poufności rozumiemy tyle, że dane przesyłane przez sieć są szyfrowane, co uniemożliwia ich odczytanie przez osoby trzecie. Przy zapewnieniu integralności danych chodzi o to, że TLS chroni dane przed modyfikacją i gwarantuje, że nie zostaną one zmodyfikowane w trakcie trwania transmisji. Jeśli chodzi o weryfikację tożsamości serwera to TLS umożliwia aplikacji sprawdzenie, czy łączy się z prawdziwym serwerem PostgreSQL, a nie z fałszywym serwerem podszywającym się pod bazę danych.
Proces połączenia TLS między aplikacją a bazą danych PostgreSQL.
Cały proces połączenia aplikacji z bazą danych PostgreSQL możemy podzielić na kilka etapów, które króciutko zostaną omówione poniżej.
Inicjalizacja połączenia przez aplikację.
Powiedzmy, że jesteśmy użytkownikiem który chce skorzystać z aplikacji która łączy się z bazą danych osadzoną na serwerze PostgreSQL. Żeby rozpocząć pracę z aplikacją wprowadzamy do niej dane uwierzytelniające, czyli nazwę użytkownika oraz hasło. W aplikacji zdefiniowane są parametry połączenia np. wymóg użycia szyfrowania TLS, np. ustawienie sslmode=require. W przypadku PostgreSQL najczęściej używa się parametru sslmode, aby wskazać, że połączenie ma być zabezpieczone. Opcje ustawień sslmode to np. require (wymagaj szyfrowania) lub verify-full (wymagaj szyfrowania i weryfikacji tożsamości serwera). Aplikacja przygotowuje połączenie, przesyłając do serwera PostgreSQL prośbę o nawiązanie sesji.
Wymiana informacji o szyfrowaniu (negocjacja).
Serwer PostgreSQL odpowiada na prośbę klienta (aplikacji) i inicjuje tzw. „handshake” TLS, proces negocjacji używanych algorytmów szyfrowania. Serwer przesyła klientowi listę obsługiwanych protokołów szyfrujących i zestawów algorytmów szyfrujących (np. AES, RSA) oraz wersję protokołu TLS, której może używać (np. TLS 1.2 lub TLS 1.3) i ustalają, jakie protokoły szyfrowania i zestaw algorytmów szyfrujących będą używane.
Wymiana kluczy i certyfikatów.
Serwer PostgreSQL wysyła swój certyfikat cyfrowy do aplikacji, który służy do uwierzytelnienia serwera. Certyfikat serwera jest dokumentem cyfrowym wydanym przez zaufany urząd certyfikacji (ang. Certificate Authority, CA) lub samopodpisanym, który potwierdza swoją tożsamość (serwera). Zawiera on klucz publiczny serwera, który posłuży do szyfrowania wymiany danych. Aplikacja weryfikuje ten certyfikat, aby upewnić się, że serwer jest autentyczny. Jeśli certyfikat jest samopodpisany, aplikacja musi być skonfigurowana, aby „ufać” temu certyfikatowi. Dodatkowo klient, czyli aplikacja, weryfikuje certyfikat serwera pod kątem: czy jest ważny i czy nie wygasł.
Ustalanie klucza sesji do szyfrowania.
Po zweryfikowaniu certyfikatu serwera, klient i serwer przechodzą do ustalania tzw. klucza sesji, który będzie wykorzystywany do szyfrowania danych podczas sesji. Klucz sesji jest generowany na podstawie wybranego (ustalonego wcześniej podczas negocjacji) algorytmu szyfrowania i jest unikalny dla konkretnego połączenia. Ustalanie klucza odbywa się przez wymianę kluczy (ang. key exchange), która pozwala na wspólne uzgodnienie klucza sesji bez jego jawnego przesyłania przez sieć.
Szyfrowanie danych.
Po ustaleniu klucza sesji, wszystkie dane przesyłane między aplikacją a serwerem PostgreSQL są szyfrowane za pomocą tego klucza. Dzięki temu wszystkie zapytania SQL, odpowiedzi oraz dane uwierzytelniające są bezpieczne i zaszyfrowane, co chroni je przed przechwyceniem.
Uwierzytelnienie klienta czyli weryfikacja jego tożsamości.
Po zestawieniu połączenia TLS (czyli zabezpieczonego szyfrowaniem), aplikacja przesyła dane uwierzytelniające użytkownika: login i hasło. Dane uwierzytelniające są zaszyfrowane kluczem sesji, co chroni je przed potencjalnym przechwyceniem w sieci.
W niektórych przypadkach serwer PostgreSQL może wymagać dodatkowego uwierzytelnienia klienta przy użyciu certyfikatu klienta (ang. client certificate). Jeśli serwer wymaga takiej weryfikacji, aplikacja przesyła swój certyfikat, który serwer sprawdza, aby potwierdzić jej tożsamość. Dzięki temu serwer może upewnić się, że łączy się z autoryzowaną aplikacją.
Przesyłanie danych przez zaszyfrowany kanał.
Po pomyślnym uwierzytelnieniu i autoryzacji klienta, cała komunikacja między aplikacją a bazą danych jest szyfrowana, a każda wiadomość jest chroniona przed modyfikacją (integralność danych). Dane są przesyłane w zaszyfrowanej formie od momentu zestawienia połączenia do jego zakończenia, co chroni je przed odczytem i ingerencją przez osoby niepowołane.
Zakończenie sesji.
Po zakończeniu pracy, aplikacja zamyka połączenie z bazą danych. Klucz sesji, który służył do szyfrowania połączenia, przestaje obowiązywać, co uniemożliwia dalszą transmisję danych po zamknięciu połączenia.
Zalet korzystania z TLS w PostgreSQL.
Bezpieczeństwo transmisji.
Wszystkie dane są przesyłane w formie zaszyfrowanej, co chroni je przed przechwyceniem.
Integralność danych.
Mechanizmy TLS zapewniają, że dane nie zostały zmodyfikowane podczas transmisji.
Uwierzytelnienie serwera.
Certyfikat serwera potwierdza jego tożsamość, dzięki czemu aplikacja wie, że łączy się z właściwym serwerem PostgreSQL.
Opcjonalne uwierzytelnienie klienta.
Jeśli jest wymagana dodatkowa warstwa bezpieczeństwa, PostgreSQL może wymagać certyfikatu klienta, co wzmacnia zabezpieczenia po stronie aplikacji.