La sicurezza è uno degli elementi più importanti di un ambiente di database adeguatamente progettato. Esistono numerosi vettori di attacco utilizzati con SQL injection, probabilmente il più popolare. Puoi progettare livelli di difesa nel codice dell'applicazione, ma cosa puoi fare sul livello del database? Oggi vorremmo mostrarti con quanta facilità puoi implementare il firewall SQL su MySQL usando ProxySQL. Nella seconda parte di questo blog spiegheremo come creare una whitelist di query che possono accedere al database.
Per prima cosa, vogliamo distribuire ProxySQL. Il modo più semplice per farlo è utilizzare ClusterControl. Con un paio di clic puoi implementarlo nel tuo cluster.
Definisci dove distribuirlo, puoi scegliere l'host esistente nel cluster o semplicemente annotare qualsiasi IP o nome host. Imposta le credenziali per gli utenti amministrativi e di monitoraggio.
Quindi puoi creare un nuovo utente nel database da utilizzare con ProxySQL oppure puoi importare uno di quelli esistenti. È inoltre necessario definire i nodi del database che si desidera includere in ProxySQL. Rispondi se usi o meno transazioni implicite e sei pronto per distribuire ProxySQL. In un paio di minuti un ProxySQL con la configurazione preparata in base ai tuoi input è pronto per l'uso.
Dato che il nostro problema è la sicurezza, vogliamo essere in grado di dire a ProxySQL come gestire le query inappropriate. Diamo un'occhiata alle regole di query, il meccanismo principale che governa il modo in cui ProxySQL gestisce il traffico che lo attraversa. L'elenco delle regole di query potrebbe essere simile a questo:
Sono applicati dall'ID più basso in poi.
Proviamo a creare una regola di query che consenta solo SELECT query per un particolare utente:
Stiamo aggiungendo una regola di query all'inizio dell'elenco delle regole. Faremo corrispondere tutto ciò che non è SELECTs (si noti che Nega Match Pattern è abilitato). La regola di query verrà utilizzata solo quando il nome utente è "devuser". Se tutte le condizioni sono soddisfatte, l'utente vedrà l'errore come nel campo "Error Msg".
[email protected]:~# mysql -u devuser -h 10.0.0.144 -P6033 -ppass
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 3024
Server version: 5.5.30 (ProxySQL)
Copyright (c) 2009-2019 Percona LLC and/or its affiliates
Copyright (c) 2000, 2019, 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> create schema myschema;
ERROR 1148 (42000): The query is not allowed
mysql> SELECT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.01 sec)
mysql> SELECT * FROM sbtest.sbtest1 LIMIT 1\G
*************************** 1. row ***************************
id: 1
k: 503019
c: 18034632456-32298647298-82351096178-60420120042-90070228681-93395382793-96740777141-18710455882-88896678134-41810932745
pad: 43683718329-48150560094-43449649167-51455516141-06448225399
1 row in set (0.00 sec)
Un altro esempio, questa volta cercheremo di prevenire gli incidenti legati alla situazione dei Bobby Tables.
Con questa regola di query in atto, la tabella "studenti" non essere lasciato da Bobby:
mysql> use school;
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> INSERT INTO students VALUES (1, 'Robert');DROP TABLE students;--
Query OK, 1 row affected (0.01 sec)
ERROR 1148 (42000): Only superuser can execute DROP TABLE;
Come puoi vedere, Bobby non è stato in grado di rimuovere la nostra tabella "studenti". Era solo ben inserito nel tavolo.