PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come configurare SELinux per PostgreSQL e TimescaleDB

I dati sono la risorsa più importante in un'azienda, quindi dovresti prendere in considerazione tutte le considerazioni sulla sicurezza nel tuo database per mantenerlo il più sicuro possibile. Un'importante funzionalità di sicurezza sui sistemi operativi basati su RedHat è SELinux. In questo blog vedremo cos'è questa funzionalità e come configurarla per i database PostgreSQL e TimescaleDB.

Cos'è SELinux?

Security-Enhanced Linux (SELinux) è un'architettura di sicurezza per sistemi Linux che consente agli amministratori di avere un maggiore controllo su chi può accedere al sistema. Definisce i controlli di accesso per le applicazioni, i processi e i file su un sistema utilizzando le politiche di sicurezza, che sono un insieme di regole che dicono a SELinux a cosa è possibile accedere.

Quando un'applicazione o un processo, noto come soggetto, fa una richiesta per accedere a un oggetto, come un file, SELinux controlla con una cache del vettore di accesso (AVC), dove le autorizzazioni sono memorizzate nella cache per soggetti e oggetti . Se SELinux non è in grado di prendere una decisione sull'accesso in base alle autorizzazioni memorizzate nella cache, invia la richiesta al server di sicurezza. Il server di sicurezza verifica il contesto di sicurezza dell'app o del processo e il file. Il contesto di sicurezza viene applicato dal database delle politiche SELinux e l'autorizzazione viene concessa o negata.

Ci sono diversi modi per configurarlo. Puoi dare un'occhiata al file di configurazione principale di SELinux in /etc/selinux/config per vedere come è attualmente configurato.

$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

 

Ci sono due direttive in questo file. La direttiva SELINUX specifica la modalità SELinux e può avere tre valori possibili:Enforcing, Permissive o Disabled.

  • Enforcing (Default):abiliterà e applicherà la policy di sicurezza SELinux sul sistema, negando tentativi di accesso non autorizzati da utenti e processi.

  • Permissiva:utilizzandolo, SELinux è abilitato ma non applicherà la politica di sicurezza. Tutte le violazioni dei criteri vengono registrate nei log di controllo. È un buon modo per testare SELinux prima di applicarlo.

  • Disabilitato:SELinux è disattivato.

La direttiva SELINUXTYPE specifica la politica da utilizzare. Il valore predefinito è mirato e con questa politica, SELinux ti consente di personalizzare e ottimizzare i permessi di controllo degli accessi.

Anche quando la modalità Enforcing è quella predefinita, disabilitare SELinux è diventata una pratica comune poiché è più facile che affrontarla. Ovviamente, questo non è raccomandato e dovresti averlo configurato almeno in modalità Permissiva e controllare periodicamente i log alla ricerca di comportamenti insoliti.

Come configurare SELinux

Se SELinux è disabilitato nel tuo ambiente, puoi abilitarlo modificando il file di configurazione /etc/selinux/config e impostando SELINUX=permissive o SELINUX=enforcing.

Se non hai mai usato SELinux, il modo migliore per configurarlo è usare prima la modalità Permissiva, controllare i log alla ricerca di messaggi negati nel file di log dei messaggi e correggerlo se necessario:

$ grep "SELinux" /var/log/messages

Dopo che tutto è stato rivisto ed è sicuro procedere, puoi configurare SELinux per l'applicazione utilizzando il metodo precedente o senza riavviare usando il seguente comando:

$ setenforce 1

Se devi eseguire il rollback, esegui:

$ setenforce 0

Questo comando può essere utilizzato per passare al volo tra le modalità di imposizione e permissiva, ma queste modifiche non persistono se si riavvia il sistema. Dovrai configurare il valore nel file di configurazione per renderlo persistente.

Puoi controllare lo stato corrente di SELinux usando il comando getenforce:

$ getenforce
Enforcing

Oppure per informazioni più dettagliate, puoi invece utilizzare sestatus:

$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33

Come configurare SELinux per PostgreSQL e TimescaleDB

Se stai installando PostgreSQL/TimescaleDB usando la configurazione predefinita e la directory dei dati predefinita, e anche SELinux è configurato per impostazione predefinita, molto probabilmente non avrai alcun problema, ma il problema è se vuoi usa, ad esempio, una posizione specifica dove archiviare il tuo database, quindi vediamo come configurare SELinux per farlo funzionare. Per questo esempio, installeremo PostgreSQL 13 su CentOS 8 e utilizzeremo /pgsql/data/ come directory dei dati.

In primo luogo, abilita il modulo postgresql:

$ dnf module enable postgresql:13

Installa i pacchetti PostgreSQL 13 corrispondenti:

$ dnf -y install postgresql-server postgresql-contrib postgresql-libs

Abilita il servizio:

$ systemctl enable postgresql.service

Inizializza il tuo database PostgreSQL:

$ postgresql-setup --initdb

Ora, se avvii il servizio senza modificare nulla, come la directory dei dati, partirà correttamente, altrimenti vedrai un errore del tipo:

Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal postmaster[29116]: postmaster: could not access the server configuration file "/pgsql/data/postgresql.conf": Permission denied

Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Main process exited, code=exited, status=2/INVALIDARGUMENT

Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Failed with result 'exit-code'.

Quindi, vediamo come risolverlo. Innanzitutto, cambia la directory dei dati nel file di configurazione e nel servizio di PostgreSQL. Per questo, modifica il file del servizio PostgreSQL e cambia la posizione PGDATA:

$ vi /etc/systemd/system/multi-user.target.wants/postgresql.service
Environment=PGDATA=/pgsql/data

Modifica il file del profilo bash PostgreSQL e cambia la posizione PGDATA:

$ vi /var/lib/pgsql/.bash_profile
PGDATA=/pgsql/data

Leggi le modifiche:

$ systemctl daemon-reload

Inizializza il nuovo database PostgreSQL:

$ postgresql-setup --initdb
 * Initializing database in '/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

Non è necessario specificare la nuova posizione della directory dei dati come hai fatto in precedenza nei file di configurazione. Ora, prima di avviarlo, devi cambiare l'etichetta di SELinux:

$ chcon -Rt postgresql_db_t /pgsql/data

Questo comando cambierà il contesto di sicurezza di SELinux e i flag sono:

  • -R, --recursive:opera su file e directory in modo ricorsivo

  • -t, --type=TYPE:imposta il tipo TYPE nel contesto di sicurezza di destinazione

Quindi, avvia il servizio PostgreSQL:

$ systemctl start postgresql.service

E il tuo database è in esecuzione ora:

$ ps aux |grep postgres |head -1
postgres   28566  0.0  3.0 497152 25312 ?        Ss   21:16   0:00 /usr/bin/postmaster -D /pgsql/data

Questo è solo un esempio di base di come configurare SELinux per PostgreSQL/TimescaleDB. Esistono diversi modi per farlo con diverse restrizioni o strumenti. La migliore implementazione o configurazione di SELinux dipende dai requisiti aziendali.

Come usare PostgreSQL e TimescaleDB con ClusterControl e SELinux

ClusterControl non gestisce alcun modulo di sicurezza del kernel Linux come SELinux. Quando si distribuisce un cluster PostgreSQL o TimescaleDB utilizzando ClusterControl, è possibile specificare se si desidera che ClusterControl disabiliti SELinux durante il processo di distribuzione per ridurre il rischio di errori:

Se non vuoi disabilitarlo, puoi usare il Permissive mode e monitora il log nei tuoi server per assicurarti di avere la corretta configurazione di SELinux. Successivamente, puoi cambiarlo in Enforcing seguendo le istruzioni sopra menzionate.

Puoi trovare maggiori informazioni sulla configurazione di SELinux sui siti ufficiali di RedHat o CentOS.