piping un mot de passe et la sécurité


11

Je le fais parfois echo "secret" | mysql -u root -p .... Maintenant, je suis préoccupé par la sécurité ici: quelqu'un répertoriant tous les processus peut-il voir le mot de passe?

Pour vérifier j'ai essayé avec echo "test" | sleep 1000et la commande echo avec le secret n'était pas visible dans la sortie de "ps aux". Je suppose donc que c'est sécurisé - mais un expert en sécurité peut-il le confirmer s'il vous plaît? :)


Impossible de le voir dans une liste de processus lors de l'exécution d'une boucle sans fin. Bonne question.
Tim

1
De plus, n'oubliez pas que tout ce que vous tapez sur la plupart des shells sera stocké quelque part (comme .history) dans un fichier historique .
Alexander Bird

Réponses:


13

La réponse à cela dépend du shell que vous utilisez. De nombreux shells ont echoune commande intégrée, ce qui signifie qu'il ne génère pas de processus séparé et n'apparaîtra donc pas dans une liste de processus. Cependant, si vous tapez /bin/echoou ./echoou si vous désactivez les enable -n echocommandes internes avec la commande, le shell n'utilisera pas sa commande intégrée et utilisera la version binaire à la place. Cela apparaîtra dans une liste de processus.

Si vous utilisez le binaire plutôt que le shell intégré, la commande echo s'affichera aussi longtemps qu'il faudra pour déplacer les données dans le tampon STDIN de l'autre processus. Ce tampon a une taille finie donc s'il y a plus de données qu'il n'y en a dans le tampon, la commande echo devra rester un moment jusqu'à ce que l'autre processus puisse lire certaines des données du tampon. Pour la plupart des cas (comme les deux exemples que vous avez donnés ci-dessus), cette période sera de microsecondes. Si vous collez un vidage SQL de 20 Mo dans MySQL à l'aide d'écho, cela pourrait être plus long. Quelle que soit la durée, si vous utilisez le binaire au lieu du shell intégré et que quelqu'un arrive à obtenir le bon timing, il pourra voir le processus dans la liste des processus.

Vous pouvez éviter cela en plaçant les données secrètes dans un fichier (avec les autorisations appropriées) et en utilisant le fichier comme STDIN comme ceci:

mysql -u root -p < file_with_secret.sql

5
Gardez à l'esprit qu'en tapant le mot de passe sur la ligne de commande comme ça, il est très probablement enregistré dans le fichier historique de votre shell, il vaut donc la peine de vérifier l'autorisation et le contenu du fichier historique.
aculich

3

Pour le cas mysql, ~ / .my.cnf peut être utilisé pour stocker des secrets, c'est-à-dire

[client]
user = DBUSERNAME
password = DBPASSWORD
host = DBSERVER

[mysql]
database = DBNAME

1

Utilisez simplement

mysql -uroot -p

et appuyez sur Entrée. Le mot de passe vous sera alors demandé et il ne sera pas visible dans la liste des processus ou dans les fichiers d'historique.


Les données acceptées sur STDIN par MySQL sont la ou les commandes à exécuter une fois connecté. Le "secret" dans la question n'est pas le mot de passe.
Ladadadada
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.