MariaDB
 sql >> Database >  >> RDS >> MariaDB

SQL Firewall semplificato con ClusterControl e ProxySQL

Leggere il titolo di questo post sul blog può sollevare alcune domande. Firewall SQL - che cos'è? Che cosa fa? Perché dovrei aver bisogno di qualcosa del genere in primo luogo? Bene, la possibilità di bloccare determinate query potrebbe tornare utile in determinate situazioni. Quando si utilizza ProxySQL davanti ai server di database, il proxy è in grado di controllare tutte le istruzioni SQL inviate. ProxySQL ha un sofisticato motore di regole e può abbinare le query che devono essere consentite, bloccate, riscritte al volo o indirizzate a un server di database specifico. Esaminiamo alcuni esempi.

Hai uno slave dedicato che viene utilizzato dagli sviluppatori per testare le loro query rispetto ai dati di produzione. Vuoi assicurarti che gli sviluppatori possano connettersi solo a quel particolare host ed eseguire solo query SELECT.

Un altro caso, supponiamo che tu abbia riscontrato troppi incidenti con persone che eseguono modifiche allo schema e desideri limitare gli utenti che possono eseguire l'istruzione ALTER.

Infine, pensiamo a un approccio paranoico in cui gli utenti possono eseguire solo un insieme predefinito di query autorizzate.

Nel nostro ambiente abbiamo una configurazione di replica con il master e due slave.

Davanti ai nostri database, abbiamo tre nodi ProxySQL con Keepalived che gestisce l'IP virtuale. Abbiamo anche configurato il cluster ProxySQL (come spiegato in questo blog precedente), quindi non dobbiamo preoccuparci di apportare modifiche alla configurazione o alle regole di query tre volte su tutti e tre i nodi ProxySQL. Per le regole di query, è impostata una semplice suddivisione in lettura-scrittura:

Diamo un'occhiata a come ProxySQL, con il suo ampio meccanismo di regole di query, può aiutarci a raggiungere i nostri obiettivi in ​​tutti e tre i casi.

Blocco dell'accesso degli utenti a un singolo gruppo host

Uno slave dedicato a disposizione degli sviluppatori:questa non è una pratica insolita. Finché i tuoi sviluppatori possono accedere ai dati di produzione (e se non sono consentiti, ad esempio per motivi di conformità, il mascheramento dei dati come spiegato nel nostro tutorial ProxySQL può essere d'aiuto), questo può aiutarli a testare e ottimizzare le query sui dati del mondo reale impostare. Può anche essere utile verificare i dati prima di eseguire alcune delle modifiche allo schema. Ad esempio, la mia colonna è davvero unica prima di aggiungere un indice univoco?

Con ProxySQL è abbastanza facile limitare l'accesso. Per cominciare, supponiamo che il gruppo host 30 contenga lo slave a cui vogliamo che gli sviluppatori accedano.

Abbiamo bisogno di un utente che verrà utilizzato dagli sviluppatori per accedere a quello slave. Se lo hai già in ProxySQL, va bene. In caso contrario, potrebbe essere necessario importarlo in ProxySQL (se è stato creato in MySQL ma non in ProxySQL) o crearlo in entrambe le posizioni (se creerai un nuovo utente). Andiamo con l'ultima opzione, creando un nuovo utente.

Creiamo un nuovo utente con privilegi limitati sia su MySQL che su ProxySQL. Lo useremo nelle regole di query per identificare il traffico proveniente dagli sviluppatori.

In questa regola di query reindirizzeremo tutte le query eseguite dall'utente dev_test al gruppo host 30. Vogliamo che questa regola sia attiva e dovrebbe essere l'ultima da analizzare, quindi abbiamo abilitato "Applica". Abbiamo anche configurato RuleID in modo che sia più piccolo dell'ID della prima regola esistente poiché vogliamo che questa query venga eseguita al di fuori della normale configurazione della divisione di lettura/scrittura.

Come puoi vedere, abbiamo utilizzato un nome utente ma ci sono anche altre opzioni.

Se puoi prevedere quali host di sviluppo invieranno il traffico al database (ad esempio, puoi fare in modo che gli sviluppatori utilizzino un proxy specifico prima che possano raggiungere il database), puoi anche utilizzare l'opzione "Indirizzo client" per abbinare le query eseguite da tale host singolo e reindirizzarli a un gruppo host corretto.

Impedire all'utente di eseguire determinate query

Consideriamo ora il caso in cui vogliamo limitare l'esecuzione di alcuni comandi particolari a un determinato utente. Questo potrebbe essere utile per garantire che le persone giuste possano eseguire alcune delle query che influiscono sulle prestazioni come le modifiche allo schema. ALTER sarà la query che useremo in questo esempio. Per cominciare, aggiungiamo un nuovo utente a cui sarà consentito eseguire modifiche allo schema. Lo chiameremo 'admin_user'. Successivamente, dobbiamo creare le regole di query richieste.

Creeremo una regola di query che utilizza l'espressione regolare '.*ALTER TABLE.*' per abbinare le query. Questa regola di query deve essere eseguita prima di altre regole di divisione di lettura/scrittura. Gli abbiamo assegnato un ID regola di 20. Definiamo un messaggio di errore che verrà restituito al client nel caso in cui questa regola di query venga attivata. Una volta terminato, procediamo con un'altra regola di query.

Qui utilizziamo la stessa espressione regolare per catturare la query ma non definiamo alcun testo di errore (il che significa che la query non restituirà un errore). Definiamo anche quale utente può eseguirlo (admin_user nel nostro caso). Ci assicuriamo che questa query venga verificata prima della precedente, quindi le abbiamo assegnato un ID regola inferiore di 19.

Una volta che queste due regole di query sono a posto, possiamo testare come funzionano. Proviamo ad accedere come utente dell'applicazione ed eseguire una query ALTER TABLE:

[email protected]:~# mysql -P6033 -usbtest -ppass -h10.0.0.111
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43160
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use sbtest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> alter table sbtest1 add index (pad);
ERROR 1148 (42000): You are not allowed to execute ALTER
mysql> ^DBye

Come previsto, non è stato possibile eseguire questa query e abbiamo ricevuto un messaggio di errore. Proviamo ora a connetterci usando il nostro 'admin_user':

[email protected]:~# mysql -P6033 -uadmin_user -ppass -h10.0.0.111
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43180
Server version: 5.5.30 (ProxySQL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use sbtest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> alter table sbtest1 add index (pad);
Query OK, 0 rows affected (0.99 sec)
Records: 0  Duplicates: 0  Warnings: 0

Siamo riusciti a eseguire ALTER dopo aver effettuato l'accesso utilizzando 'admin_user'. Questo è un modo molto semplice per garantire che solo le persone nominate possano eseguire modifiche allo schema sui tuoi database.

Creazione di una whitelist di query consentite

Infine, consideriamo un ambiente strettamente bloccato in cui possono essere eseguite solo query predefinite. ProxySQL può essere facilmente utilizzato per implementare tale configurazione.

Prima di tutto, dobbiamo rimuovere tutte le regole di query esistenti prima di poter implementare ciò di cui abbiamo bisogno. Quindi, dobbiamo creare una regola di query catch-all, che bloccherà tutte le query:

Il resto che dobbiamo fare è creare regole di query per tutte le query consentite. Puoi eseguire una regola per query. Oppure puoi usare espressioni regolari se, ad esempio, SELECT è sempre ok per l'esecuzione. L'unica cosa che devi ricordare è che l'ID regola deve essere più piccolo dell'ID regola di questa regola catch-all e assicurati che la query alla fine raggiunga la regola con "Applica" abilitato.

Ci auguriamo che questo post del blog ti abbia fornito informazioni su come utilizzare ClusterControl e ProxySQL per migliorare la sicurezza e garantire la conformità dei tuoi database.