MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Comment protéger votre base de données MySQL ou MariaDB contre l'injection SQL :première partie

La sécurité est l'un des éléments les plus importants d'un environnement de base de données correctement conçu. Il existe de nombreux vecteurs d'attaque utilisés, l'injection SQL étant probablement le plus populaire. Vous pouvez concevoir des couches de défense dans le code de l'application, mais que pouvez-vous faire sur la couche de base de données ? Aujourd'hui, nous aimerions vous montrer avec quelle facilité vous pouvez implémenter un pare-feu SQL au-dessus de MySQL à l'aide de ProxySQL. Dans la deuxième partie de ce blog, nous expliquerons comment vous pouvez créer une liste blanche de requêtes autorisées à accéder à la base de données.

Tout d'abord, nous voulons déployer ProxySQL. La façon la plus simple de le faire est d'utiliser ClusterControl. En quelques clics, vous pouvez le déployer sur votre cluster.

Définissez où le déployer, vous pouvez soit choisir un hôte existant dans le cluster ou écrivez simplement n'importe quelle adresse IP ou nom d'hôte. Définissez les informations d'identification pour les utilisateurs administratifs et de surveillance.

Ensuite, vous pouvez créer un nouvel utilisateur dans la base de données à utiliser avec ProxySQL ou vous pouvez importer l'un de ceux qui existent déjà. Vous devez également définir les nœuds de base de données que vous souhaitez inclure dans ProxySQL. Répondez si vous utilisez ou non des transactions implicites et que vous êtes prêt à déployer ProxySQL. En quelques minutes, un ProxySQL avec une configuration préparée en fonction de votre entrée est prêt à être utilisé.

Étant donné que notre problème est la sécurité, nous voulons pouvoir dire à ProxySQL comment gérer les requêtes inappropriées. Examinons les règles de requête, le mécanisme de base qui régit la manière dont ProxySQL gère le trafic qui le traverse. La liste des règles de requête peut ressembler à ceci :

Ils sont appliqués à partir de l'ID le plus bas.

Essayons de créer une règle de requête qui n'autorisera que les requêtes SELECT pour un utilisateur particulier :

Nous ajoutons une règle de requête au début de la liste des règles. Nous allons faire correspondre tout ce qui n'est pas SELECT (veuillez noter que Negate Match Pattern est activé). La règle de requête sera utilisée uniquement lorsque le nom d'utilisateur est "devuser". Si toutes les conditions sont remplies, l'utilisateur verra l'erreur comme dans le champ "Message d'erreur".

[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)

Autre exemple, cette fois nous allons essayer de prévenir les accidents liés à la situation de Bobby Tables.

Avec cette règle de requête en place, votre table 'students' ne sera pas être lâché par 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;

Comme vous pouvez le voir, Bobby n'a pas pu supprimer notre table "étudiants". Il n'a été que joliment inséré dans le tableau.