Impostazioni di Configurazione Essenziali per Proteggere il Tuo Database PostgreSQL

Proteggi PostgreSQL con regole pg_hba.conf, autenticazione SCRAM, applicazione TLS, ascoltatori limitati, privilegio minimo e log di audit.

Impostazioni di Configurazione Essenziali per Proteggere il Tuo Database PostgreSQL

La protezione di PostgreSQL inizia con una domanda semplice: chi è autorizzato a connettersi, da dove e con quale metodo di autenticazione? Se pg_hba.conf è troppo permissivo o il server ascolta su più interfacce del necessario, il tuo database ha una superficie d'attacco più ampia del dovuto.

Questa guida copre le impostazioni di sicurezza di PostgreSQL che dovresti rivedere per prime: pg_hba.conf, autenticazione password SCRAM, TLS, ascoltatori di rete, permessi dei ruoli e log.

1. Rafforzare l'Autenticazione Client con pg_hba.conf

Il file Host-Based Authentication (pg_hba.conf) stabilisce quali host possono connettersi, a quali utenti PostgreSQL possono connettersi, a quali database possono accedere e, cosa più importante, il metodo di autenticazione richiesto per quella connessione.

Comprendere la 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 (es., 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 (es., scram-sha-256, md5, reject, trust).

Migliori Pratiche per i Metodi di Autenticazione

Non usare mai il metodo trust in produzione, poiché consente a chiunque soddisfi i criteri di connessione di connettersi senza password. I metodi di autenticazione moderni raccomandati sono:

Raccomandato: scram-sha-256

SCRAM (Salted Challenge Response Authentication Mechanism) offre miglioramenti significativi rispetto ai metodi password più vecchi come md5 utilizzando hashing più forte e prevenendo attacchi di replay. Questa dovrebbe essere la tua scelta predefinita per le connessioni remote.

# Applica SCRAM per connessioni remote da una subnet applicativa
host    appdb   app_user 10.20.30.0/24  scram-sha-256

Imposta password_encryption = 'scram-sha-256' in postgresql.conf prima di creare o ruotare le password. Le password esistenti memorizzate con hash più vecchi non vengono convertite automaticamente; reimpostale dopo aver abilitato SCRAM.

password_encryption = 'scram-sha-256'

Evita regole ampie come questa a meno che un altro controllo di rete non limiti già l'accesso:

host    all     all     0.0.0.0/0       scram-sha-256

Connessioni Locali

Per le connessioni provenienti dal server stesso (es., applicazioni in esecuzione sulla stessa macchina), utilizza socket locali. L'impostazione più sicura è spesso peer (per socket Unix) o scram-sha-256 se i socket sono disabilitati o limitati.

# Usa autenticazione peer per connessioni locali tramite socket Unix
local   all     all             peer

Rifiutare Esplicitamente le Connessioni

Usa il metodo reject per bloccare esplicitamente le connessioni da reti pericolose o non fidate.

# Blocca tutte le connessioni da un intervallo IP noto come insicuro
host    all     all     192.168.1.0/24  reject

Suggerimento Pratico: Dopo aver modificato pg_hba.conf, ricarica PostgreSQL per applicare le modifiche, ad esempio con sudo systemctl reload postgresql o SELECT pg_reload_conf();.

2. Implementare la Crittografia SSL/TLS

Per impedire che dati sensibili (incluse le password) vengano intercettati sulla rete, è obbligatorio applicare 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 (es., server.crt).
  • ssl_key_file: Percorso del file della chiave privata del server (es., server.key).

Applicare 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:

# Consenti solo connessioni tramite SSL/TLS
hostssl all     all     0.0.0.0/0       scram-sha-256

hostssl corrisponde solo a connessioni SSL. Assicurati di non avere anche una regola host successiva o precedente che consenta agli stessi utenti senza TLS. Per rendere la politica ovvia, aggiungi una regola di rifiuto per le connessioni non SSL:

hostnossl all    all     0.0.0.0/0       reject

3. Minimizzare la Superficie d'Attacco

La sicurezza implica ridurre l'esposizione del server database a minacce esterne. Questo viene gestito principalmente attraverso la configurazione di rete e la disabilitazione di funzionalità non necessarie.

Limitare l'Indirizzo di Ascolto di Rete

PostgreSQL di solito ascolta su localhost per impostazione predefinita, ma le distribuzioni pacchettizzate e le immagini gestite possono differire. Configuralo esplicitamente per ascoltare solo sull'interfaccia specifica che richiede accesso, o mantienilo su localhost se solo applicazioni locali si connettono.

In postgresql.conf:

# Ascolta solo su localhost (127.0.0.1) se possibile
listen_addresses = 'localhost'

# OPPURE, ascolta solo su una specifica interfaccia di rete privata
# listen_addresses = '192.168.1.10'

Avviso di Sicurezza: Se listen_addresses è impostato su *, verranno utilizzate tutte le interfacce. Assicurati che pg_hba.conf controlli rigorosamente quali intervalli IP possono connettersi.

Disabilitare Estensioni e Funzionalità Non Necessarie

Ogni estensione abilitata aggiunge potenziale complessità e vettori di attacco. Controlla regolarmente le estensioni installate e rimuovi quelle che non sono attivamente utilizzate per il tuo carico di lavoro di produzione. Questo minimizza la superficie d'attacco complessiva.

Sicurezza delle Password e Ruoli

Assicurati che tutti i ruoli amministrativi (come l'utente predefinito postgres) abbiano password forti e complesse impostate utilizzando ALTER USER:

ALTER USER postgres WITH PASSWORD 'YourStrongAndComplexPassword123!';

Usa il principio del privilegio minimo: gli utenti applicativi dovrebbero avere solo 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 catturare eventi rilevanti.

Impostazioni chiave per l'audit di sicurezza:

  • log_statement = 'ddl' o 'all': Registra tutti i comandi DDL (Data Definition Language), come CREATE TABLE e ALTER USER. Usa 'all' con cautela perché può creare un volume elevato di log e potrebbe catturare testo di query sensibili.
  • 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 modelli di attività insoliti.

Combinando regole di accesso rigorose in pg_hba.conf, crittografia applicata tramite SSL, un indirizzo di ascolto limitato e logging completo, stabilisci una solida base per proteggere la tua implementazione PostgreSQL.

Passaggi Essenziali di Sicurezza

  1. Aggiorna pg_hba.conf: Usa scram-sha-256 o peer per i metodi di autenticazione.
  2. Applica Crittografia: Imposta ssl = on in postgresql.conf e usa voci hostssl in pg_hba.conf.
  3. Limita l'Ascolto: Configura listen_addresses solo sulle interfacce necessarie, evitando il valore predefinito * se possibile.
  4. Applica il Privilegio Minimo: Limita i ruoli del database solo ai permessi assolutamente necessari per la loro funzione.
  5. Ricarica la Configurazione: Ricarica o riavvia sempre PostgreSQL dopo aver modificato i file di sicurezza per applicare le modifiche.

Queste impostazioni sono la base. Dopo averle applicate, testa da un client autorizzato, testa da un client bloccato e verifica che i log mostrino il comportamento di connessione previsto.