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

35

Nous avons un script en ligne de commande PHP pour la version d'une base de données. Nous exécutons ce script chaque fois qu'un développeur ajoute 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 lance maintenant 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 l' alternative sécurisée alors?
  • 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.

Benjoin
la source
2
Avoir vos informations d'identification dans un fichier n'est pas un gros problème. Si une personne a des privilèges root sur votre serveur, elle peut complètement contourner le système d'authentification, simplement en redémarrant le serveur mysql avec une option particulière.
Zoredache
Ce n'est pas le même problème que dans le duplicata suggéré . MySQL ne demande pas de mot de passe, je le fournis et tout fonctionne bien. Je cherche des alternatives pour fournir le mot de passe, à l'exclusion d'un fichier de mot de passe.
Benjamin

Réponses:

17

Dans la version GA récente de MySQL, c'est-à-dire la 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/fr/mysql-config-editor.html.

En gros, c’est: crypter votre utilisateur / transmettre vos informations d’identification avec un alias d’hôte, puis vous utilisez cet alias, insérez cette information dans un fichier de configuration de votre répertoire personnel, puis, au besoin, au lieu de :

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 ce myhostaliasqui suit :

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.

Comme une note, je crois, cette fonctionnalité ne pas exister dans une version 5.6 ci - dessous.

Tuncay Göncüoğlu
la source
Remarque: je me rends bien compte que mysql_config_editor crée effectivement un fichier de mot de passe externe, cependant, cela ne se fait pas par vous, c'est comment le système fonctionne, il n'y a donc aucun manuel / chiffrement à faire par vous.
Tuncay Göncüoğlu
Merci, j'utilise MySQL 5.6, donc ce n'est pas un problème. Cela dit, votre approche est toujours problématique (du moins avec la façon dont nous travaillons actuellement), car je veux prendre le mot de passe d'un fichier de configuration PHP en temps réel et le transmettre dynamiquement à la ligne de commande. Avec ce que vous suggérez, je devrais quand même utiliser le mot de passe sur la ligne de commande lors de l'appel mysql_config_editor, de sorte qu'il n'apporte malheureusement pas plus de valeur. J'essaie également d'éviter que le développeur le fasse manuellement, ce qui oblige à maintenir à la fois le fichier de configuration PHP et la configuration mysql.
Benjamin
Ma meilleure solution est probablement d'ignorer les avertissements pour l'instant. En fait, je me demande s’il ya un problème de sécurité: comme il est appelé depuis PHP, la ligne de commande n’est pas stockée dans l’historique bash ni ailleurs sur la machine?
Benjamin
pas à ma connaissance, non, l'histoire de bash ne le stocke pas. Cependant, le mot de passe en clair dans le fichier de configuration php comporte exactement le même risque, sous une autre forme. peut-être préférerez-vous stocker le mot de passe en utilisant mysql_config_editor et stocker le chemin de connexion dans votre fichier de configuration php? De cette façon, vous n'exposerez votre mot de passe nulle part. (mais devra toujours conserver le mot de passe externe).
Tuncay Göncüoğlu
9

Utilisez l' option --defaults-fileou --defaults-extra-file. Vous pouvez y spécifier un identifiant et un 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 à compter sur un fichier de mot de passe externe, mais que c'est le seul moyen réellement 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. Faites-le 600 (ou 400) et lisible seulement par mysql ou l'utilisateur sous lequel il tourne.

LSD
la source
1
Je ne suis pas contre le fichier de mots de passe pour des raisons de sécurité, c'est simplement que les informations d'identification MySQL font partie d'une configuration globale dans l'application PHP (utilisée également pour la connexion PDO), ce qui signifierait la création d'un fichier de mot de passe (temporaire) uniquement. dans le but d'exécuter la ligne de commande mysql pendant toute la durée du script (quelques secondes).
Benjamin
Comment faire cela sur Windows Server 2012? Où se trouve le fichier de configuration qui contient l'option --defaults-file?
Jake
Vous spécifiez simplement le fichier en tant qu'option pour --defaults-file comme dans:mysql --defaults-file c:\some\dirs\my.cnf
lsd
@ Benjamin, Donc, s'il ne s'agit pas de sécurité, tapez simplement le mot de passe dans la ligne de commande. Qu'est-ce qui ne va pas avec ça (à part la sécurité)?
Pacerier
@ Benjamin si vous utilisez déjà MySQL à partir de PHP, pourquoi bricolez-vous mysqlalors le client de la console?
Josip Rodin
5

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

  • Utilisez une option -pyour_passou --password=your_passsur la ligne de commande
  • Utilisez l' option -pou --passwordsur 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.
  • Stockez votre mot de passe dans la MYSQL_PWDvariable d'environnement

Pour vos besoins, MYSQL_PWDpeut-être une option, mais ce n'est pas plus sûr. En réalité, vous devriez créer un processus interactif avec --passwordle mot de passe et le soumettre de manière interactive, mais c'est une solution relativement complexe à ce problème.

RS
la source
1
Comment MYSQL_PWD serait-il moins sécurisé que la ligne de commande? Le PW ne figure jamais dans la liste des processus, ce qui semble être la principale préoccupation
TheLQ
1
Bien sûr que si. man psA -E Display the environment as well. partir de l'URL à laquelle j'ai lié: Cette méthode de spécification de votre mot de passe MySQL doit être considérée comme extrêmement peu sûre et ne doit pas être utilisée. Certaines versions de ps incluent une option permettant d’afficher l’environnement des processus en cours. Sur certains systèmes, si vous définissez MYSQL_PWD, votre mot de passe est exposé à tout autre utilisateur exécutant ps. Même sur les systèmes ne disposant pas d'une telle version de ps, il est déconseillé de supposer qu'il n'existe aucune autre méthode permettant aux utilisateurs d'examiner les environnements de processus.
RS
Reprenant cette option MYSQL_PWD: Je suppose que si vous définissez la variable d'environnement au début d'un script, puis appelez la ligne de commande MySQL, puis désactivez le fait que, à la fin du script, vous pouvez réduire au minimum le temps d' exposition . Cela vous semble-t-il raisonnable?
Superjos
@kormoc, veuillez élaborer sur le dernier paragraphe. Quelle est cette solution assez complexe dont vous parliez?
Pacerier
1
Il semble que l'utilisation de la variable d'environnement soit plus sécurisée que la ligne de commande. Sur un système Debian par défaut, vous pouvez voir pset voir l’argument de la ligne de commande pour chaque processus de chaque utilisateur. Mais ps eaffiche uniquement l'environnement de vos propres processus (sauf si vous êtes root bien sûr). Ce n'est que légèrement plus sécurisé, mais c'est toujours plus sécurisé.
Jlh
4

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

Michael Hampton
la source
Je ne sais pas à quel point cela fonctionnerait avec de très gros fichiers .sql?
Benjamin
1
@Benjamin J'imagine qu'il n'y a pas pire que le client MySQL. Si la sécurité vous préoccupe vraiment, ce serait la façon la moins agressive de procéder, et la taille est un problème que vous pouvez résoudre de différentes manières.
voretaq7
Savez-vous si c'est possible avec PDO?
Benjamin
PDO ne semble pas avoir une fonction équivalente pour lancer un ensemble de requêtes simultanément dans la base de données. Désolé. C'était une idée ...
Michael Hampton