J’ai récemment écrit un petit script bash qui me permet de sauvegarder rapidement toutes les bases de données d’un serveur. Le script est lancé par une tâche cron automatiquement, tous les jours.
Si l’on passe l’utilisateur et le mot de passe SQL dans la requête, avec mysql
ou mysqldump
, vous obtiendrez très certainement le message d’avertissement suivant:
Warning: Using a password on the command line interface can be insecure.
Code language: PHP (php)
Et pour cause : cela veut dire que n’importe qui ayant accès au serveur pourra voir, dans les logs ou avec un simple ps, vos informations de connexion à vos bases de données. Ce n’est pas ce qui se fait de mieux en matière de sécurité !
Une solution est de passer en argument un fichier qui contiendra vos données de connexion à la base de données.
Donc, au lieu d’écrire :
mysqldump -u $USER -p$PASSWORD --databases $db > $BACKUP_PATH/$date-$db.sql
Code language: PHP (php)
Il vaut mieux écrire:
mysqldump --defaults-extra-file=/etc/mysql/mysql-backup-script.cnf --databases $db > $BACKUP_PATH/$date-$db.sql
Code language: PHP (php)
Note: L’argument --defaults-extra-file
doit venir en premier, sinon il ne sera pas interprété.
Le fichier /etc/mysql/mysql-backup-script.cnf
contient les identifiants de votre utilisateur SQL qui aura les droits sur chacune des bases de données à sauvegarder. Voici à quoi il ressemble:
[client]
user = 'backup'
password = 'GIGANTIC_SECURE_PASSWORD'
Code language: JavaScript (javascript)
Par sécurité, on restreint les droits d’accès au fichier pour qu’il ne soit pas lisible par tout le monde:
chmod 400 /etc/mysql/mysql-backup-script.cnf
Il ne vous reste qu’à créer votre cron avec votre nouvelle commande, sans montrer les identifiants SQL en clair.