Exécuter le vidage mysql dans un travail cron sans exposer les mots de passe

11

je veux courir

mysqldump -u aUser -p P4SSw0rd --all-databases > backup.sql

dans un travail cron. Comment puis-je le faire en toute sécurité?

Je sais que je pourrais mettre la commande juste là, mais toute personne ayant accès à la machine la verrait directement via crontab. Y a-t-il une meilleure façon de le faire?

slycat
la source
1
Votre exemple est incorrect, il devrait être -pP4SSw0rd sans espace.
Simon Woodside

Réponses:

14

Comme indiqué dans man mysqldump: voir 6.1.2.1. Instructions pour l'utilisateur final pour la sécurité des mots de passe dans le manuel de référence MySQL.

Un fichier d'options est le pari le plus sûr, notamment selon la référence ci-dessus. Le donner en texte brut dans crontab n'est pas bon, notamment parce que la ligne de commande du processus par défaut est visible pspour les autres utilisateurs. Il en va de même pour les variables d'environnement, comme expliqué dans la référence.

Partie pertinente du manuel de référence MySQL:

Enregistrez votre mot de passe dans un fichier d'options. Par exemple, sur Unix, vous pouvez lister votre mot de passe dans la [client]section du .my.cnffichier dans votre répertoire personnel:

[client]
password=your_pass

Pour protéger le mot de passe, le fichier ne doit être accessible à personne d'autre qu'à vous-même. Pour cela, définissez le mode d'accès aux fichiers sur 400ou 600. Par exemple:

shell> chmod 600 .my.cnf

Pour nommer à partir de la ligne de commande un fichier d'options spécifique contenant le mot de passe, utilisez l' --defaults-file=file_nameoption, où file_nameest le nom complet du chemin d'accès au fichier. Par exemple:

shell> mysql --defaults-file=/home/francis/mysql-opts

La section 4.2.3.3, «Utilisation des fichiers d'options» , traite plus en détail des fichiers d'options.

Voir également /programming//q/10725209 .

Daniel Andersson
la source
Il semble que la commande ps obscurcisse le mot de passe avec un x: ps: mysqldump -uroot -px xx mydb. Je ne dis pas que c'est une bonne protection (si vous tapez des travaux, le mot de passe est révélé en texte brut).
ling
4

Exécutez le cronjob en tant qu'utilisateur spécifique et utilisez une logique Bash simple pour extraire le mot de passe d'un fichier en clair stocké quelque part sur le système avec des autorisations qui permettent uniquement à l'utilisateur (ou peut-être au groupe) d'y accéder.

PASS=`cat /path/to/pwdfile`

 mysqldump -u aUser -p $PASS--all-databases > backup.sql

Ainsi, si le cronjob s'exécute en tant qu'utilisateur 'exemple', la propriété du fichier doit être "exemple: exemple" et autorisée 0400.

Vous pouvez également obtenir une fonction similaire en utilisant un .my.cnf de niveau utilisateur .

Garrett
la source
1
read PASS < /path/to/pwdfileest un nettoyeur idiomatique pour faire la même chose (sans doute je suppose; superuser.com/q/323060/49184 s'applique).
Daniel Andersson
* "est UNE FAÇON idiomatiquement plus propre" ... Perdu dans l'édition.
Daniel Andersson
Quelqu'un, même avec la compréhension la plus élémentaire de Bash, devrait être en mesure de voir ce qui se passe avec ce chat. :)
Garrett
1
C'est vrai, je dirais même que c'est la façon la plus courante de le faire, mais c'est quand même un peu horrible :-). Si l'on prend UUOC une habitude, il mordra lorsque le fichier est plus gros que ARGMAX, il faut un processus supplémentaire au lieu d'utiliser un shell intégré, il pourrait tenter des constructions comme for i in `cat file`; do ...avec son propre tableau de problèmes, etc. Mais bien sûr, comme avec la plupart des choses: si on sait ce qui se passe, on est libre de faire ce qu'on veut. Je ne suis pas en croisade ici, peu importe comment cela pourrait apparaître :-D.
Daniel Andersson
0

Toute personne ayant accès à la machine dispose du même niveau d'accès /var/spool/cron/crontabs/que celui que /var/lib/mysqlvous lui accordez. Donc, définissez les autorisations appropriées sur les répertoires et terminé. Toute personne disposant d'un accès root a un accès direct aux fichiers de base de données directement. Toute personne en qui vous n'avez pas confiance pour avoir accès à la machine ne devrait pas avoir accès à la machine.

Habituellement, les gens ne voient que leurs propres cronjobs via crontab -l.

akira
la source
0

À des fins de sauvegarde, pensez à avoir un utilisateur en lecture seule dans mysql, comme

CREATE USER bUser IDENTIFIED BY 'p4ss';

GRANT SELECT ON *.* TO bUser@localhost;
GRANT LOCK TABLES ON *.* TO bUser@localhost;

mysqldump requiert uniquement SELECTet des LOCK TABLESprivilèges pour faire son travail.

Saptarshi Biswas
la source