web-dev-qa-db-fra.com

Quelle est une alternative sécurisée à l'utilisation d'un mot de passe MySQL sur la ligne de commande?

Nous avons un script de ligne de commande PHP pour versionner une base de données. Nous exécutons ce script chaque fois qu'un développeur a ajouté un nouveau correctif de base de données.

Le script exécute le correctif avec la ligne de commande MySQL:

system('mysql --user=xxx --password=xxx < patch.sql');

Cependant, MySQL 5.6 émet désormais l'avertissement suivant:

Avertissement: l'utilisation d'un mot de passe sur l'interface de ligne de commande peut être non sécurisée

Ce qui est évidemment vrai, mais pourrait ou non être un problème pour l'utilisateur.

  • Quelle est alors l'alternative secure?
  • Sinon, est-il possible de désactiver cet avertissement?

Veuillez noter que je ne veux pas avoir à me fier à un fichier de mot de passe externe.

36
Benjamin

Dans la récente version GA de MySQL, c'est-à-dire version 5.6 , vous pouvez le faire via la commande mysql_config_editor, comme décrit dans http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html

Fondamentalement, cela fait: crypter vos informations d'identification utilisateur/passe avec un alias d'hôte, puis vous utilisez l'alias d'hôte, placez ces informations dans un fichier de configuration dans votre répertoire personnel, puis, lorsque vous en avez besoin, au lieu de faire quelque chose comme :

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

vous écrivez à la place:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

évitant ainsi de mettre votre mot de passe dans un script en texte clair.

Pour que cela fonctionne, vous devez d'abord (une seule fois) définir myhostalias comme:

mysql_config_editor set --login-path=myhostalias --Host=mysqlhost.localnet.com --user=root --password

Vous pouvez utiliser différents chemins de connexion pour différents comptes et/ou hôtes à votre guise. Assez bonne idée si vous me demandez.

À titre d'information, je crois que cette fonctionnalité n'existe [~ # ~] pas [~ # ~] dans toutes les versions inférieures à 5.6.

18

Utilisez le --defaults-file ou --defaults-extra-file option. Vous pouvez y spécifier l'ID utilisateur et le mot de passe. Il a le même format que /etc/my.cnf.

En lisant plus loin, vous dites que vous ne voulez pas avoir à vous fier à un fichier de mot de passe externe, mais c'est le seul moyen vraiment sécurisé. Tout le reste laissera des traces dans la table de processus ou quelque chose. Vous pouvez même mettre le fichier de mot de passe dans le contrôle de version si vous le souhaitez vraiment. Rendez-le 600 (ou 400) et lisible uniquement par mysql ou l'utilisateur sous lequel il s'exécute.

9
lsd

Vous avez 4 options par http://dev.mysql.com/doc/refman/5.1/en/password-security-user.html

  • Utiliser un -pyour_pass ou --password=your_pass option sur la ligne de commande
  • Utilisez le -p ou --password option sur la ligne de commande sans valeur de mot de passe spécifiée. Dans ce cas, le programme client sollicite le mot de passe de manière interactive:
  • Enregistrez votre mot de passe dans un fichier d'options.
  • Enregistrez votre mot de passe dans le MYSQL_PWD variable d'environnement

Pour vos besoins, MYSQL_PWD pourrait être une option, mais ce n'est pas plus sûr. Vous devriez vraiment lancer un processus interactif avec --password et soumettre le mot de passe de manière interactive, mais c'est une solution assez complexe à ce problème.

6
R. S.

Si votre script PHP a déjà une connexion à la base de données ouverte, pourquoi ne pas simplement utiliser mysqli_multi_query() pour importer le fichier .sql? Si la syntaxe du fichier .sql est valable, bien sûr ...

4
Michael Hampton