Frage Was ist eine sichere Alternative zur Verwendung eines MySQL-Passworts in der Befehlszeile?


Wir haben ein PHP-Befehlszeilenskript, um eine Datenbank zu versionieren. Wir führen dieses Skript aus, wenn ein Entwickler einen neuen Datenbank-Patch hinzugefügt hat.

Das Skript führt den Patch mit der MySQL-Befehlszeile aus:

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

MySQL 5.6 gibt nun jedoch folgende Warnung aus:

Warnung: Die Verwendung eines Kennworts in der Befehlszeilenschnittstelle kann unsicher sein

Das ist natürlich richtig, aber möglicherweise oder möglicherweise kein Problem für den Benutzer.

  • Was ist das? sichern Alternative dann?
  • Ist es alternativ möglich, diese Warnung zu deaktivieren?

Bitte beachten Sie, dass ich mich nicht auf eine externe Passwortdatei verlassen muss.


31
2018-02-06 21:48


Ursprung


Ihre Anmeldeinformationen in einer Datei zu haben, ist kein großes Problem. Wenn eine Person root-Berechtigungen auf Ihrem Server hat, können sie das Authentifizierungssystem vollständig umgehen, indem Sie den mysql-Server mit einer bestimmten Option neu starten. - Zoredache
Dies ist nicht das gleiche Problem wie in das vorgeschlagene Duplikat. MySQL fordert kein Passwort an, ich gebe es und es funktioniert gut. Ich suche nach Alternativen, um das Passwort zur Verfügung zu stellen, mit Ausnahme einer Passwortdatei. - Benjamin


Antworten:


In der aktuellen GA-Version von MySQL, dh Ausführung  5.6Sie können dies mit dem Befehl mysql_config_editor tun, wie in beschrieben http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html

Grundsätzlich ist es: Verschlüsseln Sie Ihre Benutzer / Pass-Anmeldeinformationen mit einem Host-Alias, und dann verwenden Sie den Host-Alias, legen Sie diese Informationen in eine Konfigurationsdatei in Ihrem Home-Verzeichnis und dann, wenn Sie es brauchen, anstatt etwas wie :

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

Sie schreiben stattdessen:

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

Dadurch vermeiden Sie, Ihr Passwort in Klartext in ein Skript zu schreiben.

Damit dies funktioniert, müssen Sie zuerst (nur einmal) definieren myhostalias wie:

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

Sie können für verschiedene Konten und / oder Hosts unterschiedliche Anmeldepfade verwenden, wie Sie möchten. Ziemlich gute Idee, wenn Sie mich fragen.

Als Anmerkung, ich glaube, diese Funktionalität tut es NICHT existieren in jeder Version unter 5.6.


16
2018-05-03 17:01



Hinweis: Mir ist klar, dass mysql_config_editor tatsächlich eine externe Passwortdatei erstellt. Dies geschieht jedoch nicht von Ihnen selbst, sondern davon, wie das System funktioniert. Es gibt also keine manuelle En / De / Crypting-Funktion, die Sie ausführen können. - Tuncay Göncüoğlu
Danke, ich benutze MySQL 5.6, das ist also kein Problem. Das heißt, Ihr Ansatz ist immer noch problematisch (zumindest mit dem, wie wir derzeit arbeiten), weil ich das Passwort aus einer PHP-Konfigurationsdatei in Echtzeit nehmen und dynamisch an die Befehlszeile übergeben möchte. Mit dem, was Sie vorschlagen, würde ich immer noch das Passwort in der Befehlszeile verwenden müssen, wenn Sie anrufen mysql_config_editor, also bringt es leider nicht viel mehr wert. Ich versuche auch zu vermeiden, dass der Entwickler es manuell macht, so dass beide PHP-Konfigurationsdateien verwaltet werden müssen und Die MySQL-Konfiguration. - Benjamin
Meine beste Lösung ist wahrscheinlich, die Warnungen für jetzt zu ignorieren. Ich frage mich, ob es überhaupt ein Sicherheitsproblem gibt: weil es von PHP aufgerufen wird, nehme ich an, dass die Befehlszeile nicht in der Bash-History oder anderswo auf dem Rechner gespeichert ist? - Benjamin
nicht zu meinem Wissen, nein, bash Geschichte speichert es nicht. Das Passwort im Klartext in der PHP-Konfigurationsdatei trägt jedoch genau das gleiche Risiko, nur in einer anderen Form. vielleicht möchtest du lieber das passwort mit mysql_config_editor speichern und den login-pfad in deiner php-config-datei speichern? Auf diese Weise werden Sie Ihr Passwort nirgends veröffentlichen. (muss aber immer noch das externe Passwort beibehalten). - Tuncay Göncüoğlu


Benutze die --defaults-file oder --defaults-extra-file Möglichkeit. Sie können eine Benutzer-ID und ein Passwort angeben. Es hat das gleiche Format wie /etc/my.cnf.

Wenn Sie weiter lesen, sagen Sie, dass Sie sich nicht auf eine externe Passwortdatei verlassen müssen, aber das ist die einzige wirklich sichere Methode. Alles andere wird Spuren in der Prozesstabelle hinterlassen oder so etwas. Sie können die Kennwortdatei sogar in die Versionskontrolle einfügen, wenn Sie dies wirklich möchten. Machen Sie es 600 (oder 400) und lesbar nur von mysql oder dem Benutzer, unter dem es läuft.


9
2018-02-06 22:10



Ich bin nicht gegen die Passwort-Datei aus Sicherheitsgründen, nur die MySQL-Anmeldeinformationen sind Teil einer globalen Konfiguration in der PHP-Anwendung (auch für PDO-Verbindung), und dies würde bedeuten, nur eine (temporäre) Passwortdatei zu erstellen um die mysql-Befehlszeile für die Lebensdauer des Skripts auszuführen (einige Sekunden). - Benjamin
Wie macht man das unter Windows Server 2012? Wo ist die Konfigurationsdatei, die die Option --defaults-file enthält? - Jake
Sie geben einfach die Datei als Option für --defaults-file an: mysql --defaults-file c:\some\dirs\my.cnf - lsd
@ Benjamin, Also wenn es ist nicht über Sicherheit, dann geben Sie einfach das Passwort in der Befehlszeile ein. Was ist daran falsch (abgesehen von der Sicherheit)? - Pacerier
@Benjamin, wenn Sie bereits MySQL von PHP verwenden, warum forkieren Sie die mysql Konsolen-Client dann? - Josip Rodin


Sie haben 4 Optionen pro http://dev.mysql.com/doc/refman/5.1/de/password-security-user.html

  • Verwenden ein -pyour_pass oder --password=your_pass Option in der Befehlszeile
  • Benutze die -p oder --password Option in der Befehlszeile ohne angegebenen Kennwortwert. In diesem Fall fragt das Client-Programm das Passwort interaktiv ab:
  • Speichern Sie Ihr Passwort in einer Optionsdatei.
  • Speichern Sie Ihr Passwort in der MYSQL_PWD Umgebungsvariable

Für Ihre Bedürfnisse MYSQL_PWD könnte eine Option sein, aber es ist nicht sicherer. Wirklich sollten Sie einen interaktiven Prozess mit erzeugen --password und senden Sie das Passwort interaktiv, aber das ist eine ziemlich komplexe Lösung für dieses Problem.


4
2018-02-07 01:37



Wie wäre MYSQL_PWD weniger sicher als die Befehlszeile? Das PW erscheint niemals in der Prozessliste, was die Hauptsorge zu sein scheint - TheLQ
Sicher tut es. man ps hat -E Display the environment as well.  Von der URL, mit der ich verlinkt bin: Diese Methode zur Angabe Ihres MySQL-Passworts muss als extrem unsicher angesehen werden und sollte nicht verwendet werden. Einige Versionen von ps enthalten eine Option zum Anzeigen der Umgebung laufender Prozesse. Wenn Sie MYSQL_PWD festlegen, wird auf einigen Systemen Ihr Kennwort jedem anderen Benutzer angezeigt, der ps ausführt. Selbst auf Systemen ohne eine solche Version von ps ist es unklug anzunehmen, dass es keine anderen Methoden gibt, mit denen Benutzer Prozessumgebungen untersuchen können. - R. S.
Von dieser MYSQL_PWD-Option abholen: Ich denke, wenn Sie die Umgebungsvariable am Anfang eines Skripts setzen, rufen Sie die MySQL-Befehlszeile auf und löschen Sie anschließend, dass Sie am Ende des Skripts die Zeit von mindestens reduzieren können Exposition. Klingt das vernünftig? - superjos
@kormoc, Bitte erläutern Sie den letzten Absatz. Was ist diese ziemlich komplexe Lösung, von der du gesprochen hast? - Pacerier
Es scheint, dass die Umgebungsvariable verwendet wird ist sicherer als die Befehlszeile. Auf einem Standard-Debian-System können Sie das tun ps und sehen Sie das Befehlszeilenargument für jeden Prozess jedes Benutzers. Aber ps e zeigt nur die Umgebung für Ihre eigenen Prozesse an (außer Sie sind natürlich root). Es ist nur geringfügig sicherer, aber es ist immer noch sicherer. - jlh


Wenn Ihr PHP-Skript bereits eine offene Datenbankverbindung hat, warum benutzen Sie es nicht einfach mysqli_multi_query() um die .sql-Datei zu importieren? Wenn die Syntax der .sql-Datei gültig ist, natürlich ...


3
2018-02-07 01:46



Ich bin nicht sicher, wie gut das mit ziemlich großen .sql Akten arbeiten würde? - Benjamin
@Benjamin Ich stelle mir nicht schlimmer vor als der MySQL-Client - wenn man sich wirklich um die Sicherheit sorgt, wäre dies der am wenigsten hackische Weg, und die Größe ist ein Problem, das man auf verschiedene Arten lösen kann. - voretaq7
Weißt du, ob es mit PDO möglich ist? - Benjamin
PDO scheint keine äquivalente Funktion zu haben, um eine Menge von Abfragen gleichzeitig auf die Datenbank zu werfen. Es tut uns leid. Es war eine Idee ... - Michael Hampton♦