Désactiver l’historique MySQL
Sommaire
I. Présentation
MySQL dispose d'un historique de commande par client. Cela permet, comme sous le bash Linux, de retrouver les commandes passées aux précédentes connexions et ainsi de les rejouer facilement. Cela peut donc être pratique mais aussi présenter un problème de sécurité majeur si l'accès au compte d'un client n'est pas sur. Dans ce tutoriel, nous allons donc voir les danger de l'historique MySQL et également voir une solution de protection contre ce problème. Pour information, le tutoriel est illustré avec une machine Debian 7 sous VirtualBox et avec un serveur MySQL 5.5 installé depuis les dépôts.
II. Problématique de l'historique MySQL
Nous allons ici supposer qu'un attaquant a réussi à obtenir l'accès SSH d'un utilisateur se connectant régulièrement au serveur MySQL. L'attaquant ayant les droits sur le répertoire "/home/user" de l'utilisateur, il pourra très facilement lire le fichier ".mysql_history" qui contient comme dit précédemment les commandes passées par l'utilisateur sur ses sessions MySQL.
cat ~/.mysql_history
Note : Sous Linux, les fichiers dont le nom commence par un "." sont des fichiers cachés, il faut donc l'option "-a" de la commande "ls" pour les voir.
Il verra donc quelque chose ressemblant à cela :
On voit donc bien les commandes passées par l'utilisateur lors de ses précédentes connexions. On ne voit ici que des commandes basiques (ce qui peut déjà représenter beaucoup car nous pouvons voir des noms de base de données, table, attribut, etc.). Si l'utilisateur a créé un utilisateur récemment, nous le verrons aussi :
Nous voyons donc le nom de l'utilisateur et, pire encore, son mot de passe. Nous voyons donc bien ici que cela constitue un problème de sécurité.
III. Vider le fichier mysql_history
Face à cela, la solution la plus simple est donc d'effacer les commandes MySQL sauvegardées. On peut le faire facilement après la connexion au serveur MySQL avec la commande suivant :
echo "" > ~/.mysql.history
Le fichier sera donc vidé et aucune commande ne sera lisible. Cela nécessite néanmoins d'y penser à chaque fois que l'on se connecte au serveur MySQL. Ce qui n'est pas optimal.
IV. Ne pas sauvegarder les commandes MySQL
Pour ne plus du tout sauvegarder les commandes MySQL de façon automatique, on peut faire pointer leur écriture vers un fichier "corbeille" a travers un lien symbolique
ln -s /dev/null ~/.mysql_history
On encore utiliser la variable d'envirronnement MYSQL_HISTFILE
export MYSQL_HISTFILE /dev/null
On peut donc mettre l'une de ces deux commandes dans le fichier "~/.bashrc" de chaque utilisateur on mieux, le mettre dans le fichier communs à tous les utilisateurs et modifiable uniquement par "root" : "/etc/bash.bashrc".
Note : Le fichier "~/.bashrc" de chaque utilisateur est un fichier contenant des commandes qui sont exécutées à chaque démarrage d'une session shell pour l'utilisateur en question. Le fichier "/etc/bash.bashrc" par du même principe mais il concerne tous les utilisateur ce qui permet de centraliser l'exécution d'une commande comme voulu dans notre cas.