Come abilitare SSL per le connessioni PostgreSQL
Su questa pagina
- Prerequisiti
- Passaggio 1: configurazione del firewall
- Passaggio 2 - Installa PostgreSQL 14
- Passaggio 3 - Installa SSL
- Passaggio 4 - Configurare il rinnovo di Certbot per PostgreSQL
- Passaggio 5 - Configurare PostgreSQL
- Passaggio 6: configurazione della connessione PostgreSQL
- Passaggio 7 - Rinnova il certificato
- Passaggio 8: prova la connessione
- Passaggio 9 - Controlla i client
- 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.