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

MySQL vs MariaDB vs Percona Server :comparaison des fonctionnalités de sécurité

La sécurité des données est essentielle pour toute organisation. C'est un aspect important qui peut fortement influencer la conception de l'environnement de la base de données. Lorsque vous décidez de la version MySQL à utiliser, vous devez prendre en considération les fonctionnalités de sécurité disponibles auprès des différents fournisseurs de serveurs. Dans cet article de blog, nous proposerons une courte comparaison des dernières versions de MySQL Community Edition d'Oracle, Percona Server et MariaDB :

mysqld  Ver 5.7.20-19 for Linux on x86_64 (Percona Server (GPL), Release 19, Revision 3c5d3e5d53c)
mysqld  Ver 5.7.21 for Linux on x86_64 (MySQL Community Server (GPL))
mysqld  Ver 10.2.12-MariaDB for Linux on x86_64 (MariaDB Server)

Nous allons utiliser Centos 7 comme système d'exploitation - veuillez garder à l'esprit que les résultats que nous présentons ici peuvent être légèrement différents sur d'autres distributions comme Debian ou Ubuntu. Nous aimerions également nous concentrer sur les différences et ne couvrirons pas les points communs - Percona Server et MariaDB sont des versions de MySQL, donc certaines des fonctionnalités de sécurité (par exemple, à quoi ressemblent les privilèges d'accès des fichiers MySQL) sont partagées entre eux.

Sécurité initiale

Utilisateurs

Percona Server et MySQL Community Server sont livrés avec un mot de passe temporaire généré de manière aléatoire pour l'utilisateur root. Vous devez vérifier le contenu du journal des erreurs de MySQL pour le trouver :

2018-01-19T13:47:45.532148Z 1 [Note] A temporary password is generated for [email protected]: palwJu7uSL,g

Une fois connecté, un changement de mot de passe vous est imposé :

[[email protected] ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.21

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> select * from mysql.user;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

Le mot de passe doit être suffisamment fort, ceci est appliqué par le plugin validate_password :

mysql> alter user [email protected] identified by 'password123.';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> alter user [email protected] identified by 'password123.A';
Query OK, 0 rows affected (0.00 sec)

MariaDB ne génère pas de mot de passe root aléatoire et fournit un accès sans mot de passe au compte root depuis (et uniquement depuis) ​​localhost.

[[email protected] ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 12
Server version: 10.2.12-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> SELECT CURRENT_USER();
+----------------+
| CURRENT_USER() |
+----------------+
| [email protected] |
+----------------+
1 row in set (0.00 sec)

Ce n'est pas un gros problème lors de la phase initiale de déploiement, car le DBA est censé configurer et sécuriser l'accès à la base de données ultérieurement (en exécutant mysql_secure_installation par exemple). Le plus gros problème ici est qu'une bonne pratique n'est pas appliquée par MariaDB. Si vous n'avez pas besoin de configurer un mot de passe fort pour l'utilisateur root, il se peut que personne ne le modifie plus tard et l'accès sans mot de passe restera. Cela deviendrait alors une menace sérieuse pour la sécurité.

Un autre aspect que nous aimerions examiner est l'accès anonyme et sans mot de passe. Les utilisateurs anonymes permettent à n'importe qui d'entrer, il n'est pas nécessaire qu'il s'agisse d'un utilisateur prédéfini. Si cet accès est sans mot de passe, cela signifie que n'importe qui peut se connecter à MySQL. Généralement, ce compte n'a que le privilège USAGE, mais même dans ce cas, il est possible d'imprimer un statut ("\s") contenant des informations telles que la version de MySQL, le jeu de caractères, etc. De plus, si le schéma "test" est disponible, cet utilisateur a la possibilité de écrire dans ce schéma.

MySQL Community Server et le serveur Percona n'ont pas d'utilisateurs anonymes définis dans MySQL :

mysql> select user, host, authentication_string from mysql.user;
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| root          | localhost | *EB965412B594F67C8EB611810EF8D406F2CF42BD |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

D'autre part, MariaDB est ouvert pour un accès anonyme et sans mot de passe.

MariaDB [(none)]> select user,host,password from mysql.user;
+------+-----------------------+----------+
| user | host                  | password |
+------+-----------------------+----------+
| root | localhost             |          |
| root | localhost.localdomain |          |
| root | 127.0.0.1             |          |
| root | ::1                   |          |
|      | localhost             |          |
|      | localhost.localdomain |          |
+------+-----------------------+----------+
6 rows in set (0.00 sec)

En plus de cela, le schéma "test" est disponible - ce qui permet aux utilisateurs anonymes d'émettre des écritures dans la base de données.

[[email protected] ~]# mysql -umyanonymoususer
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 14
Server version: 10.2.12-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> use test;
Database changed
MariaDB [test]> CREATE TABLE mytab (a int);
Query OK, 0 rows affected (0.01 sec)

MariaDB [test]> INSERT INTO mytab VALUES (1), (2);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [test]> SELECT * FROM mytab;
+------+
| a    |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

Cela représente une menace sérieuse et doit être résolu. Sinon, il peut être facilement exploité pour tenter de surcharger le serveur avec des écritures.

Sécurité des données en transit

MySQL Community Server et ses deux fourches prennent en charge l'utilisation de SSL pour chiffrer les données en transit. Ceci est extrêmement important pour les réseaux étendus, mais ne doit pas non plus être négligé dans un réseau local. SSL peut être utilisé à la fois côté client et côté serveur. En ce qui concerne la configuration côté serveur (pour chiffrer le trafic du maître aux esclaves, par exemple), elle semble identique dans tous les domaines. Il y a cependant une différence en ce qui concerne le chiffrement SSL côté client, introduit dans MySQL 5.7. Avant 5.7, il fallait générer des clés SSL et des CA et les définir dans les configurations du serveur et du client. Voici à quoi ressemble la configuration SSL 10.2 de MariaDB. Dans MySQL Community Server 5.7 et dans Percona Server 5.7 (qui est basé sur MySQL 5.7), il n'est pas nécessaire de pré-générer des clés. Tout se fait automatiquement, en arrière-plan. Tout ce que vous avez à faire est d'activer SSL sur votre client en définissant le bon "--ssl-mode". Pour le client CLI de MySQL, cela n'est même pas nécessaire car il active SSL par défaut :

[[email protected] ~]# mysql -p -h127.0.0.1
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.21 MySQL Community Server (GPL)

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> \s
--------------
mysql  Ver 14.14 Distrib 5.7.21, for Linux (x86_64) using  EditLine wrapper

Connection id:        6
Current database:
Current user:        [email protected]
SSL:            Cipher in use is DHE-RSA-AES256-SHA
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        5.7.21 MySQL Community Server (GPL)
Protocol version:    10
Connection:        127.0.0.1 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:        3306
Uptime:            2 days 21 hours 51 min 52 sec

Threads: 1  Questions: 15  Slow queries: 0  Opens: 106  Flush tables: 1  Open tables: 99  Queries per second avg: 0.000
--------------

D'autre part, MariaDB nécessiterait une configuration supplémentaire car SSL est désactivé par défaut :

[[email protected] ~]# mysql -h127.0.0.1
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 18
Server version: 10.2.12-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

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

MariaDB [(none)]> \s
--------------
mysql  Ver 15.1 Distrib 10.2.12-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:        18
Current database:
Current user:        [email protected]
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server:            MariaDB
Server version:        10.2.12-MariaDB MariaDB Server
Protocol version:    10
Connection:        127.0.0.1 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:        3306
Uptime:            2 days 22 hours 26 min 58 sec

Threads: 7  Questions: 45  Slow queries: 0  Opens: 18  Flush tables: 1  Open tables: 12  Queries per second avg: 0.000
--------------

Cryptage des données au repos

Tout d'abord, les sauvegardes - il existe des outils de sauvegarde disponibles gratuitement comme xtrabackup ou MariaDB Backup (qui est un fork de xtrabackup). Ceux-ci permettent de créer des sauvegardes cryptées des trois versions de MySQL dont nous parlons dans cet article de blog.

Les trois versions prennent en charge le chiffrement de la base de données en cours d'exécution, mais il existe des différences dans les éléments de données qui sont chiffrés.

Le serveur de communauté MySQL prend uniquement en charge le chiffrement des espaces de table InnoDB. Les clés utilisées pour le chiffrement sont stockées dans des fichiers (ce qui n'est pas conforme à la réglementation - les clés doivent être stockées dans un coffre-fort - quelque chose que MySQL Enterprise prend en charge). Percona Server est basé sur MySQL Community Server, il prend donc également en charge le chiffrement des espaces de table InnoDB. Récemment, dans Percona Server 5.7.20, la prise en charge du chiffrement des espaces de table généraux (par rapport aux seuls espaces individuels dans les versions précédentes et MySQL Community Edition) a été ajoutée. La prise en charge du cryptage des journaux binaires a également été ajoutée. Percona Server est livré avec un plugin keyring_vault, qui peut être utilisé pour stocker des clés dans le serveur Hashicorp Vault, rendant Percona Server 5.7.20 conforme aux exigences réglementaires concernant le chiffrement des données au repos.

MariaDB 10.2 offre une prise en charge plus avancée du chiffrement des données au repos. En plus du cryptage des espaces de table et des journaux binaires/relais, il prend en charge le cryptage des journaux redo InnoDB. Actuellement, c'est la solution la plus complète en matière de chiffrement des données.

Journalisation d'audit

Les trois versions de MySQL prennent en charge la journalisation d'audit. Leur portée est à peu près comparable :événements de connexion et de déconnexion, requêtes exécutées, tables consultées. Les journaux contiennent des informations sur l'utilisateur qui a participé à un tel événement, à partir de quel hôte l'utilisateur s'est connecté, l'heure à laquelle cela s'est produit et des informations similaires. Ces événements peuvent également être enregistrés via syslog et stockés sur un serveur de journalisation externe pour permettre l'analyse et l'analyse des journaux.

Masquage des données, pare-feu SQL

Toutes les versions MySQL discutées fonctionnent avec une sorte d'outil qui permettrait d'implémenter le masquage des données et serait capable de bloquer le trafic SQL en fonction de certaines règles. Le masquage des données est une méthode d'obscurcissement de certaines données en dehors de la base de données, mais avant qu'elles n'atteignent le client. Un exemple serait les données de carte de crédit qui sont stockées en texte brut dans la base de données, mais lorsqu'un développeur souhaite interroger ces données, il verra "xxxxxxxx..." au lieu de chiffres. Les outils dont nous parlons ici sont ProxySQL et MaxScale. MaxScale est un produit de MariaDB Corporation et est basé sur un abonnement. ProxySQL est un proxy de base de données gratuit. Les deux proxys peuvent être utilisés avec n'importe quelle version de MySQL.

C'est tout pour aujourd'hui les gens. Pour en savoir plus, consultez ces 10 conseils pour sécuriser vos bases de données MySQL et MariaDB.