Wenn ich mich mit dem root-Passwort an meiner Box anmelde, kann ich einfach tippen
mysqldump --all-databases und ich bekomme den erwarteten "Dump".
Ich richte in cron.daily einen Job ein, um diesen auszuführen und auf ein Sicherungslaufwerk zu sichern. Das Problem, das ich habe, ist, dass, obwohl der Benutzer als root ausgeführt wird, die folgende Meldung angezeigt wird
mysqldump: Got error: 1045: Zugriff für Benutzer 'root' @ 'localhost' verweigert (mit Passwort: NO)
beim Versuch, eine Verbindung herzustellen. Ich möchte das Root-Passwort der MySQL-Datenbank im Skript nicht hart codieren (wer würde das tun ?).
Wenn man bedenkt, dass ich einfach "mysqldump" in die Befehlszeile meiner Bash-Shell eingeben kann, muss es eine Möglichkeit geben, sich mit dem Parameter -u zurechtzufinden. Ich habe bereits #! / Bin / bash oben im Skript.
Was fehlt mir hier, damit ich nicht nach dem root-Passwort für die Datenbank frage?
Sicherheit sollte nicht durch Dunkelheit erfolgen. Wenn Sie befürchten, dass jemand Zugriff auf Ihr Root-Konto hat, spielt es keine Rolle, ob das MySQL-Passwort von Root im Skript gespeichert ist, da alle Ihre Daten in MySQL-Dumps oder in Datenbankdateien verfügbar sind. Die eigentliche Frage ist also, was Sie schützen wollen.
Wenn Sie nicht möchten, dass andere Benutzer ein Kennwort erhalten, mit dem sie Daten in Ihrer Datenbank ändern können, müssen Sie einen Benutzer mit den entsprechenden Berechtigungen erstellen .
Wenn Sie nicht möchten, dass dieses MySQL-Kennwort von einem lokalen Konto außer dem Root-Konto angezeigt wird, setzen Sie die Dateiberechtigungen für dieses Skript auf 0700 und den Eigentümer auf root.
quelle
Ihre Shell-Verwendung kann dies tun, da Sie eine Shell haben, von der aus Sie sie ausführen können. Wenn Sie sich anmelden, werden alle Ihre Shell-Skripte in Ihrem Profil ausgeführt.
Cron hat keinen solchen Luxus. Wenn es sich anmeldet (als root), wird es sich mit einer Standard-Shell anmelden. Dies verhindert, dass sich jemand remote anmeldet, bedeutet aber auch, dass keine automatischen Anmeldeskripts ausgeführt werden.
Sie können eine Shell festlegen, unter der cron ausgeführt werden soll, die crontab bearbeiten und die Variablen SHELL und HOME hinzufügen, z.
Wenn diese nicht gesetzt sind, wird cron mit dem in / etc / passwd angegebenen Shell- und Home-Verzeichnis ausgeführt (wahrscheinlich nichts, möglicherweise / bin / sh).
Wenn Sie sehen möchten, wie der Umgebungs-Cron ausgeführt wird, fügen Sie einen Cron-Job hinzu, der env in eine Datei exportiert, z.
quelle
Wenn das Skript von root ausgeführt wird, können Sie eine Datei /root/.my.cnf mit den Berechtigungen 600 und den folgenden Inhalten erstellen :
(wo Sie natürlich Ihren MySQL-Benutzernamen und Ihr Passwort eingeben).
Diese Datei wird automatisch von jedem mysql-Befehlszeilentool gelesen, wenn es als root ausgeführt wird. Sie müssen es nicht mehr in der Befehlszeile bereitstellen. Die 600 Berechtigungen schützen es vor neugierigen Blicken.
quelle
Das Debuggen von Cron kann sehr frustrierend sein. Wenn die Cron-Jobs ausgeführt werden, ist für sie keine Umgebung festgelegt, die für eine Shell selbstverständlich ist.
Tipps für Cron:
Wenn Ihr Root-Benutzer dies von der Shell aus tun kann, sollte cron dies können. Stellen Sie sicher, dass Sie die in der Befehlszeile zu verwendende Konfigurationsdatei explizit angeben.
quelle
Obwohl einige dieser Antworten hilfreich sind, sind einige verwirrend, da der Unix-Root-Benutzer und der MySQL-Root-Benutzer nicht identisch sind und im Grunde keine Beziehung haben, außer dass beide den Anmeldenamen 'root' verwenden. Möglicherweise ist das offensichtlich, aber es scheint, dass einige Antworten die zwei vereinen.
Eine nützliche Option für mysqld wäre, Client-Programmen wie mysql oder mysqldump etc, die als Unix-Root ausgeführt werden, den Zugriff auf mysqlds root @ localhost ohne Kennwort zu ermöglichen, ohne das Kennwort von root @ localhost (mysql) speichern zu müssen in einer my.cnf-Datei oder ähnlichem.
Ich weiß, das macht einige nervös, aber die Überlegung ist, dass jeder, der als lokaler (auf dem mysqld-Server) Unix-Root läuft, die Sicherheit von mysqld ohnehin recht leicht umgehen kann. Und wenn ich eine my.cnf mit dem mysqld-root-Passwort 7x24 habe oder sogar eine my.cnf mit dem mysql-root-Passwort (woher kommt dieses Passwort?) Im laufenden Betrieb erstelle / lösche (z. B. um einen mysqldump durchzuführen), bin ich nervös.
Es würde etwas Infrastruktur und Nachdenken erfordern, da man mysql / mysqldump / etc vertrauen müsste, um an mysqld zu übermitteln, dass es wirklich glaubt, dass es von einem lokalen Unix-Root-Konto ausgeführt wird.
Aber zum Beispiel könnte eine Beschränkung auf den Unix-Socket von mysqld, kein TCP, helfen, zumindest als dringend empfohlene Option dieser Option. Dies könnte darauf hinweisen, dass der Client lokal ausgeführt wird, obwohl dies wahrscheinlich nicht ausreicht. Aber es könnte ein Anfang einer Idee sein. Vielleicht könnte ein Dateideskriptor über einen Unix-Socket gesendet werden (google es, wenn das wie verrücktes Gerede klingt.)
PS: Nein, ich werde hier nicht versuchen, mir Gedanken darüber zu machen, wie dies auf einem Nicht-Unix-Betriebssystem funktionieren könnte, obwohl die Idee wahrscheinlich auf andere Betriebssysteme übertragen werden kann.
quelle
/root/.my.cnf
mit den richtigen Berechtigungen eingeben, wird das Problem behoben.