Ricerca nel sito web

Come abilitare SSL per le connessioni PostgreSQL


Su questa pagina

  1. Prerequisiti
  2. Passaggio 1: configurazione del firewall
  3. Passaggio 2 - Installa PostgreSQL 14
  4. Passaggio 3 - Installa SSL
  5. Passaggio 4 - Configurare il rinnovo di Certbot per PostgreSQL
  6. Passaggio 5 - Configurare PostgreSQL
  7. Passaggio 6: configurazione della connessione PostgreSQL
  8. Passaggio 7 - Rinnova il certificato
  9. Passaggio 8: prova la connessione
  10. Passaggio 9 - Controlla i client
  11. Conclusione

Per impostazione predefinita, tutte le connessioni PostgreSQL non sono sicure, il che può causare problemi di sicurezza se eseguite in ambienti di produzione a traffico elevato. La crittografia SSL garantisce che i dati trasferiti non vengano intercettati da nessuno nel mezzo di una connessione.

Questo tutorial ti insegnerà come abilitare SSL/TLS per le connessioni PostgreSQL. div-gpt-ad-howtoforge_com-medrectangle-3-0;var ffid=1;var alS=1021%1000;var container=document.getElementById(slotId);container.style.width=100%;var ins=document. createElement(ins);ins.id=slotId+-asloaded;ins.className=adsbygoogle ezasloaded;ins.dataset.adClient=pid;ins.dataset.adChannel=cid;if(ffid==2){ins.dataset.fullWidthResponsive= VERO;}

Prerequisiti

  • 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.

Passaggio 1: configurare il firewall

Prima di installare qualsiasi pacchetto, il primo passo è configurare il firewall per aprire le porte per HTTP, HTTPS e PostgreSQL.

Controlla lo stato del firewall.

$ sudo ufw status

Dovresti vedere qualcosa di simile al seguente.

Status: active

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

Apri le porte HTTP, HTTPS e PostgreSQL nel firewall.

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

Controlla di nuovo lo stato per confermare.

$ 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)             

Passaggio 2: installa PostgreSQL 14

Ubuntu 22.04 viene fornito con PostgreSQL 14 per impostazione predefinita. Per installare, immetti il seguente comando.

$ sudo apt install postgresql postgresql-contrib

Il pacchetto postgresql-contrib contiene alcune utilità extra.

Puoi anche utilizzare il repository APT ufficiale di PostgreSQL per l'installazione. Eseguire il comando seguente per aggiungere la chiave GPG PostgreSQL.

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

Aggiungi il repository APT all'elenco delle fonti.

$ 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'

Aggiorna il repository di sistema.

$ sudo apt update

Ora puoi installare PostgreSQL usando il comando sopra menzionato.

Controlla lo stato del servizio 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.

Puoi vedere che il servizio è abilitato e in esecuzione per impostazione predefinita.

Imposta la password per l'account postgres.

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

Passaggio 3: installa SSL

Per installare un certificato SSL utilizzando Lets Encrypt, dobbiamo scaricare lo strumento Certbot. Useremo il programma di installazione del pacchetto Snapd per questo. Ubuntu 22.04 è preinstallato con Snap.

Assicurati che la tua versione di Snapd sia aggiornata.

$ sudo snap install core 
$ sudo snap refresh core

Installa Cerbot.

$ sudo snap install --classic certbot

Utilizzare il seguente comando per assicurarsi che il comando Certbot venga eseguito creando un collegamento simbolico alla directory /usr/bin.

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

Genera un certificato SSL.

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

Il comando precedente scaricherà un certificato nella directory /etc/letsencrypt/live/postgresql.example.com sul tuo server.

Genera un certificato di gruppo Diffie-Hellman.

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

Passaggio 4: configurare il rinnovo di Certbot per PostgreSQL

PostgreSQL non ha il permesso di accedere ai certificati dalla cartella Lets Encrypt, pertanto non possiamo dirgli di utilizzare direttamente i certificati dalla cartella. L'alternativa è copiare i certificati nella directory PostgreSQL, ma funziona solo temporaneamente poiché scadranno e dovrai copiarli di nuovo manualmente.

Il metodo migliore è utilizzare un hook di rinnovo che verrà eseguito automaticamente ad ogni rinnovo ed eseguirà le operazioni di copia.

Cerca la directory dei dati di PostgreSQL.

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

Crea il file hook di rinnovo e aprilo per la modifica.

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

Incolla il seguente codice al suo interno.

#!/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

Salva il file premendo Ctrl + X e immettendo Y quando richiesto.

Rendi il file eseguibile.

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

Passaggio 5: configurare PostgreSQL

Trova il percorso per il file di configurazione di PostgreSQL.

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

Apri il file per la modifica.

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

Individua la sezione Impostazioni di connessione e decommenta la variabile listen_address e cambia il suo valore in *. Assicurati che appaia come segue.

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

Individua la sezione SSL e modifica il file in modo che corrisponda ai seguenti valori.

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'

Salva il file premendo Ctrl + X e immettendo Y quando richiesto.

Passaggio 6: configurare la connessione PostgreSQL

Apri il file /etc/postgresql/15/main/pg_hba.conf per la modifica.

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

Aggiungi la riga seguente per abilitare SSL per PostgreSQL.

hostssl all  all  0.0.0.0/0  scram-sha-256

Salva il file premendo Ctrl + X e immettendo Y quando richiesto.

Passaggio 7: rinnovo del certificato

Eseguire il comando seguente per eseguire un rinnovo forzato. Ciò attiverà lo script di distribuzione che copia i certificati nella posizione corretta per l'utilizzo di PostgreSQL.

$ sudo certbot renew --force-renewal

Verificare che i certificati vengano copiati nella directory dei dati di PostgreSQL.

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

Vedrai il seguente output che ti mostrerà i certificati.

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

Riavvia PostgreSQL per applicare le modifiche.

$ sudo systemctl restart postgresql

Passaggio 8: verifica la connessione

Connettersi al database da un'altra macchina con il client PostgreSQL installato.

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

Dovresti vedere il seguente prompt di PostgreSQL. Stiamo utilizzando un client con il client PostgreSQL 14, pertanto verrà visualizzato un avviso sulle versioni incompatibili.

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=#

Ciò conferma una connessione SSL riuscita.

Esci dal guscio.

postgres=# \q

Se la tua app usa una stringa di connessione, utilizzala nel formato seguente per una connessione SSL.

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

È possibile modificare la modalità SSL in verify-full o verify-ca se si dispone del certificato root per Lets encrypt disponibile in /var/lib/postgresql/.postgresql sul lato client.

Crea la directory /var/lib/postgresql/.postgresql.

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

Il certificato radice di Lets Encrypt è ISRG Root X1 che si trova sul server nella posizione /usr/share/ca-certificates/mozilla/ISRG_Root_X1.crt.

Copia il certificato radice nella directory /var/lib/postgresql/.postgresql.

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

Prova la connessione usando la modalità verify-full o verify-ca e dovresti vedere una connessione riuscita.

Passaggio 9: controlla i client

Accedi alla shell PostgreSQL sul server.

$ sudo -i -u postgres psql

Eseguire il seguente comando SQL per controllare i client connessi.

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;

Dovresti vedere un output simile.

 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)

Questo conferma la connessione client dal lato server.

Conclusione

Questo conclude il tutorial sull'abilitazione di SSL sulle connessioni PostgreSQL. Se hai domande, pubblicale nei commenti qui sotto.