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

35

Wir haben ein PHP-Befehlszeilenskript, um eine Datenbank zu versionieren. Wir führen dieses Skript immer dann 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 jetzt jedoch die folgende Warnung aus:

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

Das ist natürlich wahr, könnte aber für den Benutzer ein Problem sein oder auch nicht.

  • Was ist der sichere Alternative?
  • Ist es alternativ möglich, diese Warnung zu deaktivieren?

Bitte beachten Sie, dass ich nicht auf eine externe Passwortdatei angewiesen sein möchte.

Benjamin
quelle
2
Ihre Anmeldeinformationen in einer Datei zu haben, ist kein so großes Problem. Wenn eine Person über Root-Rechte auf Ihrem Server verfügt, kann sie das Authentifizierungssystem vollständig umgehen, indem Sie einfach den MySQL-Server mit einer bestimmten Option neu starten.
Zoredache
Dies ist nicht das gleiche Problem wie bei dem vorgeschlagenen Duplikat . MySQL fragt nicht nach einem Passwort, ich gebe es weiter und es funktioniert einwandfrei. Ich suche nach Alternativen, um das Kennwort bereitzustellen, mit Ausnahme einer Kennwortdatei.
Benjamin

Antworten:

17

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

Grundsätzlich bedeutet dies: Verschlüsseln Sie Ihre Benutzer- / Pass-Anmeldeinformationen mit einem Host-Alias, und verwenden Sie dann den Host-Alias, speichern Sie diese Informationen in einer Konfigurationsdatei in Ihrem Home-Verzeichnis, und führen Sie sie dann bei Bedarf aus, anstatt wie folgt vorzugehen :

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

Sie schreiben stattdessen:

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

Dadurch vermeiden Sie, Ihr Passwort in ein Skript im Klartext einzugeben.

Damit dies funktioniert, müssen Sie zunächst (nur einmal) Folgendes definieren myhostalias:

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

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

Als Hinweis, glaube ich, ist diese Funktionalität nicht unter 5.6 in jeder Version vorhanden sein.

Tuncay Göncüoğlu
quelle
Hinweis: Mir ist klar, dass mysql_config_editor tatsächlich eine externe Kennwortdatei erstellt. Dies wird jedoch nicht von Ihnen durchgeführt. So funktioniert das System, sodass Sie keine manuelle Verschlüsselung vornehmen müssen.
Tuncay Göncüoğlu
Danke, ich verwende MySQL 5.6, also ist dies kein Problem. Trotzdem ist Ihr Ansatz immer noch problematisch (zumindest in Bezug auf die derzeitige Arbeitsweise), da ich das Kennwort in Echtzeit aus einer PHP-Konfigurationsdatei entnehmen und dynamisch an die Befehlszeile übergeben möchte. Mit dem, was Sie vorschlagen, müsste ich immer noch das Passwort in der Befehlszeile verwenden mysql_config_editor, damit es leider nicht viel mehr Wert bringt. Ich versuche auch zu vermeiden, dass der Entwickler es manuell macht, und muss daher sowohl die PHP-Konfigurationsdatei als auch die mysql-Konfiguration pflegen .
Benjamin
Meine beste Lösung ist wahrscheinlich, die Warnungen vorerst zu ignorieren. Eigentlich frage ich mich, ob es überhaupt ein Sicherheitsproblem gibt: Weil es von PHP aufgerufen wird, wird die Befehlszeile vermutlich nicht im Bash-Verlauf oder an einer anderen Stelle auf dem Computer gespeichert?
Benjamin
meines wissens nicht, nein, bash history speichert es nicht. Das Passwort im Klartext in der PHP-Konfigurationsdatei birgt jedoch das gleiche Risiko, nur in einer anderen Form. Vielleicht möchten Sie das Passwort lieber mit mysql_config_editor speichern und den Login-Pfad in Ihrer PHP-Konfigurationsdatei speichern? Auf diese Weise legen Sie Ihr Kennwort nirgendwo offen. (muss aber noch das externe Passwort pflegen).
Tuncay Göncüoğlu
9

Verwenden Sie die Option --defaults-fileoder --defaults-extra-file. Sie können die Benutzer-ID und das Kennwort angeben. Es hat das gleiche Format wie /etc/my.cnf.

Wenn Sie weiterlesen, sagen Sie, dass Sie sich nicht auf eine externe Passwortdatei verlassen müssen möchten, aber das ist der einzig wirklich sichere Weg. Alles andere hinterlässt Spuren in der Prozesstabelle oder so. Sie können die Kennwortdatei sogar in die Versionskontrolle aufnehmen, wenn Sie dies wirklich möchten. Machen Sie es 600 (oder 400) und lesbar nur für MySQL oder den Benutzer, unter dem es ausgeführt wird.

lsd
quelle
1
Ich bin aus Sicherheitsgründen nicht gegen die Passwortdatei, es ist nur so, dass die MySQL-Zugangsdaten Teil einer globalen Konfiguration in der PHP-Anwendung sind (die auch für die PDO-Verbindung verwendet wird), und dies würde nur das Erstellen einer (temporären) Passwortdatei bedeuten um die mysql-befehlszeile für die lebensdauer des skripts (einige sekunden) auszuführen.
Benjamin
Wie mache ich das unter Windows Server 2012? Wo ist die Konfigurationsdatei, die die Option --defaults-file enthält?
Jake
Sie geben die Datei einfach als Option zu --defaults-file an, wie in:mysql --defaults-file c:\some\dirs\my.cnf
lsd
@Benjamin, Wenn es also nicht um Sicherheit geht, geben Sie einfach das Kennwort in die Befehlszeile ein. Was ist falsch daran (abgesehen von der Sicherheit)?
Pacerier
@Benjamin Wenn Sie bereits MySQL von PHP aus verwenden, warum geben Sie dann den mysqlKonsolen-Client zurück?
Josip Rodin
5

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

  • Verwenden Sie die Option -pyour_passoder --password=your_passin der Befehlszeile
  • Verwenden Sie die Option -poder --passwordin der Befehlszeile, ohne dass ein Kennwortwert angegeben wurde. In diesem Fall fordert das Client-Programm das Passwort interaktiv an:
  • Speichern Sie Ihr Passwort in einer Optionsdatei.
  • Speichern Sie Ihr Passwort in der MYSQL_PWDUmgebungsvariablen

MYSQL_PWDMöglicherweise ist dies eine Option für Ihre Anforderungen, aber nicht sicherer. Eigentlich sollte ein interaktiver Prozess gestartet --passwordund das Passwort interaktiv übermittelt werden, aber das ist eine ziemlich komplexe Lösung für dieses Problem.

RS
quelle
1
Wie wäre MYSQL_PWD weniger sicher als die Befehlszeile? Der PW taucht nie in der Prozessliste auf, was das
Hauptproblem
1
Sicher tut es das. man pshat -E Display the environment as well. ich von der URL verknüpft: Diese Methode der Angabe Ihrer MySQL Passwort extrem unsicher betrachtet werden müssen und sollten nicht verwendet werden. Einige Versionen von ps enthalten eine Option zum Anzeigen der Umgebung ausgeführter Prozesse. Wenn Sie auf einigen Systemen MYSQL_PWD festlegen, ist Ihr Kennwort jedem anderen Benutzer zugänglich, der ps ausführt. Selbst auf Systemen ohne eine solche Version von ps kann nicht davon ausgegangen werden, dass es keine anderen Methoden gibt, mit denen Benutzer Prozessumgebungen untersuchen können.
RS
Aufgreifen von dieser MYSQL_PWD-Option: Wenn Sie die Umgebungsvariable zu Beginn eines Skripts festlegen, dann die MySQL-Befehlszeile aufrufen und anschließend am Ende des Skripts deaktivieren, können Sie die Expositionszeit auf ein Minimum reduzieren . Hört sich das vernünftig an?
Superjos
@kormoc, Bitte erläutern Sie den letzten Absatz. Über welche ziemlich komplexe Lösung sprachen Sie?
Pacerier
1
Es scheint , dass die Umgebungsvariable ist sicherer als die Befehlszeile. Auf einem Standard-Debian-System können Sie psdas Befehlszeilenargument für jeden Prozess jedes Benutzers anzeigen und ausführen . Zeigt jedoch ps enur die Umgebung für Ihre eigenen Prozesse an (es sei denn, Sie sind root). Es ist nur unwesentlich sicherer, aber es ist immer noch sicherer.
14.
4

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

Michael Hampton
quelle
Ich bin mir nicht sicher, wie gut das mit ziemlich großen .sql-Dateien funktionieren würde.
Benjamin
1
@Benjamin Ich stelle mir nicht schlechter vor als der MySQL-Client - wenn Sie sich wirklich Sorgen um die Sicherheit machen, ist dies der am wenigsten hackige Weg, und die Größe ist ein Problem, das Sie auf verschiedene Arten lösen können.
Voretaq7
Wissen Sie, ob es mit PDO möglich ist?
Benjamin
PDO scheint keine vergleichbare Funktion zu haben, um eine Reihe von Abfragen gleichzeitig auf die Datenbank zu werfen. Es tut uns leid. Es war eine Idee ...
Michael Hampton