PostgreSQL è un sistema di gestione di database relazionali open-source, considerato tra i più avanzati e affidabili disponibili oggi. Nato nel 1986 come progetto accademico all’Università di Berkeley, nel corso degli anni si è evoluto fino a diventare la scelta prediletta per chi necessita di un database robusto e conforme agli standard SQL.
Questo database è progettato per gestire carichi di lavoro complessi, grandi volumi di dati e accessi concorrenti da parte di più utenti e applicazioni. PostgreSQL supporta tipi di dato avanzati come JSON, array e dati geospaziali, rendendolo adatto a scenari molto diversi tra loro: dalle applicazioni web ai sistemi di analisi dati, dalla gestione di contenuti alla raccolta di metriche per il monitoraggio.
Primo Accesso al Database
Una volta finalizzata l’installazione sarà necessario andare a sistemare le credenziali di accesso al database, in quanto al momento non è stata inserita una password iniziale per proteggere l’accesso dell’utente “postgres” all’interno del database. Quindi una volta che siamo entrati nella macchina via SSH o tramite accesso diretto possiamo eseguire il comando che ci permette di accedere alla console del database.
psqlQuindi sarà necessario impostare una password per l’utente postgres, in modo da poter utilizzare questo account per la gestione e l’amministrazione del database.
ALTER USER postgres WITH PASSWORD 'Sup3r_P4ss0rd';Il comando ALTER USER ha effetto immediato: la nuova password sarà richiesta a partire dalla prossima connessione al database, senza bisogno di riavviare o ricaricare il servizio PostgreSQL.
Password di sistema e password del database
La password che stiamo impostando qui è quella del database PostgreSQL, utilizzata per l’autenticazione alle connessioni SQL, la quale è diversa dalla password di sistema dell’utente.Gestione del Database
Una volta che PostgreSQL è attivo e funzionante, è buona pratica creare utenti e database dedicati per ogni servizio che andremo ad ospitare. Evitare di utilizzare l’utente postgres per le applicazioni è importante dal punto di vista della sicurezza: in questo modo si ottiene una compartimentazione dei dati e, nel caso in cui un utente venisse compromesso, l’impatto rimarrebbe limitato al singolo servizio senza coinvolgere l’intero sistema.
Sicurezza e gestione degli utenti
La configurazione presentata in questa guida rappresenta un singolo caso d’uso da utilizzare come punto di riferimento. La gestione della sicurezza, dei permessi e degli utenti del database dovrà essere adattata in base alle proprie necessità e alle politiche di sicurezza del proprio ambiente.Tutti i comandi seguenti vanno eseguiti dalla console PostgreSQL, accessibile tramite il comando psql.
Creazione di un nuovo utente
Per ogni servizio è consigliato creare un utente dedicato con una password robusta. Questo garantisce che ogni applicazione acceda esclusivamente ai propri dati.
CREATE USER userxyz WITH PASSWORD '5up3rM3g4_P455w0rd';Creazione di un database
Una volta creato l’utente è possibile creare il database assegnandolo direttamente come proprietario. In questo modo l’utente avrà automaticamente tutti i privilegi necessari sul database stesso.
CREATE DATABASE service_01 OWNER userxyz;Configurazione dei permessi
Anche se userxyz è il proprietario del database, è buona pratica assegnare esplicitamente i permessi di connessione, schema e tabelle. Questo rende la configurazione riutilizzabile anche per utenti che non sono proprietari del database e garantisce che alcuni servizi self-hosted, che richiedono permessi espliciti, funzionino correttamente.
GRANT CONNECT ON DATABASE service_01 TO userxyz;Una volta concessa la connessione è possibile assegnare all’utente anche i permessi per la gestione delle tabelle. Per farlo è necessario prima connettersi al database.
\c service_01A questo punto possiamo assegnare i privilegi sullo schema e sulle tabelle. I comandi ALTER DEFAULT PRIVILEGES garantiscono che i permessi vengano applicati automaticamente anche alle tabelle e sequenze che verranno create in futuro dal servizio, evitando di dover ripetere manualmente l’assegnazione ogni volta.
GRANT USAGE ON SCHEMA public TO userxyz;
GRANT CREATE ON SCHEMA public TO userxyz;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userxyz;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON TABLES TO userxyz;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO userxyz;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO userxyz;Consigli Finali
- Evitare di utilizzare l’utente
postgresper le applicazioni: creare sempre un utente dedicato per ogni servizio, in modo da limitare i danni in caso di compromissione. - Sostituire il metodo di autenticazione
md5conscram-sha-256dove possibile, in quanto offre una protezione più robusta delle credenziali durante il processo di autenticazione. - Restringere gli intervalli IP nella configurazione di
pg_hba.confai soli indirizzi che necessitano realmente di accedere al database, evitando di lasciare0.0.0.0/0in ambienti di produzione. - Verificare periodicamente che i backup vengano eseguiti correttamente e testare il ripristino di un dump su un ambiente di prova.
- Mantenere PostgreSQL aggiornato all’ultima minor release disponibile. Le minor release includono spesso correzioni di sicurezza importanti.
- Valutare l’abilitazione di SSL (
ssl = on) per cifrare le connessioni tra client e server, specialmente se il database è raggiungibile da reti non fidate. - Monitorare le dimensioni della directory dati e della directory di backup per evitare di esaurire lo spazio disco, configurando eventualmente degli alert tramite strumenti come Grafana o Prometheus.