Déverrouiller la Sécurité de la Base de Données MySQL : Bonnes Pratiques
MySQL est l’une des bases de données open-source les plus populaires qui fonctionne sur une variété de plateformes. Il est relativement facile à configurer, simple firewall et montre de bonnes caractéristiques de performance même sous une charge importante, mais il présente toujours une grande variété de problèmes de configuration pertinents pour la sécurité.
Bonnes Pratiques de Sécurité de la Base de Données MySQL
La meilleure pratique de gestion de la sécurité est d’être paranoïaque et de s’attendre à une attaque à tout moment et de tous les côtés, mais si vous adoptez certaines mesures de précaution, ce ne sera pas un travail si difficile. Les directives suivantes vous aideront à réduire considérablement la surface des menaces possibles.
Tout d’abord, lisez les directives de sécurité à l’adresse http://dev.mysql.com/doc/refman/5.7/en/security.html et vérifiez régulièrement les mises à jour. Plusieurs vulnérabilités graves ont été découvertes récemment pour le SGBDR MySQL, pour lesquelles il existe des exploits librement disponibles. Profitez des mises à jour qui ajoutent de nouvelles fonctionnalités et, plus important encore, corrigent les failles de sécurité.
Surveillez régulièrement les bases de données de vulnérabilités. Soyez toujours conscient des nouvelles menaces découvertes pour votre système.
Système d’Exploitation
- Désactivez les démons et services inutiles. Moins les composants auxquels les attaquants peuvent accéder sont nombreux, moins il y a de chances qu’ils découvrent une faille pouvant être utilisée pour accéder au système. En gardant la configuration de l’hôte simple, vous réduisez l’effort nécessaire pour gérer le système et atténuez le risque d’omissions de sécurité.
- Assurez-vous que les utilisateurs MySQL ne peuvent pas accéder aux fichiers en dehors d’un ensemble limité de répertoires. Les fichiers de données MySQL ne doivent être lus que par les comptes root ou administrateur.
- Désactivez ou restreignez l’accès à distance. Si vous avez besoin que votre MySQL soit accessible à distance, configurez l’instruction GRANT, qui est utilisée pour configurer l’utilisateur, pour exiger SSL.
- Assurez-vous qu’aucun utilisateur autre que l’utilisateur MySQL ne peut lire les fichiers de configuration et de journal MySQL. Les fichiers my.cnf, my.ini et master.info contiennent souvent des noms d’utilisateur et des mots de passe non chiffrés. S’il y a un fichier de journal de requêtes, il est probable qu’il contienne également des mots de passe. Certains fichiers de configuration MySQL peuvent également contenir des noms d’utilisateur et des mots de passe en clair. Assurez-vous que ces fichiers sont protégés des utilisateurs non souhaités.
- Exécutez MySQL avec l’option –chroot. Cela fournit une excellente atténuation de la puissance du privilège de fichier. Chroot est utilisé pour restreindre l’accès aux fichiers par un processus à un répertoire donné. Même avec l’option chroot, un attaquant qui obtient des privilèges de fichier pourra lire toutes les données MySQL et probablement encore exécuter des UDF.
- Effacez régulièrement votre fichier .mysql_history ou liez-le en permanence à /dev/null. Par défaut, sur les systèmes Unix, vous trouverez un fichier .mysql_history dans votre répertoire personnel. Il contient un journal de toutes les requêtes que vous avez saisies dans le client en ligne de commande MySQL. Exécutez la commande suivante pour effacer l’historique :
cat /dev/null > ~/.mysql_history
Utilisateurs
Après avoir configuré le système d’exploitation, vous devez créer un modèle de privilèges et attribuer des comptes d’utilisateur.
- Pendant la phase de configuration initiale, supprimez tous les utilisateurs MySQL non-root, afin de savoir où vous en êtes en termes d’utilisateurs ayant accès à la base de données. Le meilleur moyen est de repartir de zéro et de créer des utilisateurs au fur et à mesure des besoins.
- Renommez le nom d’utilisateur root et changez le mot de passe en utilisant des chiffres et des caractères différents. Vous pouvez changer le nom d’utilisateur de l’administrateur avec la commande suivante dans la console MySQL :
mysql> RENAME USER root TO nouveau_nom;
- Ne donnez pas de privilèges de compte qu’ils n’ont pas vraiment besoin, en particulier File_priv, Grant_priv et Super_priv. Envisagez de créer un compte MySQL distinct que votre application peut utiliser pour interagir avec le système de fichiers au sein de MySQL. Gardez à l’esprit que cet utilisateur aura accès à toutes les données MySQL, y compris les hachages de mots de passe.
- Si possible, créez un utilisateur MySQL pour chaque application web ou pour chaque rôle au sein de chaque application web. Au sein de cette application, attribuez des privilèges utilisateur uniquement pour les commandes requises. Cela peut sembler fastidieux mais prend tout son sens lorsqu’il s’agit de mettre en place un système de sécurité complet.
- Dans le cas où les connexions à distance sont activées, spécifiez REQUIRE SSL dans l’instruction GRANT utilisée pour configurer l’utilisateur. Certains scripts d’exploitation ne fonctionneront pas car ils ne prennent pas en charge SSL. De plus, le protocole SSL garantit la confidentialité d’une séquence de réponse par mot de passe. Vous pouvez également établir des restrictions basées sur un certificat côté client utilisé pour s’authentifier avec SSL. Une autre mesure de sécurité utile, la connaissance d’un mot de passe ne suffira pas, un certificat spécifié sera également requis.
- Ne donnez à personne accès à la table mysql.user (sauf aux utilisateurs avec des privilèges root).
Configuration MySQL
- Désactivez la commande LOAD DATA LOCAL INFILE. Il s’agit d’une construction qui permet d’importer des fichiers locaux dans une table, elle a une particularité qui, dans certaines circonstances, peut conduire à la récupération du contenu du fichier /etc/passwd. Un exploit pour cela est librement disponible depuis 2013. Ajoutez set-variable=local-infile=0 au fichier my.cnf.
- Débarrassez-vous de tous les UDF inutilisés. Les UDF posent également des menaces à la sécurité de la base de données. Si vous voyez des UDF inutilisés dans la table mysql.func, supprimez-les.
- Si vous n’utilisez que des connexions locales et qu’aucun hôte distant n’a besoin de se connecter à MySQL, désactivez les connexions TCP/IP via l’option –skip-networking.
- Supprimez la base de données de test. Il existe une base de données de test par défaut qui peut être accessible par n’importe qui. Supprimez-la ou restreignez les privilèges.
- Supprimez les comptes anonymes. Ne laissez aucun utilisateur avec des mots de passe vides.
Vous pouvez trouver des utilisateurs anonymes avec cette commande :
select * from mysql.user where user=””;
- Assurez-vous que le trafic MySQL est chiffré.
- Activez la journalisation via l’option –log. Selon la documentation MySQL, le “journal des requêtes générales” est une fonctionnalité de débogage, mais vous pouvez également l’utiliser comme mesure de sécurité. Il enregistre les connexions réussies et les requêtes exécutées. Par défaut, le journal des requêtes est désactivé, vous pouvez l’activer à l’aide de l’option –log.
N’oubliez pas que les journaux de requêtes et les journaux d’erreurs sont également une source d’information pour un attaquant. Assurez-vous que le fichier journal n’est visible que par l’administrateur ou le compte root du système. De plus, il ne consigne pas les résultats des requêtes et les données récupérées, mais il existe des solutions spéciales de surveillance de l’activité des bases de données à cet effet.
Surveillez régulièrement les journaux de requêtes et recherchez des attaques par injection SQL et l’utilisation des syntaxes load_file, infile et outfile du système de fichiers.
Installez des logiciels antivirus et antispam. Déployez un pare-feu pour contrôler le trafic réseau entrant et sortant et vous protéger des attaques.
Un système complet de sécurité de la base de données MySQL est construit en combinant une grande quantité de modifications de configuration discrètes. Chaque détail est important. Il n’y a aucun moyen de garantir une sécurité à 100 %, mais la recherche de la protection maximale est un impératif à l’ère des cybercrimes.