Impostazioni di configurazione essenziali per la protezione del tuo database PostgreSQL
La protezione di un database PostgreSQL è fondamentale per salvaguardare i dati sensibili e garantire la conformità. Essendo un database relazionale avanzato e open-source, PostgreSQL offre robusti meccanismi di configurazione per controllare l'accesso, crittografare la comunicazione e minimizzare potenziali vulnerabilità. Questa guida approfondisce i file di configurazione e i parametri critici necessari per stabilire una postura di sicurezza rafforzata per gli ambienti di produzione.
Un'efficace sicurezza di PostgreSQL si basa su due pilastri principali: controllare chi può connettersi e come si connette. Esploreremo le impostazioni vitali in postgresql.conf e il cruciale file di autenticazione del client, pg_hba.conf, oltre a implementare la crittografia obbligatoria tramite SSL/TLS.
1. Rafforzamento dell'autenticazione del client con pg_hba.conf
Il file Host-Based Authentication (pg_hba.conf) detta quali host possono connettersi, con quali utenti PostgreSQL possono connettersi, a quali database possono accedere e, soprattutto, il metodo di autenticazione richiesto per quella connessione.
Comprensione della struttura di pg_hba.conf
Ogni riga in pg_hba.conf segue un formato specifico:
TIPO DATABASE UTENTE INDIRIZZO METODO [OPZIONI]
- TIPO: Tipo di connessione (ad esempio,
local,host,hostnossl,hostssl). - DATABASE: Nome/i del database di destinazione.
- UTENTE: Ruolo/i del database di destinazione.
- INDIRIZZO: Intervallo di indirizzi IP del client.
- METODO: Meccanismo di autenticazione (ad esempio,
scram-sha-256,md5,reject,trust).
Migliori pratiche per i metodi di autenticazione
Non utilizzare mai il metodo trust in produzione, poiché consente a chiunque corrisponda ai criteri di connessione di connettersi senza password. I moderni metodi di autenticazione consigliati sono:
Consigliato: scram-sha-256
SCRAM (Salted Challenge Response Authentication Mechanism) offre miglioramenti significativi rispetto ai vecchi metodi di password come md5 utilizzando hashing più robusto e prevenendo attacchi di replay. Questa dovrebbe essere la tua scelta predefinita per le connessioni remote.
# Forza SCRAM per tutte le connessioni remote sulla porta 5432
host all all 0.0.0.0/0 scram-sha-256
Connessioni locali
Per le connessioni provenienti dal server stesso (ad esempio, applicazioni in esecuzione sulla stessa macchina), utilizzare socket locali. L'impostazione più sicura è spesso peer (per socket di dominio Unix) o scram-sha-256 se i socket sono disabilitati o limitati.
# Usa l'autenticazione peer per le connessioni locali tramite socket Unix
local all all peer
Rifiuto esplicito delle connessioni
Utilizzare il metodo reject per bloccare esplicitamente le connessioni da reti pericolose o non attendibili.
# Blocca tutte le connessioni da un intervallo IP noto come insicuro
host all all 192.168.1.0/24 reject
Suggerimento Azionabile: Dopo aver modificato
pg_hba.conf, devi obbligatoriamente ricaricare la configurazione affinché le modifiche abbiano effetto (ad esempio,pg_ctl reloado inviando un segnale SIGHUP al processo postmaster).
2. Implementazione della crittografia SSL/TLS
Per impedire che dati sensibili (incluse le password) vengano intercettati sulla rete, è obbligatorio imporre la crittografia SSL/TLS per tutte le connessioni remote.
Configurazione in postgresql.conf
Assicurati che questi parametri siano impostati correttamente nel tuo file di configurazione principale:
ssl = on: Abilita il supporto SSL globalmente.ssl_cert_file: Percorso del file del certificato del server (ad esempio,server.crt).ssl_key_file: Percorso del file della chiave privata del server (ad esempio,server.key).
Applicazione di SSL in pg_hba.conf
Per forzare i client a utilizzare SSL, cambia il tipo di connessione in pg_hba.conf da host a hostssl:
# Permetti solo connessioni tramite SSL/TLS
hostssl all all 0.0.0.0/0 scram-sha-256
Se disponi di client legacy che non supportano SSL, puoi consentire esplicitamente connessioni non SSL ma limitarle solo a operazioni non sensibili, sebbene il rifiuto totale sia preferibile.
3. Minimizzazione della superficie di attacco
La sicurezza implica la riduzione dell'esposizione del server di database a minacce esterne. Questo viene gestito principalmente attraverso la configurazione di rete e la disabilitazione di funzionalità non necessarie.
Limitazione dell'indirizzo di ascolto di rete
Per impostazione predefinita, PostgreSQL potrebbe ascoltare su tutte le interfacce di rete (listen_addresses = '*'). Per una maggiore sicurezza, configuralo esplicitamente per ascoltare solo sulle interfacce specifiche che richiedono accesso esterno, o su localhost se si connettono solo applicazioni locali.
In postgresql.conf:
# Ascolta solo su localhost (127.0.0.1) se possibile
listen_addresses = 'localhost'
# OPPURE, ascolta solo su un'interfaccia di rete privata specifica
# listen_addresses = '192.168.1.10'
Avviso di sicurezza: Se
listen_addressesè impostato su*, verranno utilizzate tutte le interfacce. Assicurati chepg_hba.confcontrolli rigorosamente quali intervalli IP possono connettersi.
Disabilitazione di estensioni e funzionalità non necessarie
Ogni estensione abilitata aggiunge potenziale complessità e vettori di attacco. Esegui regolarmente il controllo delle estensioni installate e rimuovi quelle che non vengono utilizzate attivamente per il tuo carico di lavoro di produzione. Ciò riduce al minimo la superficie di attacco complessiva.
Sicurezza delle password e ruoli
Assicurati che tutti i ruoli amministrativi (come l'utente predefinito postgres) abbiano password complesse e robuste impostate tramite ALTER USER:
ALTER USER postgres WITH PASSWORD 'LaTuaPasswordComplessaERobusta123!';
Utilizza il principio del minimo privilegio: gli utenti delle applicazioni dovrebbero avere solo i permessi SELECT, INSERT, UPDATE e DELETE sulle tabelle specifiche di cui hanno bisogno, piuttosto che lo stato di superutente.
4. Configurazione di audit e logging
Sebbene non sia strettamente un meccanismo di controllo degli accessi, un logging robusto è cruciale per rilevare e investigare incidenti di sicurezza. Configura i parametri di logging in postgresql.conf per acquisire eventi pertinenti.
Impostazioni chiave per l'audit di sicurezza:
log_statement = 'ddl'o'all': Registra tutti i comandi Data Definition Language (DDL) (comeCREATE TABLE,ALTER USER). Imposta su'all'temporaneamente durante le revisioni di sicurezza, ma sii consapevole dell'impatto sulle prestazioni.log_connections = on: Registra ogni tentativo di connessione riuscito.log_disconnections = on: Registra quando i client si disconnettono.log_duration = on: Registra il tempo di esecuzione di tutte le istruzioni, che a volte può rivelare schemi di attività insoliti.
Combinando regole di accesso rigorose in pg_hba.conf, crittografia applicata tramite SSL, un indirizzo di ascolto limitato e un logging completo, stabilisci una solida base per la protezione della tua implementazione PostgreSQL.
Riepilogo dei passaggi di sicurezza essenziali
- Aggiorna
pg_hba.conf: Usascram-sha-256opeerper i metodi di autenticazione. - Applica la crittografia: Imposta
ssl = oninpostgresql.confe usa vocihostsslinpg_hba.conf. - Limita l'ascolto: Configura
listen_addressessolo sulle interfacce necessarie, evitando*predefinito se possibile. - Applica il minimo privilegio: Limita i ruoli del database solo ai permessi assolutamente necessari per la loro funzione.
- Ricarica la configurazione: Ricarica o riavvia sempre PostgreSQL dopo aver modificato i file di sicurezza per applicare le modifiche.