Was ist der debian-sys-maint MySQL-Benutzer (und mehr)?

71

Ich wurde mehrmals vom Benutzer 'debian-sys-maint' gebissen, der standardmäßig auf den mysql-server-Paketen installiert ist, die aus den Ubuntu-Repositories installiert wurden.

Im Allgemeinen ziehe ich eine neue Kopie unserer Produktionsdatenbank (die nicht unter Debian / Ubuntu läuft) zur Fehlerbehebung oder Neuentwicklung und vergesse, die mysql.user-Tabelle auszuschließen, wodurch der Benutzer debian-sys-maint verloren geht.

Wenn wir aus irgendeinem Grund neue mysql-Benutzer hinzufügen, muss ich diese in meine Entwicklungsumgebung "einbinden", anstatt nur die Tabelle zu überlagern.

Ohne den Benutzer scheint mein System immer noch funktionsfähig zu sein, aber es gibt Fehler wie:

sudo /etc/init.d/mysql restart
Stopping MySQL database server: mysqld...failed.
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
  • Wofür wird debian-sys-maint verwendet?
    • Gibt es eine bessere Möglichkeit für die Paketbetreuer, das zu tun, was sie versuchen?
  • Was ist der einfachste Weg, um es wiederherzustellen, nachdem ich es verloren habe?
  • Was sind die richtigen / minimalen Berechtigungen für diesen Benutzer?
    • Scheint eine schlechte Idee zu sein, "alle Privilegien für *. * ... zu gewähren"

Bearbeiten

Zusätzliche Frage - Ist das Passwort in /etc/mysql/debian.cnf bereits gehasht oder ist dies das Klartext-Passwort? Es ist wichtig, wann Sie den Benutzer neu erstellen, und ich scheine es beim ersten Versuch nie richtig zu machen.

Vielen Dank

Joe Holloway
quelle
8
Das Passwort ist Klartext in /etc/mysql/debian.cnf
Brent

Antworten:

57

Wofür wird debian-sys-maint verwendet?

Eine wichtige Aufgabe besteht darin, den Server anzuweisen, die Protokolle zu rollen. Zumindest die Berechtigung zum erneuten Laden und Herunterfahren ist erforderlich.

Siehe die Datei /etc/logrotate.d/mysql-server

Es wird vom /etc/init.d/mysqlSkript verwendet, um den Status des Servers abzurufen. Es wird verwendet, um den Server ordnungsgemäß herunterzufahren / neu zu laden.

Hier ist das Zitat aus der README.Debian

* MYSQL WON'T START OR STOP?:
=============================
You may never ever delete the special mysql user "debian-sys-maint". This user
together with the credentials in /etc/mysql/debian.cnf are used by the init
scripts to stop the server as they would require knowledge of the mysql root
users password else.

Was ist der einfachste Weg, um es wiederherzustellen, nachdem ich es verloren habe?

Der beste Plan ist, es einfach nicht zu verlieren. Wenn Sie das Passwort wirklich verlieren, setzen Sie es mit einem anderen Konto zurück. Wenn Sie alle Administratorrechte auf dem MySQL-Server verloren haben, befolgen Sie die Anleitungen zum Zurücksetzen des Root-Passworts und reparieren Sie das debian-sys-maint.

Mit einem solchen Befehl können Sie eine SQL-Datei erstellen, die Sie später zum erneuten Erstellen des Kontos verwenden können.

mysqldump --complete-insert --extended-insert=0 -u root -p mysql | grep 'debian-sys-maint' > debian_user.sql

Ist das Passwort in /etc/mysql/debian.cnf bereits gehasht?

Das Kennwort wird bei der Installation nicht gehasht / verschlüsselt, aber neue Versionen von mysql bieten jetzt die Möglichkeit, die Anmeldeinformationen zu verschlüsseln (siehe: https://serverfault.com/a/750363 ).

Zoredache
quelle
1
"Der beste Plan ist, es einfach nicht zu verlieren." Ernsthaft? Das ist keine Hilfe für Leute, die es bereits verloren haben, wie ich es anscheinend während eines Upgrades getan habe. Verwenden Sie für diejenigen, die den Benutzer neu erstellen müssen, eine der Optionen "GRANT ALL" in den anderen Antworten, da dieser Benutzer NICHT nur für Logrotate-Vorgänge verwendet wird - er ist ein kritischer Teil des Aktualisierungsprozesses.
FKEinternet
Wenn Sie die Anmeldeinformationen verlieren, haben Sie immer die Möglichkeit, den mysql / mariadb-Daemon nur mit der Option zu starten, die das Berechtigungssystem überspringt, oder sich als ein anderer Benutzer mit Root-Berechtigungen für mysql anzumelden und das Kennwort zurückzusetzen. Das Zurücksetzen von Kennwörtern und das Umgehen des Berechtigungssystems ist an anderen Stellen bei Google und bei anderen Fragen auf dieser Website ausführlich dokumentiert.
Zoredache
22

Der Benutzer debian-sys-maint ist standardmäßig ein Root-Äquivalent . Es wird von bestimmten Wartungsskripten auf Debian-Systemen verwendet und ermöglicht als Nebeneffekt Benutzern mit Root-Zugriff auf die Box, das Klartext-Passwort in /etc/mysql/debian.cnf (gut oder schlecht?) Anzuzeigen.

Sie können den Benutzer neu erstellen, indem Sie:

GRANT ALL PRIVILEGES on *.* TO `debian-sys-maint`@`localhost` IDENTIFIED BY 'your password' WITH GRANT OPTION;

Stellen Sie einfach sicher, dass das Passwort mit dem in /etc/mysql/debian.cnf übereinstimmt

Brent
quelle
9
Re (gut oder schlecht) - Wenn jemand es schafft, root zu werden, kann er das Berechtigungssystem vollständig umgehen, indem er einfach den Server mit den richtigen Optionen neu startet. Wenn Sie als Angreifer root werden, haben Sie wahrscheinlich größere Probleme als mit dieser Konfigurationsdatei.
Zoredache
2
auch re: gut oder schlecht - ich musste mich auf den debian-sys-maint-Zugang verlassen, um das Passwort für das MySQL-Root-Konto zurückzusetzen, wenn es vergessen wurde. Es war schön, diese Fallback-Option zu haben.
Brent,
1
@Brent: Unter dev.mysql.com/doc/refman/5.0/de/resetting-permissions.html finden Sie Informationen zum Zurücksetzen des mysql-root-Passworts. Ich habe diesen Benutzer bei vielen MySQL-Installationen unter Debian deaktiviert, da dies beim Start zu Problemen beim Überprüfen von Tabellen führen kann, wenn es sich um große Tabellen handelt.
Nathan
1
Nathan, danke für diesen Link. Das sind neue Infos für mich. Wenn Sie ein Verfahren zum Deaktivieren des debian-sys-maint-Kontos haben, warum fügen Sie es nicht hier als separate Antwort ein? Das wäre toll!
Brent
3
Ein besserer Zuschuss wäre, nur die Berechtigungen zum Herunterfahren / Starten zu erteilen.
25.
19

Du könntest auch:

sudo dpkg-reconfigure mysql-server-5.0

Damit haben Sie die Möglichkeit, den Benutzer debian-sys-maint neu zu erstellen. Bestehende Benutzer und Datenbanken sind sicher.


quelle
Dies funktionierte auch auf mysql-server-5.5.
ServerSentinel
Dies funktioniert nur, wenn Ihre MySQL-Server-Installation nicht kaputt ist - wie es passieren könnte, wenn der Benutzer debian-sys-maint fehlt.
FKEinternet
19

Ich wollte nur einen Kommentar abgeben, aber ich denke, dass die korrekte Syntax einen eigenen Eintrag verdient. Dadurch wird der Benutzer debian-sys-maint erstellt :

mysql> GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'plaintextpassword' WITH GRANT OPTION; FLUSH PRIVILEGES;

Wenn Sie immer noch die Datei /etc/mysql/debian.cnf haben, verwenden Sie dort einfach das Kennwort.

Fühlen Sie sich frei, eine paranoidere und sicherere Lösung zu finden.

d -_- b
quelle
1
Es ist so paranoid wie es sein muss. Dann ist nur einer /etc/mysql/debian.cnfder Linux- rootBenutzer in der Lage, die Datei file zu lesen . Und wenn jemand diese Datei lesen kann, hat er bereits rootZugriff auf den Computer und kann den MySQL-Server anhalten und einen eigenen Systemadministrator hinzufügen. Das Skript, mit dem MySQL und andere Pakete gestartet werden, kann keine Sicherheits- und sonstige Wartung durchführen. Also ja, es ist so sicher, wie es jemals sein muss. Und nützlich, wenn Sie das MySQL-Administratorkennwort verlieren, um es wiederherzustellen, ohne es im unsicheren Modus neu starten zu müssen. ;-)
Anders
Dafür ist edit gedacht.
RobinJ
6

Wenn Sie den debian-sys-maintBenutzer nur zu logrotate.dZwecken hinzufügen müssen , sollten Sie dies nicht gewähren ALL PRIVILEGESoder GRANT OPTION- dies ist eine unnötige riesige Sicherheitslücke. Stattdessen können Sie einfach den Benutzer mit der folgenden RELOADBerechtigung hinzufügen (vorausgesetzt, Sie greifen auf Ihre rootDatenbank zu und ersetzen xxxxxx durch Ihr Kennwort).

# add the user with the reload right
GRANT RELOAD on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'xxxxxx'; 

# reload the rights
FLUSH PRIVILEGES;

# double check
select * from mysql.user;

Aktualisierung 2019

Diese Antwort ist möglicherweise nicht mehr aktuell - bitte beachten Sie die stark meinungsgebundenen Kommentare unten.

Mark Chackerian
quelle
Dies ist die einzige sichere Antwort, bei der nur die erforderlichen Berechtigungen erteilt werden debian-sys-maint. Außerdem kann ich bestätigen, dass es wie ein Zauber funktioniert. Prost!
Jealie
2
Ist es wirklich eine Sicherheitslücke? Wenn jemand /etc/mysql/debian.cnf bereits lesen kann, hat er vermutlich root-Zugriff und kann mysql trotzdem mit --skip-grant-tables neu starten.
mc0e
Vielen Dank. MySQL weiß bereits, was der Befehl GRANT bewirkt. Siehe dev.mysql.com/doc/refman/5.6/en/privilege-changes.html
ygoe
1
Dies funktioniert nicht, da der debian-sys-maintBenutzer auch zum Herunterfahren des Servers verwendet wird. Und auch nach einem Root-Benutzer zu suchen, wenn Sie den MySQL-Server starten. Sie müssen also mindestens Auswahlrechte für mysql. * Und zum Herunterfahren gewähren.
Anders
1
NEIN NEIN NEIN, folge NICHT dem Rat dieser Antwort - du musst debian-sys-maint aus den in der anderen Antwort mit dem Titel "debian-sys-maint required permissions" genannten Gründen alle Berechtigungen gewähren. Kurz gesagt, es kann sein, dass Sie im Alltag in Ordnung sind, aber bei der Installation eines Sicherheitsupdates, eines Patches oder eines Upgrades Ihres Systems auf schwerwiegende Probleme stoßen.
Kurt Fitzner
3

Anstatt von

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY PASSWORD('your password') WITH GRANT OPTION; FLUSH PRIVILEGES;

Ich denke

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'your password' WITH GRANT OPTION; FLUSH PRIVILEGES;

weil das Passwort nicht gehasht wird ...?

Fortega
quelle
3

Für debian-sys-maint sind Berechtigungen erforderlich

Andere Antworten haben alles ausreichend angesprochen, mit Ausnahme der Mindestberechtigungen, die für den Benutzer debian-sys-maint erforderlich sind. Viele der Antworten hier sind in dieser Hinsicht einfach falsch und sogar gefährlich. Reduzieren Sie die debian-sys-maint-Berechtigungen (einschließlich der Grant-Option) nicht, ohne die folgenden Informationen gelesen und verstanden zu haben:

Der Debian-Betreuer hat dem Benutzer nicht alle Rechte willkürlich eingeräumt. Hier erfahren Sie, was wo und warum erforderlich ist. Einige dieser Berechtigungen sind Obermengen von anderen, aber ich werde sie unabhängig voneinander auflisten, falls Sie Dinge anpassen und die Anforderungen für sie entfernen möchten:

  • Herunterfahren und Neuladen , was nicht überraschend genug ist, um eine Datenbank herunterzufahren oder zu bearbeiten, durchgeführt von /etc/init.d/mysql
  • Wählen Sie auf mysql.user aus. Dies ist für die Überprüfung der Integrität erforderlich, die beim Starten der Datenbank durchgeführt wird, um sicherzustellen, dass ein Root-Benutzer vorhanden ist. Erledige jeden Start mit / etc / mysql / debian-start (aufgerufen von /etc/init.d/mysql) mit dem aktuellen Code in der Funktion check_root_accounts in der Datei /usr/share/mysql/debian-start.inc.sh
  • select on information_schema.tables , global select , erforderlich für die Überprüfung auf abgestürzte Tabellen. Erledige jeden Start mit / etc / mysql / debian-start (aufgerufen von /etc/init.d/mysql) mit dem aktuellen Code in der Funktion check_for_crashed_tables in der Datei /usr/share/mysql/debian-start.inc.sh
  • global alle Berechtigungen , die für das Upgrade von Tabellen erforderlich sind, wenn eine neue Version von MySQL durch ein Update oder ein Debian-Upgrade installiert wird. Erledige jeden Start von / etc / mysql / debian-start (aufgerufen von /etc/init.d/mysql) mit dem aktuellen Code in der Funktion upgrade_system_tables_if_necessary in der Datei /usr/share/mysql/debian-start.inc.sh - Ruft tatsächlich die MySQL-Binärdatei mysql_upgrade auf - lassen Sie sich nicht vom Funktionsnamen täuschen (upgrade_system_tables_if_necessary), dies kann möglicherweise alle Tabellen berühren - siehe unten

Das letzte ist natürlich die Hauptanforderung für Privilegien. In der Manpage für mysql_upgrade heißt es:

mysql_upgrade überprüft alle Tabellen in allen Datenbanken auf Inkompatibilitäten mit der aktuellen Version von MySQL Server. mysql_upgrade aktualisiert auch die Systemtabellen, damit Sie neue Berechtigungen oder Funktionen nutzen können, die möglicherweise hinzugefügt wurden.

Wenn mysql_upgrade feststellt, dass eine Tabelle möglicherweise inkompatibel ist, führt es eine Tabellenprüfung durch und versucht, falls Probleme auftreten, eine Tabellenreparatur durchzuführen.

WARNUNG Wenn Sie die Berechtigungen von debian-sys-maint einschränken möchten, stellen Sie sicher, dass Sie bereit sind, zukünftige Debian-Sicherheitsupdates und / oder -Upgrades, die MySQL betreffen, manuell durchzuführen. Wenn Sie ein Update für die MySQL-Pakete mit einem reduzierten debian-sys-maint-Privileg durchführen und mysql_upgrade dadurch nicht abgeschlossen werden kann, bleibt Ihre Datenbank möglicherweise in einem undefinierten (Lesezustand). Das Reduzieren von Berechtigungen hat möglicherweise keine offensichtlichen alltäglichen Probleme, bis ein Update veröffentlicht wird. Gehen Sie also nicht davon aus, dass Sie bereits Berechtigungen ohne schädliche Auswirkungen reduziert haben, um davon auszugehen, dass sie sicher sind.

Kurt Fitzner
quelle
Danke für die ausführliche Antwort. Kaum zu glauben, dass diese Frage fast 10 Jahre alt ist!
Joe Holloway
Dies sollte eines der ersten Dinge sein, die Leute lesen.
FKEinternet
2

Als Randnotiz dazu werfen Sie einen Blick auf diesen mysqlperformance-Blog-Beitrag aus Gründen, warum Sie möglicherweise das debian-spezifische Zeug deaktivieren möchten.

Jon Topper
quelle
1
"Beachten Sie, dass dies kein Problem mit MySQL von Debian Lenny sein sollte, da es mit Init-Skripten geliefert wird, die CHECK TABLE nicht auf Nicht-MYISAM-Tabellen ausführen." - von der verlinkten Seite
d -_- b
2

Bei Verwendung von MySQL 5.6+ würde ich empfehlen, mit dem mysql_config_editorBefehl einen Eintrag für den Benutzer 'debian-sys-maint'@'localhost'mit dem entsprechenden Kennwort zu erstellen , dh, das Kennwort muss nicht im Klartext auf dem Server gespeichert werden.

mysql_config_editor set --login-path=debian-sys-maint --host=localhost --user=debian-sys-maint --password

Danach kann die debian-spezifische Konfigurationsdatei /etc/mysql/debian.cnfgeändert werden, so dass der Benutzername und das Passwort nicht in der Datei gespeichert werden.

Ändern Sie schließlich die logrotate-Datei für MySQL so, dass sie die in der ~/.mylogin.cnfDatei gespeicherten Anmeldedaten anstelle der debian-spezifischen Datei verwendet, indem Sie sie ersetzen

/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf

mit

/usr/bin/mysqladmin --login-path=debian-sys-maint

Hoffe das hilft :)

Dave

Dave Rix
quelle
Aber wird der Zweck des debian-sys-maint Benutzers dadurch erreicht? Diese Pakete sollten in der Lage sein, diesen Benutzer / dieses Kennwort für einige Systemwartungsarbeiten als rootBenutzer in der Linux-Domäne zu verwenden (kein rootBenutzer in MySQL, ohne dass der Administrator das rootKennwort für MySQL eingeben muss?
Anders
Bei meinen Tests funktioniert es, wenn Sie alle Änderungen vornehmen, z. B. das ändern /etc/mysql/debian.cnf, um die Kennwörter zu entfernen, und die Logrotate-Datei ändern, um die gesicherten Details zu verwenden. Ich bin nicht sicher, ob der Benutzer debian-sys-maint für irgendetwas anderes verwendet wird, aber wenn dies der Fall ist, kann dies Ihnen einen Hinweis geben, wo Debian dieses Benutzerkonto in Ihrem Namen verwendet.
Dave Rix