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.
- 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:
- wygenerować parę kluczy SSH
- dodać swój publiczny klucz SSH do panelu sterującego
- uzyskać dostęp do konta za pośrednictwem protokołu SSH
- 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.
- 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
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
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
- 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'
Uwaga: Wymagane jest podanie swoich danych osobowych dla parametru subj jeśli certyfikat jest przeznaczony do stosowania w produkcji:
Można też pominąć parametr -subj w ramach polecenia i przekazać te argumenty w trybie interaktywnym.
- 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
Teraz, gdy mamy wszystkie trzy pliki certyfikatów, można przystąpić do konfiguracji bazy PostgreSQL wymaganej do aktywacji SSL.
- 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
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.
- 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'
Oczywiście należy zapisać zmiany w pliku.
- Należy uruchomić ponownie kontener PostgreSQL, aby zastosować nowe ustawienia:
sudo service postgresql restart
Certyfikaty klienckie
Teraz stwórzmy kolejny zestaw plików certyfikatów SSL dla instancji klienta, dla umożliwienia bezpiecznego połączenia w obie strony.
- 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
- 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
- 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.
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.
- 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.
- Mając dodany punkt dostępu, należy uruchomić klienta pgAdmin 3 i wybrać opcję New Server Registration.
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.
- Następnie należy przejść do karty SSL i dla pozycji SSL wybrać z listy rozwijanej opcję require.
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.