
Déverrouiller la Sécurité de la Base de Données MySQL
MySQL est l’une des bases de données open-source les plus populaires, fonctionnant sur une variété de plateformes. Il est relativement facile à configurer, simple pare-feu et présente de bonnes caractéristiques de performance même sous une charge significative, mais il a toujours un large éventail de problèmes de configuration pertinents pour la sécurité.
Meilleures Pratiques de Sécurité de la Base de Données MySQL
La meilleure pratique en matière de gestion de la sécurité est d’être paranoïaque et d’anticiper une attaque à tout moment et de toutes parts, mais si vous adoptez quelques mesures de précaution, ce ne sera pas si difficile. Les lignes directrices suivantes vous aideront à réduire substantiellement la surface des menaces possibles.
Tout d’abord, lisez les lignes directrices de sécurité sur http://dev.mysql.com/doc/refman/5.7/en/security.html et vérifiez les mises à jour régulièrement. Plusieurs vulnérabilités sérieuses ont été récemment découvertes pour MySQL SGBDR, avec des exploits disponibles gratuitement. 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 attaquants peuvent accéder à de composants, moins ils ont de chances de trouver une faille exploitable 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 à des fichiers en dehors d’un ensemble limité de répertoires. Les fichiers de données MySQL ne devraient être lus par aucun utilisateur, sauf les comptes root ou administrateur.
- Désactivez ou limitez l’accès à distance. Si vous avez besoin que 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 journalisation MySQL. Les fichiers my.cnf, my.ini et master.info contiennent souvent des noms d’utilisateur et mots de passe non chiffrés. Si un fichier journal de requêtes existe, il est probable qu’il contienne aussi 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 contre les utilisateurs non désirés.
- Exécutez MySQL avec l’option –chroot. Elle fournit une excellente mitigation au pouvoir des privilèges sur les fichiers. Chroot est utilisé pour restreindre l’accès aux fichiers d’un processus à un répertoire donné. Même avec l’option chroot, un attaquant qui obtient les privilèges sur les fichiers pourra lire toutes les données MySQL et probablement encore être capable d’exécuter des UDF.
- Effacez régulièrement votre fichier .mysql_history ou liez-le de manière permanente à /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 avec toutes les requêtes que vous avez tapées 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 construire un modèle de privilèges et attribuer des comptes utilisateur.
- Durant la phase de configuration initiale, supprimez tous les utilisateurs MySQL non-root, afin de savoir exactement quels utilisateurs ont accès à la base de données. La meilleure manière est de recommencer à zéro et de créer les utilisateurs dont vous avez besoin.
- Renommez l’utilisateur root et changez son mot de passe en utilisant différents chiffres et caractères. Vous pouvez changer le nom d’utilisateur de l’administrateur avec la commande suivante dans la console MySQL :
mysql> RENAME USER root TO new_name;
- N’attribuez pas de privilèges de compte dont ils n’ont pas réellement besoin, notamment File_priv, Grant_priv, et Super_priv. Envisagez de créer un compte MySQL séparé que votre application peut utiliser pour interagir avec le système de fichiers dans 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. Dans cette application, attribuez les privilèges des utilisateurs uniquement pour les commandes nécessaires. Cela peut sembler fastidieux mais cela a du sens lorsqu’il s’agit d’établir un système de sécurité global.
- Si 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 fonctionnent pas car ils ne supportent pas SSL. De plus, le protocole SSL assure la confidentialité de la séquence des réponses de passeport. 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 sera pas suffisante, un certificat spécifié sera également requis.
- Ne donnez à personne l’accès à la table mysql.user (sauf aux utilisateurs avec des privilèges root).
Configuration MySQL
- Désactivez la commande LOAD DATA LOCAL INFILE. C’est une construction qui aide à importer des fichiers locaux dans une table, mais elle a une particularité qui, dans certaines circonstances, peut conduire à la récupération de contenu du fichier /etc/passwd. Un exploit pour cette commande est disponible librement depuis 2013. Ajoutez set-variable=local-infile=0 au fichier my.cnf.
- Débarrassez-vous de tout UDF inutilisé. Les UDF posent également des menaces pour 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 utilisez uniquement des connexions locales et qu’il n’est pas nécessaire que des hôtes distants se connectent à 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 à laquelle tout le monde peut accéder. 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 crypté.
- Activez la journalisation via l’option –log. Selon la documentation MySQL, le “journal de requêtes générique” est une fonctionnalité de débogage, mais vous pouvez aussi l’utiliser comme mesure de sécurité. Il journalise les connexions réussies et les requêtes exécutées. Par défaut, le journal de requêtes est désactivé ; vous pouvez l’activer en utilisant l’option –log.
Gardez à l’esprit 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 est visible uniquement par l’administrateur ou le compte root du système. En outre, il ne journalise pas les résultats des requêtes et des données récupérées, mais il existe des solutions spéciales de surveillance de l’activité des bases de données pour cette question.
Surveillez régulièrement les journaux de requêtes et recherchez les attaques par injection SQL et l’utilisation de la syntaxe load_file, infile et outfile du système de fichiers.
Installez un logiciel antivirus et antispam. Déployez un pare-feu pour contrôler le trafic réseau entrant et sortant et protéger contre les attaques.
Un système de sécurité complet pour les bases de données MySQL est construit en combinant un grand nombre de changements de configuration discrets. Chaque détail est important. Il n’y a aucun moyen de garantir une sécurité à 100%, mais la poursuite de la protection maximale est essentielle à l’ère des cybercrimes.