Ausführen von MySQL-Dump in einem Cron-Job, ohne Kennwörter offenzulegen

11

Ich möchte rennen

mysqldump -u aUser -p P4SSw0rd --all-databases > backup.sql

in einem Cron Job. Wie kann ich das sicher machen?

Ich weiß, dass ich den Befehl genau dort platzieren könnte, aber jeder, der Zugriff auf die Maschine hat, würde ihn sofort über crontab sehen. Gibt es einen besseren Weg, dies zu tun?

Slycat
quelle
1
Ihr Beispiel ist falsch, es sollte -pP4SSw0rd ohne Leerzeichen sein.
Simon Woodside

Antworten:

14

Wie angegeben in man mysqldump: siehe 6.1.2.1. Endbenutzerrichtlinien für die Kennwortsicherheit im MySQL-Referenzhandbuch.

Eine Optionsdatei ist die sicherste Wette, nicht zuletzt gemäß der obigen Referenz. Es ist nicht gut, es in crontab im Klartext anzugeben, nicht zuletzt, weil die Prozessbefehlszeile standardmäßig psfür andere Benutzer sichtbar ist . Gleiches gilt für Umgebungsvariablen, wie in der Referenz erläutert.

Relevanter Teil des MySQL-Referenzhandbuchs:

Speichern Sie Ihr Passwort in einer Optionsdatei. Unter Unix können Sie beispielsweise Ihr Kennwort im [client]Abschnitt der .my.cnfDatei in Ihrem Home-Verzeichnis auflisten:

[client]
password=your_pass

Um das Passwort zu schützen, sollte die Datei nur für Sie zugänglich sein. Um dies sicherzustellen, stellen Sie den Dateizugriffsmodus auf 400oder ein 600. Beispielsweise:

shell> chmod 600 .my.cnf

Um über die Befehlszeile eine bestimmte Optionsdatei mit dem Kennwort zu benennen, verwenden Sie die --defaults-file=file_nameOption, wobei file_nameder vollständige Pfadname zur Datei angegeben ist. Beispielsweise:

shell> mysql --defaults-file=/home/francis/mysql-opts

In Abschnitt 4.2.3.3, „Verwenden von Optionsdateien“, werden Optionsdateien ausführlicher erläutert.

Siehe auch /programming//q/10725209 .

Daniel Andersson
quelle
Es scheint, dass der Befehl ps das Passwort mit einem x verschleiert: ps: mysqldump -uroot -px xx mydb. Ich sage jedoch nicht, dass dies ein guter Schutz ist (wenn Sie Jobs eingeben, wird das Kennwort im Klartext angezeigt).
Ling
4

Führen Sie den Cronjob als bestimmten Benutzer aus und extrahieren Sie das Kennwort mithilfe einer einfachen Bash-Logik aus einer Klartextdatei, die irgendwo auf dem System gespeichert ist, mit Berechtigungen, die nur dem Benutzer (oder möglicherweise der Gruppe) den Zugriff darauf ermöglichen.

PASS=`cat /path/to/pwdfile`

 mysqldump -u aUser -p $PASS--all-databases > backup.sql

Wenn der Cronjob als Benutzerbeispiel ausgeführt wird, sollte der Besitz der Datei "Beispiel: Beispiel" sein und die Berechtigung 0400 haben.

Sie können eine ähnliche Funktion auch mit einer .my.cnf auf Benutzerebene erreichen .

Garrett
quelle
1
read PASS < /path/to/pwdfileist ein idiomatisch sauberer, um das Gleiche zu tun (wohl denke ich; superuser.com/q/323060/49184 gilt).
Daniel Andersson
* "ist ein idiomatisch sauberer Weg" ... Beim Bearbeiten verloren.
Daniel Andersson
Jemand mit dem grundlegendsten Verständnis von Bash sollte in der Lage sein zu sehen, was mit dieser Katze los ist. :)
Garrett
1
Es stimmt, ich würde sogar sagen, dass dies der häufigste Weg ist, aber es ist immer noch ein bisschen nervig :-). Wenn man UUOC zur Gewohnheit macht, wird es beißen, wenn die Datei größer ist als ARGMAX, es erfordert einen zusätzlichen Prozess, anstatt eine eingebaute Shell zu verwenden, es könnte Konstrukte wie for i in `cat file`; do ...mit seiner eigenen Reihe von Problemen usw. verführen . Aber natürlich als mit den meisten Dingen: Wenn man weiß, was passiert, kann man tun, was man will. Ich bin hier nicht auf einem Kreuzzug, egal wie es aussehen mag :-D.
Daniel Andersson
0

Jeder, der Zugriff auf das Gerät hat, hat dieselbe Zugriffsebene, /var/spool/cron/crontabs/auf die /var/lib/mysqlSie ihn zulassen. Legen Sie also die richtigen Berechtigungen für die Verzeichnisse fest und fertig. Jeder mit Root-Zugriff hat direkten Zugriff auf die Datenbankdateien. Personen, denen Sie nicht vertrauen, dass sie Zugriff auf das Gerät haben, sollten überhaupt keinen Zugriff auf das Gerät haben.

Normalerweise sehen die Leute ihre eigenen Cronjobs nur über crontab -l.

Akira
quelle
0

Erwägen Sie für Sicherungszwecke, einen schreibgeschützten Benutzer in MySQL zu haben

CREATE USER bUser IDENTIFIED BY 'p4ss';

GRANT SELECT ON *.* TO bUser@localhost;
GRANT LOCK TABLES ON *.* TO bUser@localhost;

mysqldump benötigt nur SELECTund LOCK TABLESBerechtigungen, um seine Arbeit zu erledigen.

Saptarshi Biswas
quelle