Si të aktivizoni SSL për lidhjet PostgreSQL


Si parazgjedhje, të gjitha lidhjet PostgreSQL janë të pasigurta, gjë që mund të shkaktojë probleme sigurie kur ekzekutohet në mjedise prodhimi me trafik të lartë. Kriptimi SSL siguron që çdo e dhënë e transferuar të mos përgjohet nga askush në mes të një lidhjeje.

Ky tutorial do t'ju mësojë se si të aktivizoni SSL/TLS për lidhjet PostgreSQL.

Parakushtet

  • A Linux server. For our tutorial, we are running a Ubuntu 22.04 server.

  • A non-root sudo user.

  • A fully qualified domain name (FQDN) like postgresql.example.com.

  • Make sure everything is updated.

    $ sudo apt update
    $ sudo apt upgrade
    
  • Few packages that your system needs.

    $ sudo apt install curl nano software-properties-common apt-transport-https ca-certificates lsb-release ubuntu-keyring -y
    

    Some of these packages may already be installed on your system.

Hapi 1 - Konfiguro Firewall

Para se të instaloni ndonjë paketë, hapi i parë është konfigurimi i murit të zjarrit për të hapur portat për HTTP, HTTPS dhe PostgreSQL.

Kontrolloni statusin e murit të zjarrit.

$ sudo ufw status

Ju duhet të shihni diçka si më poshtë.

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Hapni portat HTTP, HTTPS dhe PostgreSQL në murin e zjarrit.

$ sudo ufw allow 5432
$ sudo ufw allow http
$ sudo ufw allow https

Kontrolloni statusin përsëri për të konfirmuar.

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
80/tcp                     ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
5432                       ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
80/tcp (v6)                ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)
5432 (v6)                  ALLOW       Anywhere (v6)             

Hapi 2 - Instaloni PostgreSQL 14

Ubuntu 22.04 dërgohet me PostgreSQL 14 si parazgjedhje. Për të instaluar, lëshoni komandën e mëposhtme.

$ sudo apt install postgresql postgresql-contrib

Paketa postgresql-contrib përmban disa shërbime shtesë.

Ju gjithashtu mund të përdorni depo zyrtare APT të PostgreSQLs për të instaluar. Ekzekutoni komandën e mëposhtme për të shtuar çelësin PostgreSQL GPG.

$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /usr/share/keyrings/postgresql-key.gpg >/dev/null

Shtoni depo APT në listën tuaj të burimeve.

$ sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/postgresql-key.gpg arch=amd64] http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

Përditësoni depon e sistemit.

$ sudo apt update

Tani, mund të instaloni PostgreSQL duke përdorur komandën e përmendur më lart.

Kontrolloni statusin e shërbimit PostgreSQL.

$ sudo systemctl status postgresql
? postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-12-12 00:01:06 UTC; 19s ago
   Main PID: 3497 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Dec 12 00:01:06 postgresql systemd[1]: Starting PostgreSQL RDBMS...
Dec 12 00:01:06 postgresql systemd[1]: Finished PostgreSQL RDBMS.

Mund të shihni që shërbimi është aktivizuar dhe funksionon si parazgjedhje.

Vendosni fjalëkalimin për llogarinë postgres.

$ sudo -i -u postgres psql -c "ALTER USER postgres PASSWORD '<new_password>';"

Hapi 3 - Instaloni SSL

Për të instaluar një certifikatë SSL duke përdorur Lets Encrypt, duhet të shkarkojmë mjetin Certbot. Ne do të përdorim instaluesin e paketës Snapd për këtë. Ubuntu 22.04 vjen i para-instaluar me Snap.

Sigurohuni që versioni juaj i Snapd të jetë i përditësuar.

$ sudo snap install core 
$ sudo snap refresh core

Instaloni Certbot.

$ sudo snap install --classic certbot

Përdorni komandën e mëposhtme për të siguruar që komanda Certbot të ekzekutohet duke krijuar një lidhje simbolike në drejtorinë /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Gjeneroni një certifikatë SSL.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d postgresql.example.com

Komanda e mësipërme do të shkarkojë një certifikatë në drejtorinë /etc/letsencrypt/live/postgresql.example.com në serverin tuaj.

Krijo një certifikatë grupi Diffie-Hellman.

$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

Hapi 4 - Konfiguro rinovimin e Certbot për PostgreSQL

PostgreSQL nuk ka leje për të hyrë në certifikatat nga dosja Lets Encrypt, prandaj nuk mund t'i themi që të përdorë certifikatat nga dosja drejtpërdrejt. Alternativa është të kopjoni certifikatat në drejtorinë PostgreSQL, por kjo funksionon vetëm përkohësisht pasi ato do të skadojnë dhe do t'ju duhet t'i kopjoni përsëri manualisht.

Metoda më e mirë është të përdorni një grep rinovimi i cili do të funksionojë automatikisht në çdo rinovim dhe do të kryejë operacionet e kopjimit.

Kërkoni direktorinë e të dhënave PostgreSQL.

$ sudo -i -u postgres psql -U postgres -c 'SHOW data_directory'

Krijoni skedarin e rinovimit dhe hapeni për redaktim.

$ sudo nano /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

Vendos kodin e mëposhtëm në të.

#!/bin/bash
umask 0177
DOMAIN=postgresql.example.com
DATA_DIR=/var/lib/postgresql/15/main
cp /etc/letsencrypt/live/$DOMAIN/fullchain.pem $DATA_DIR/server.crt
cp /etc/letsencrypt/live/$DOMAIN/privkey.pem $DATA_DIR/server.key
chown postgres:postgres $DATA_DIR/server.crt $DATA_DIR/server.key
# only for SELinux - CentOS, Red Hat
# chcon -t postgresql_db_t $DATA_DIR/server.crt $DATA_DIR/server.key

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Bëjeni skedarin të ekzekutueshëm.

$ sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/postgresql.sh

Hapi 5 - Konfiguro PostgreSQL

Gjeni shtegun për skedarin e konfigurimit PostgreSQL.

$ sudo -i -u postgres psql -U postgres -c 'SHOW config_file'

Hapni skedarin për redaktim.

$ sudo nano /etc/postgresql/15/main/postgresql.conf

Gjeni seksionin Cilësimet e lidhjes dhe hiqni komentin e ndryshores listen_address dhe ndryshoni vlerën e saj në *. Sigurohuni që të duket si më poshtë.

listen_address = '*'		# what IP address(es) to listen on;

Gjeni seksionin SSL dhe modifikoni skedarin që të përputhet me vlerat e mëposhtme.

ssl = on  
ssl_cert_file = 'server.crt'  
ssl_key_file = 'server.key'  
ssl_prefer_server_ciphers = on
ssl_dh_params_file = '/etc/ssl/certs/dhparam.pem'

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Hapi 6 - Konfiguro lidhjen PostgreSQL

Hapni skedarin /etc/postgresql/15/main/pg_hba.conf për modifikim.

$ sudo nano /etc/postgresql/15/main/pg_hba.conf

Shtoni rreshtin e mëposhtëm për të aktivizuar SSL për PostgreSQL.

hostssl all  all  0.0.0.0/0  scram-sha-256

Ruani skedarin duke shtypur Ctrl + X dhe duke futur Y kur ju kërkohet.

Hapi 7 - Rinovoni certifikatën

Drejtoni komandën e mëposhtme për të kryer një rinovim të detyruar. Kjo do të aktivizojë skriptin e vendosjes i cili kopjon certifikatat në vendndodhjen e duhur për PostgreSQL për t'u përdorur.

$ sudo certbot renew --force-renewal

Verifikoni që certifikatat janë kopjuar në drejtorinë e të dhënave PostgreSQL.

$ sudo ls /var/lib/postgresql/15/main/

Do të shihni daljen e mëposhtme që do t'ju tregojë certifikatat.

base          pg_dynshmem   pg_notify    pg_snapshots  pg_subtrans  PG_VERSION  postgresql.auto.conf  server.crt
global        pg_logical    pg_replslot  pg_stat       pg_tblspc    pg_wal      postmaster.opts       server.key
pg_commit_ts  pg_multixact  pg_serial    pg_stat_tmp   pg_twophase  pg_xact     postmaster.pid

Rinisni PostgreSQL për të aplikuar ndryshimet.

$ sudo systemctl restart postgresql

Hapi 8 - Testoni lidhjen

Lidhu me bazën e të dhënave nga një makinë tjetër me klientin PostgreSQL të instaluar.

$ psql -d "dbname=postgres sslmode=require" -h postgresql.example.com -U postgres

Ju duhet të shihni kërkesën e mëposhtme PostgreSQL. Ne po përdorim një klient me klient PostgreSQL 14 prandaj, do të shihni një paralajmërim për versionet e papajtueshme.

Password for user postgres:
psql (14.5 (Ubuntu 14.5-0ubuntu0.22.04.1), server 15.1 (Ubuntu 15.1-1.pgdg22.04+1))
WARNING: psql major version 14, server major version 15.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=#

Kjo konfirmon një lidhje të suksesshme SSL.

Dilni nga guaska.

postgres=# \q

Nëse aplikacioni juaj po përdor një varg lidhjeje, përdorni atë në formatin e mëposhtëm për një lidhje SSL.

postgres://user::5432/database_name?sslmode=require

Mund ta ndryshoni modalitetin SSL në verify-full ose verify-ca nëse keni certifikatën rrënjë për Lets encrypt të disponueshme në /var/lib/postgresql/.postgresql vendndodhja në anën e klientit.

Krijo drejtorinë /var/lib/postgresql/.postgresql.

$ sudo mkdir -p /var/lib/postgresql/.postgresql

Certifikata e rrënjës Lets Encrypt është ISRG Root X1 e cila ndodhet në server në vendndodhjen /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt.

Kopjo certifikatën rrënjë në drejtorinë /var/lib/postgresql/.postgresql.

$ sudo cp /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt /var/lib/postgresql/.postgresql/root.crt

Testoni lidhjen duke përdorur modalitetin verify-full ose verify-ca dhe do të shihni një lidhje të suksesshme.

Hapi 9 - Kontrolloni klientët

Hyni në shell PostgreSQL në server.

$ sudo -i -u postgres psql

Ekzekutoni komandën e mëposhtme SQL për të kontrolluar klientët e lidhur.

SELECT ssl.pid, usename, datname, ssl, ssl.version, ssl.cipher, ssl.bits, client_addr
FROM pg_catalog.pg_stat_ssl ssl, pg_catalog.pg_stat_activity activity
WHERE ssl.pid = activity.pid;

Ju duhet të shihni një dalje të ngjashme.

 pid  | usename  | datname  | ssl | version |         cipher         | bits |  client_addr
------+----------+----------+-----+---------+------------------------+------+----------------
 5126 | postgres | postgres | t   | TLSv1.3 | TLS_AES_256_GCM_SHA384 |  256 | 122.161.84.220
 5154 | postgres | postgres | f   |         |                        |      |
(2 rows)

Kjo konfirmon lidhjen e klientit nga ana e serverit.

konkluzioni

Kjo përfundon tutorialin për aktivizimin e SSL në lidhjet PostgreSQL. Nëse keni ndonjë pyetje, postojini ato në komentet më poshtë.