La seguridad es uno de los elementos más importantes del entorno de base de datos diseñado correctamente. Existen numerosos vectores de ataque utilizados con la inyección de SQL, siendo probablemente el más popular. Puede diseñar capas de defensa en el código de la aplicación, pero ¿qué puede hacer en la capa de la base de datos? Hoy nos gustaría mostrarle con qué facilidad puede implementar un firewall SQL sobre MySQL usando ProxySQL. En la segunda parte de este blog, explicaremos cómo puede crear una lista blanca de consultas que pueden acceder a la base de datos.
Primero, queremos implementar ProxySQL. La forma más fácil de hacerlo es usar ClusterControl. Con un par de clics, puede implementarlo en su clúster.
Defina dónde implementarlo, puede elegir un host existente en el clúster o simplemente escriba cualquier IP o nombre de host. Establezca credenciales para usuarios administrativos y de supervisión.
Luego puede crear un nuevo usuario en la base de datos para usar con ProxySQL o puedes importar uno de los existentes. También debe definir los nodos de la base de datos que desea incluir en ProxySQL. Responda si usa transacciones implícitas o no y está listo para implementar ProxySQL. En un par de minutos, un ProxySQL con la configuración preparada en función de su entrada está listo para usar.
Dado que nuestro problema es la seguridad, queremos poder decirle a ProxySQL cómo manejar consultas inapropiadas. Echemos un vistazo a las reglas de consulta, el mecanismo central que rige cómo ProxySQL maneja el tráfico que pasa a través de él. La lista de reglas de consulta puede verse así:
Se aplican desde el ID más bajo en adelante.
Intentemos crear una regla de consulta que permita solo consultas SELECCIONAR para un usuario en particular:
Estamos agregando una regla de consulta al principio de la lista de reglas. Vamos a hacer coincidir todo lo que no sea SELECT (tenga en cuenta que Negate Match Pattern está habilitado). La regla de consulta se usará solo cuando el nombre de usuario sea 'devuser'. Si se cumplen todas las condiciones, el usuario verá el error como en el campo "Mensaje de error".
[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)
Otro ejemplo, esta vez intentaremos prevenir accidentes relacionados con la situación de Bobby Tables.
Con esta regla de consulta en su lugar, su tabla de 'estudiantes' no ser abandonado por 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;
Como puede ver, Bobby no pudo eliminar nuestra tabla de "estudiantes". Solo estaba bien insertado en la mesa.