Jednym z największych wyzwań we współczesnych realiach internetu jest uzyskanie wysokiego poziomu bezpieczeństwa. Ten artykuł opisuje proces nawiązywania bezpiecznych połączeń SSL do kontenera PostgreSQL hostowanego w chmurze UniCloud.

Pierwszym krokiem do zachowania bezpieczeństwa informacji w bazie danych PostgreSQL, jest zaszyfrowanie wszystkich połączeń w celu ochrony danych uwierzytelniających (nazw użytkowników / haseł) i danych przechowywanych w bazie przed przechwyceniem.

Poniżej opiszemy ustawienia serwera bazy danych wymagane do włączenia połączeń SSL i generowania dla nich certyfikatów. Następnie utworzymy i dodamy certyfikaty dla maszyn klienckich, na koniec ustanowimy bezpieczne połączenie do naszego serwera za pośrednictwem narzędzia pgAdmin.

Konfiguracja serwera PostgreSQL

W tym przewodniku użyjemy środowiska z serwerem bazy PostgreSQL wewnątrz – poniżej ekran pokazujący tworzenie takiego środowiska.

PostgreSQL_02

  1. Aby rozpocząć, należy połączyć się z serwerem bazy danych poprzez bramkę SSH

Wskazówka: Jeżeli nie były wcześniej wykonywane podobne operacje należy:

  1. Następnie, aby umożliwić komunikację PostgeSLQ poprzez SSL, należy dodać następujące trzy pliki do katalogu serwera /var/lib/pgsql/data:
  • server.key – klucz prywatny
  • server.crt – certyfikat serwera
  • root.crt – zaufany certyfikat główny

W tym przewodniku w skrócie opiszemy jak można wygenerować je samodzielnie.

Porady:

  • Ten opis nie wyjaśnia w szczegółach parametrów poleceń. Dodatkowe informacje można znaleźć w dokumentacji na temat generowania samodzielnie podpisywanych certyfikatów SSL na stronie dokumentacji Jelastic, pełna lista dostępnych działań jest dostępna na oficjalnej stronie OpenSSL
  • można również użyć niestandardowego certyfikatu SSL w sposób podobny do opisanego poniżej (aby go uzyskać należy przeczytać opis Generowanie samodzielnie podpisywanych certyfikatów SSL pod linkiem w poprzednim punkcie). W takim przypadku można pominąć poniższy opis generowania i przejść bezpośrednio do kroku 6 niniejszej instrukcji.

A zatem należy przejść do wspomnianego folderu i postępować zgodnie z poniższymi wskazówkami.

  1. Przede wszystkim należy wygenerować pierwszy plik – klucz prywatny:
  • wykonać następujące polecenia:
cd / var / lib / pgsql / data
openssl genrsa -des3 -out server.key 1024

PostgreSQL_04

Podczas generowania pliku server.key, padnie pytanie o pass phrase, należy podać dowolne i potwierdzić.

  • Teraz, w celu dalszych działań z tym kluczem konieczne jest usunięcie pass phrase dodanego poprzednio. W tym celu należy wykonać następujące polecenie:
openssl rsa -in server.key -out server.key

PostgreSQL_05

Trzeba ponownie podać pass phrase w celu potwierdzenia.

  • Należy ustawić odpowiednie uprawnienia i prawa własności do pliku klucza prywatnego kolejnymi poleceniami:
chmod 400 server.key

chown postgres.postgres server.key

PostgreSQL_06

  1. Teraz trzeba utworzyć certyfikat serwera na podstawie pliku server.key, np:
openssl req -new -klawisz server.key -days 3650 -out server.crt -x509 -subj‘/C=US/ST=California/L=PaloAlto/O=Jelastic/CN=mysite.com/emailAddress=mail@jelastic.com'

PostgreSQL_07

Uwaga: Wymagane jest podanie swoich danych osobowych dla parametru subj jeśli certyfikat jest przeznaczony do stosowania w produkcji:

PostgreSQL_08

Można też pominąć parametr -subj w ramach polecenia i przekazać te argumenty w trybie interaktywnym.

  1. Ponieważ mamy zamiar podpisać certyfikaty samodzielnie, wygenerowany certyfikat serwera może być używany również jako zaufany certyfikat główny, tak więc należy go skopiować z odpowiednią nazwą:
cp server.crt root.crt

PostgreSQL_09

Teraz, gdy mamy wszystkie trzy pliki certyfikatów, można przystąpić do konfiguracji bazy PostgreSQL wymaganej do aktywacji SSL.

  1. Należy otworzyć plik pg_hba.conf znajdujący się w tym samym folderze do edycji w dowolnym edytorze w połączeniu terminalowym lub bezpośrednio w panelu sterowania.

Należy zamienić domyślną treść na następującą:

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
# "local" is for Unix domain socket connections only
local   all      all            trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust

# IPv4 remote connections for authenticated users
hostssl all         webadmin    0.0.0.0/0             md5 clientcert=1

PostgreSQL_10

Wskazówka: W przypadku, gdy mamy zamiar pracować z bazą danych nie jako użytkownik domyślny Webadmin, należy zmienić odpowiednią wartość w ostatnim wierszu pliku na odpowiednią nazwę. Należy pamiętać, że w tym przypadku trzeba użyć tej samej nazwy użytkownika dla wszystkich kolejnych poleceń (będziemy zaznaczać, gdzie jest to wymagane)

Zapisz zaktualizowany plik.

  1. Aby zakończyć konfigurację, trzeba wprowadzić jeszcze kilka zmian w pliku conf.

Należy przejść do sekcji Security and Authentication (w przybliżeniu około 80 linii) i aktywować używanie SSL poprzez odkomentowanie ustawienia o tej samej nazwie, zmieniając jego wartość na “on”. Ponadto, należy dodać nowy parametr ssl_ca_file poniżej:

ssl = on
ssl_ca_file = 'root.crt'

PostgreSQL_11

Oczywiście należy zapisać zmiany w pliku.

  1. Należy uruchomić ponownie kontener PostgreSQL, aby zastosować nowe ustawienia:
sudo service postgresql restart

PostgreSQL_13

Certyfikaty klienckie

Teraz stwórzmy kolejny zestaw plików certyfikatów SSL dla instancji klienta, dla umożliwienia bezpiecznego połączenia w obie strony.

  1. Należy przejść do okna terminala z połączenia SSH do serwera PostgreSQL które było używane na etapie jego konfiguracji lub podłączyć się ponownie – dla dalszych działań potrzebne będą certyfikaty serwera.

W sesji terminalowej należy wygenerować klucz prywatny do klienta (także bez pass phrase, podobnie jak to miało miejsce w poprzedniej sekcji), na przykład w katalogu tmp:

openssl genrsa -des3 -out /tmp/postgresql.key 1024

openssl rsa -in /tmp/postgresql.key -out /tmp/postgresql.key

PostgreSQL_13

  1. Następnie należy utworzyć certyfikat SSL dla użytkownika bazy danych PostgreSQL (domyślnie webadmin) i podpisać przy pomocy naszego zaufanego pliku root.crt na serwerze.
openssl req -new -klawisz /tmp/postgresql.key -out /tmp/postgresql.csr -subj '/ c = US / ST = California / L = PaloAlto / O = Jelastic / CN = webadmin'

openssl x509 -req -w /tmp/postgresql.csr -ca root.crt -CAkey server.key -out /tmp/postgresql.crt -CAcreateserial

Uwaga:

  • mimo że zestaw danych dla parametru subj można zmienić na swoje dane osobowe, to nazwa zwyczajowa (common name, / CN =) musi być taka sama jak nazwa użytkownika bazy danych ustawionego podczas pierwszej generacji certyfikatu w pliku konfiguracyjnym serwera (webadmin w naszym przypadku)
  • pliki root.crt i server.key powinny znajdować się w tym samym folderze, w którym wykonywane jest drugie polecenie, w przeciwnym wypadku należy podać pełną ścieżkę dostępu do nich

PostgreSQL_14

  1. Po wygenerowaniu plików key, postgresql.crt, root.crt trzeba je przenieść do do folderu .postgresql na komputerze klienckim (w tym celu można użyć klienta FTP lub po prostu skopiować i wkleić zawartość plików).

Wskazówka: Jeśli taki katalog nie istnieje, należy go utworzyć poleceniem mkdir ~/.postgresql lub poleceniem odpowiednim dla danej dystrybucji systemu operacyjnego.

PostgreSQL_15

Dodatkowo, można dla pliku klucza ustawić uprawnienia odczytu tylko dla właściciela poleceniem chmod 0400 ~/.postgresql/postgresql.key dla bezpieczeństwa.

Wskazówka: Po wykonaniu tych działań należy usunąć klucze z katalogu tmp na serwerze bazy danych.

Ustanawianie połączenia poprzez pgAdmin

W końcu, po wykonaniu konfiguracji serwera i klienta, możemy nawiązać połączenie. W naszym przypadku, dla przykładu, użyjemy narzędzia pgAdmin 3. Zakładamy, że aplikacja została zainstalowana już wcześniej.

  1. W celu połączenia się z serwerem bazy danych poprzez SSL potrzebujemy albo publicznego adresu IP albo punktu końcowego połączonego z kontenerem bazy danych PostgreSQL.

Rozważymy ten drugi przypadek – należy włączyć panel Ustawienia środowiska, przejść do sekcji Mapowanie portów i dodać nowy punkt końcowy przy pomocy przycisku Dodaj.

PostgreSQL_16

  1. Mając dodany punkt dostępu, należy uruchomić klienta pgAdmin 3 i wybrać opcję New Server Registration.

PostgreSQL_17

Na karcie Properties należy podać następujące dane:

  • Name – dowolna nazwa połączenia (np ssl-to-pgsql)
  • Host – punkt dostępu dodany w pierwszym etapie (Publiczny adres IP lub URL punktu końcowego bez numeru portu)
  • Port – należy użyć domyślnego portu 5432 dla zewnętrznego IP lub portu publicznego dla punktu końcowego użytkownika (widocznego w panelu konfiguracyjnym w odpowiedniej kolumnie)
  • Nazwa użytkownika – użytkownik bazy danych dla którego został wygenerowany certyfikat SSL i wykonana konfiguracja (domyślnie webadmin)
  • Hasło – hasło odpowiedniego użytkownika (wysyłane za pośrednictwem poczty elektronicznej)

Pozostałe pola mogą pozostać bez zmian lub można je dostosować do własnych potrzeb.

  1. Następnie należy przejść do karty SSL i dla pozycji SSL wybrać z listy rozwijanej opcję require.

PostgreSQL_18

To wszystko – wymagane certyfikaty zostaną załadowane automatycznie podczas pierwszego połączenia, więc wystarczy kliknąć przycisk OK, aby rozpocząć zarządzanie bazą danych za pośrednictwem bezpiecznego połączenia.

Teraz można powiązać swoją aplikację z bazą danych (użyj poradnika połączenia z bazą danych jako przykładu) i włączyć konfigurację SSL dla danego projektu w celu szyfrowania danych podczas pobierania / przesyłania.

Otagowano: