Je n’avais pas prévu d’écrire un billet sur mysql_secure_installation, c’est en préparant le prochain article (installation du cluster MySQL) que m’est venue l’idée d’écrire quelques lignes sur le sujet.
Ce script, présent dans le répertoire « bin » de votre installation de MySQL, a pour but de « sécuriser » votre base une fois celle-ci installée. Il vous est d’ailleurs conseillé de l’exécuter une fois mysql_install_db lancé ou à défaut de passer par mysqladmin pour au moins modifier le mot de passe associé à l’utilisateur « root ».
Lors de l’installation du cluster, je pars du principe qu’un autre serveur MySQL est susceptible de tourner sur le SQL node, je choisis donc d’opter pour un port différent de celui assigné par défaut au serveur MySQL (3306). Je m’aperçois alors que je n’ai aucun moyen de faire pointer mysql_secure_installation vers mon serveur MySQL en 3307, le script pointant automatiquement vers le port par défaut…
Face à ce problème, au moins deux solutions, taper manuellement les requêtes automatisées de mysql_secure_installation, ou modifier le script.
Fonctionnement du script
Rien de plus simple que d’aller fouiller dans les entrailles de mysql_secure_installation puisque c’est un script shell.
En quelques mots, le script ne supporte aucune option et construit son propre my.cnf temporaire qu’il va ensuite passer en paramètre au client mysql :
mysql --defaults-file=fichier_my.cnf_temporaire
Le script utilise donc le client mysql pour passer ses requêtes. Les seules lignes que comptent ce my.cnf temporaire sont les suivantes, elles sont inscrites dans le fichier dès lors que vous fournissez le mot de passe root :
# mysql_secure_installation config file
[mysql]
user=root
password=xxxxxxxx
C’est tout !
Dans un tel cas, le comportement de mysql par défaut sous unix est tout simplement de chercher à se connecter au port 3306 d’un serveur localhost au travers d’une socket. Impossible donc de demander à mysql_secure_installation de se connecter à un serveur distant ou de tenter la connexion sur un autre port…
Ce manque d’options disponibles ne date pas d’hier et a déjà fait l’objet d’une remontée de « bug« , transformée en « feature request » puisqu’en effet il s’agit plutôt de cela.
Un patch a été proposé par Daniel Fischer, en charge du « bug » chez MySQL, il permet de configurer le port et la socket.
A des fins de tests j’avais pour ma part simplement rajouté quelques lignes dans mysql_secure_installation. D’abord au tout début du script :
# Assigne l'ip et le port à partir des 1er et 2nd paramètres, ex :
# mysql_secure_installation 127.0.0.1 3307
cmd_line_ip="$1"
cmd_line_port="$2"
Puis dans la fonction make_config() qui construit le my.cnf temporaire :
make_config() {
echo "# mysql_secure_installation config file" >$config
echo "[mysql]" >>$config
echo "user=root" >>$config
echo "password=$rootpass" >>$config
if [ $# == 2 ]; then
echo "host=$cmd_line_ip" >>$config
echo "port=$cmd_line_port" >>$config
fi
}
Une fois généré le my.cnf ressemble à ceci :
# mysql_secure_installation config file
[mysql]
user=root
password=xxxxxxxx
host = 127.0.0.1
port = 3307
Grâce à ces deux options supplémentaires, le client mysql se connecte par TCP et le port est pris en compte, j’ai donc pu faire « pointer » mysql_secure_installation vers mon serveur MySQL (3307).
Autre façon de faire, tout simplement taper manuellement les requêtes effectuées quasi automatiquement par mysql_secure_installation.
Les requêtes concernées
Voici les requêtes effectuées par mysql_secure_installation :
// Met à jour le password de l’utilisateur root :
UPDATE mysql.user SET Password=PASSWORD('xxxxxxxx') WHERE User='root';
// Supprime les utilisateurs anonymesDELETE FROM mysql.user WHERE User='';
// Supprime la possibilité à un utilisateur root de se connecter à partir d’un serveur distantDELETE FROM mysql.user WHERE User='root' AND Host!='localhost'
// Supprime la base de données test
DROP DATABASE test;
// Supprime les privilèges associés à la base test
DELETE FROM mysql.db WHERE Db=’test’ OR Db=’test_%’
// Applique les changements effectués précedemment concernant la gestion des droits
FLUSH PRIVILEGES
Il existe d’autres façons de faire, comme par exemple utiliser mysqladmin :
mysqladmin -u root password 'new-password'
De même, pour modifier le password d’un utilisateur, plutôt que de mettre à jour directement les tables systèmes de mysql, il est conseillé de passer par les commandes suivantes :
mysql> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');
ou
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';
La commande FLUSH PRIVILEGES est alors inutile.
[...] mélanger les répertoires d’installation, choisir un port différent par serveur, appliquer mysql_secure_installation… Tout cela gagnerait à être automatisé non ? De plus ces installations manuelles sont [...]