Ich kann mich in Ubuntu 16.04 nicht als MySQL-Benutzer root von einem normalen Benutzerkonto aus anmelden

203

Ich Ubuntu nur 16.04 LTS installiert zusammen mit den Paketen php, mariadbund nginx. Ich lief mysql_secure_installationund änderte das root-Passwort.

Wenn ich versuche, mich mysqlmit dem Root-Konto anzumelden, während ich unter Ubuntu als normaler Benutzer angemeldet bin, wird mir der Zugriff verweigert.

Wenn ich mich mit sudo mysqlanmelde, fragt mich mysql nicht einmal nach dem Passwort. Wenn ich laufe, mysql_secure_installtionsehe ich, dass alte Einstellungen nie dauerhaft festgelegt wurden.

Was mache ich falsch?

codescope
quelle

Antworten:

359

Ich habe kürzlich mein Ubuntu 15.04 auf 16.04 aktualisiert und das hat bei mir funktioniert:

  1. Verbinden Sie sich zuerst in sudo mysql

    sudo mysql -u root
    
  2. Überprüfen Sie Ihre in Ihrer Datenbank vorhandenen Konten

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. Löschen Sie das aktuelle root @ localhost-Konto

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. Erstellen Sie Ihren Benutzer neu

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. Erteilen Sie Ihrem Benutzer Berechtigungen (vergessen Sie nicht, Berechtigungen zu löschen)

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
    Query OK, 0 rows affected (0,00 sec)
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0,01 sec)
    
  6. Beenden Sie MySQL und versuchen Sie, die Verbindung ohne sudo wiederherzustellen.

Ich hoffe das hilft jemandem :)

Loremhipsum
quelle
16
Das war das einzige, was bei mir funktioniert hat. Weiß jemand genau, was mit dem Root-Benutzer passiert ist, als Sie mysql-server auf 16.04 installiert haben?
Ruggi
32
Halten Sie es, bedeutet nicht, %dass Sie von überall aus eine Verbindung herstellen können ... aus der Ferne?
Stevie G
9
Sie können die Zeile folgendermaßen ändern: CREATE USER 'root' @ 'localhost' IDENTIFIED BY '';
vladnev
11
Für die Sicherheitsbeteiligten: Das ungesicherte Verbindungsmuster root @ localhost mysql ist ein Hauptbestandteil der lokalen Entwicklung , sollte aber nirgendwo anders auftauchen.
Charney Kaye
5
Die Grant-Anweisung für den neuen Root-Benutzer gibt hier kein "mit Grant" an Root aus, sodass Root nicht gewähren kann, ohne dies anschließend auszuführen : dba.stackexchange.com/a/62046/115679 Ändern Sie die Grant-Anweisung ingrant all privileges on *.* to 'root'@'localhost' with grant option;
Loren
132

Wenn Sie 5.7 installieren und dem rootBenutzer kein Kennwort mitteilen, wird das auth_socketPlugin verwendet. Das Plugin kümmert sich nicht und benötigt kein Passwort. Es prüft nur, ob der Benutzer eine Verbindung über einen UNIX-Socket herstellt, und vergleicht dann den Benutzernamen.

Übernahme von Change User Password in MySQL 5.7 mit "plugin: auth_socket"

Um also den pluginRücken zu ändern mysql_native_password:

  1. Einloggen mit sudo:

    sudo mysql -u root
    
  2. Ändern Sie das pluginund setzen Sie ein Passwort mit einem einzigen Befehl:

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'test';
    

Natürlich können Sie auch den obigen Befehl verwenden, um ein leeres Kennwort festzulegen.

Nur für den Datensatz (und MariaDB < 10.2Benutzer) gibt es auch eine andere Möglichkeit, nur das zu ändern, pluginohne ein Passwort anzugeben (es leer zu lassen):

update mysql.user set plugin = 'mysql_native_password' where User='root';
// to change the password too (credits goes to Pothi Kalimuthu)
// UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root';
FLUSH PRIVILEGES;
Todor
quelle
2
Vielen Dank, aus irgendeinem Grund wurde dies nach einem passenden Upgrade, glaube ich, plötzlich automatisch eingestellt ...
Tominator
4
Außerdem gefällt mir diese Antwort besser - sie ist viel weniger destruktiv ;-)
benzkji
3
Damit MariaDB <10.2 das Plugin zusammen mit dem Passwort ändert,UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('secret') WHERE User = 'root'; FLUSH PRIVILEGES;
lautet
5
Dies sollte die akzeptierte Antwort sein
Geo C.
3
Ich wünschte, ich könnte dies zweimal abstimmen.
James Smith
21

Kurz gesagt, auf MariaDB

UPDATE mysql.user SET plugin = 'mysql_native_password', 
      Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

Hier ersetzen Sie NEWPASSWORD durch das gewünschte Passwort und alles andere wörtlich.

Das Problem hierbei ist, dass bei der Installation / Aktualisierung von MariaDB oder MySQL (insbesondere wenn irgendwann root ohne Kennwort festgelegt wird) in der Tabelle Users das Kennwort tatsächlich leer ist (oder ignoriert wird) und die Anmeldung vom entsprechenden Systembenutzer abhängt an einen MySQL-Benutzer. Sie können dies folgendermaßen testen, indem Sie zum Systemstamm wechseln und dann Folgendes eingeben:

mysql -uroot -p

Geben Sie dann entweder kein oder das falsche Passwort ein. Sie werden wahrscheinlich hereingelassen. (Möglicherweise können Sie sich sogar vom Unix-Stammverzeichnis aus anmelden, # mysqlda das Kennwort irrelevant und der Benutzer definiert ist.)

Also was passiert gerade? Nun, wenn Sie sich als root anmelden und Folgendes tun:

select User,host,plugin from mysql.user; 
+----------------+-----------+-----------------------+
| User           | host      | plugin                |
+----------------+-----------+-----------------------+
| root           | localhost | auth_socket           |
+----------------+-----------+-----------------------+

Sie werden feststellen auth_socket(was unix_socketauf MariaDB lesen kann ). Diese Sockets ignorieren Passwörter und lassen den entsprechenden Unix-Benutzer ohne Passwortprüfung ein. Aus diesem Grund können Sie sich mit root anmelden, jedoch nicht mit einem anderen Benutzer.

Die Lösung besteht also darin, die Benutzer so zu aktualisieren, dass sie das auth_socket/unix_socketKennwort nicht verwenden und es ordnungsgemäß einrichten.

Auf MariaDB (<10.2, siehe Kommentare unten), die ab 2017 auf Ubuntu 16 verfügbar ist, sollte dies ausreichen. NEWPASSWORD ist Ihr Passwort. mysql_native_passwordSie geben wörtlich.

UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

(Es ist möglich, dass das Setzen des Plugins auf "leer" funktioniert. YMMV. Ich habe das nicht ausprobiert. Das ist also eine Alternative.)

UPDATE mysql.user SET plugin = '', Password = PASSWORD('NEWPASSWORD') WHERE User = 'root';

Andernfalls:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'NEWPASSWORD';

Dann

FLUSH PRIVILEGES;

Die Lösung, die darin besteht, den Benutzer zu löschen und ihn mit '%' neu zu erstellen, hat mich vollständig aus der Datenbank ausgesperrt und kann andere Probleme verursachen, wenn Sie die grantAnweisung nicht genau richtig verstehen.

Nach meiner Erfahrung tritt das Problem nur beim Root-Benutzer auf, da andere Benutzer manuell hinzugefügt werden und nicht Teil einer Erstinstallation / -aktualisierung sind.

Gazzer
quelle
2
Ich fand, dass dies perfekt funktioniert. Ich frage mich jedoch, warum das Ändern des root-Passworts mit mysql_secure_installationnicht den gleichen Effekt hatte. Wo speichert es das neue Passwort?
Mausy5043
Können Sie Ihre Antwort bearbeiten und später mehr zu den einzelnen Befehlen sagen? Mir ist nicht klar, welche anwendbar sind. Gilt UPDATEdas für MariaDB <10.2 und für die ALTERanderen Versionen? Und ist die zweite UPDATEeine Alternative zur ersten, oder müssen wir beide eingeben? Ist 'mysql_native_password' etwas, das wörtlich eingegeben werden kann, oder sollten wir es durch unser beabsichtigtes Root-Passwort für MySQL ersetzen?
Michael Scheper
1
@MichaelScheper Es ist eine Weile her, also möchte ich nicht zu viel bearbeiten, aber hier ist, woran ich mich erinnere. (1) Führen Sie nur das erste UPDATE durch (<10.2 ist möglicherweise nicht erforderlich). (2) Ja, geben Sie "mysql_native_password" wörtlich ein. Im Wesentlichen sagen Sie mariadb: "Verwenden Sie keine Unix-Berechtigungen, verwenden Sie die Datenbank-Berechtigungen". Das mysql_native_passwordist diese Option.
Gazzer
Verdammt, ich habe "Privileg" falsch geschrieben!
Gazzer
1
Sieht so aus, als hätten Sie das Bearbeitungszeitlimit auch nur um 1½ Minuten verfehlt! Das frustriert mich manchmal auch. Trotzdem danke!
Michael Scheper
8

Wenn Sie MySQL / MariaDB aus dem Basis-Repository installiert haben, können sich Benutzer nicht über ihre Unix-Anmeldungen bei MySQL als MySQL-Root anmelden (gilt nicht, wenn sie sudo- Zugriff haben).

  1. Melden Sie sich bei der MySQL-Root-Shell an:

    $ sudo mysql -u root -p
    
  2. Führen Sie die folgenden Abfragen aus:

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. Öffne eine neue Shell, dann:

    $ mysql -u root -p
    

Quelle

Gayan Weerakutti
quelle
Als ich das tat, konnte ich mysql nicht mehr als root verwenden. Ich musste zuerst su und konnte mich dann als root bei mysql einloggen. Also habe ich es wieder in auth_socket geändert.
Bis zum
Einzelbefehl:mysql -u root -p -e "use mysql;update user set plugin='mysql_native_password' where user='root';flush privileges;"
Chris Stryczynski
Wenn Sie den Zugriff auf Ihre MySQL-Instanz verlieren möchten, ist diese Antwort der einfache Weg.
Danila Vershinin
2

Versuche einen neuen MySQL Account zu erstellen, bei mir hat es geklappt (MySQL 5.7.12):

  1. Melden Sie sich als sudo an:

    sudo mysql -uroot
    
  2. Erstellen Sie einen neuen Benutzer und gewähren Sie ihm Berechtigungen (kein Passwort):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. Als neuer Benutzer anmelden:

    mysql -uadmin
    
Alex Yakovlev
quelle
2

Ich musste zwei Dinge tun (danke an @Todor und @Loremhipsum):

update mysql.user set plugin = 'mysql_native_password' where User='root';
grant all privileges on *.* to 'root'@'localhost';

und dann:

FLUSH PRIVILEGES;

Ich würde nicht empfehlen, Benutzer fallen zu lassen root.

Franc Drobnič
quelle
1

Versuchen Sie diesen Code zuerst,

echo "CREATE USER 'root'@'localhost' IDENTIFIED BY 'root';" > your_init_file.sql
echo "GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;" >> your_init_file.sql 
echo "FLUSH PRIVILEGES;" >> your_init_file.sql

und dann,

killall mysqld
mysqld_safe --init-file=$PWD/your_init_file.sql

Drücken Sie dann Ctrl+Zund geben Sie Folgendes ein bg:, um den Prozess vom Vordergrund in den Hintergrund zu starten. Überprüfen Sie dann Ihren Zugriff durch:

mysql -u root -proot
mysql> show grants;
ADHITHYA SRINIVASAN
quelle
1

Wenn Sie den Befehl mysql nur unter dem Root-Benutzer ausführen, wird Ihnen der Zugriff gewährt, ohne dass Sie nach dem Kennwort gefragt werden, da die Socket-Authentifizierung für root @ localhost aktiviert ist. .

Die einzige Möglichkeit, ein Kennwort festzulegen, besteht darin, zur systemeigenen Authentifizierung zu wechseln, z.

$ sudo mysql

mysql> ALTER USER 'root' @ 'localhost' IDENTIFIZIERT MIT mysql_native_password BY 'test';

Vadiaz
quelle
0

Ich habe einige von mir erstellte Bereitstellungsskripte für die Verwendung von MariaDB angepasst und bin auf genau dieses Problem gestoßen. Wenn Sie hier eine Menge Informationen zusammenstellen, ist die Antwort eines Gazzers in der Ausgabe wirklich Null . es läuft alles auf die auth_socket/ unix_socket-Einstellung hinaus.

Wenn Sie also MariaDB 5.5 (unter Ubuntu 14.04) und MariaDB 10 (unter Ubuntu 16.04) verwenden, haben Sie sich bei MySQL angemeldet und diesen Befehl ausgeführt.

UPDATE mysql.user SET plugin='' WHERE User='root';
FLUSH PRIVILEGES;

Die anderen Antworten - einschließlich der am höchsten bewerteten Antwort in diesem Beitrag von Loremhipsum - ermutigen wirklich zu schlechten Praktiken, indem sie empfehlen, einen Benutzer zu löschen und anschließend neu zu erstellen. Für mich ist das eine ziemlich radikale Lösung. Die beste / einfachste Lösung ist, den pluginWert aufzuheben , Berechtigungen zu löschen und mit dem Leben weiterzumachen .

JakeGould
quelle
-1

Ich hatte das gleiche Problem und habe Folgendes behoben:

mysql_upgrade --force
klob
quelle
Leider hat das nicht funktioniert. Ich installiere Ubuntu neu.
Codescope
1
Ich habe gerade eine Neuinstallation von Ubuntu 16.04 durchgeführt und den Mariad-Server installiert. Nach der Installation habe ich mysql_secure_installation ausgeführt und ein Passwort gesetzt. Nachdem ich die restlichen Schritte in mysql_secure_installation durchgearbeitet habe, habe ich es erneut ausgeführt und es sieht so aus, als würde es die Änderungen nicht speichern. Ich kann mich immer noch nicht von meinem normalen Benutzerkonto aus anmelden. Könnte es ein Fehler sein?
Codescope
Das wird niemals helfen. Das Problem hat nichts tun mit der tatsächlichen von der MariaDB binären installieren , sondern der Benutzer rootmit eingestellt werden pluginEinstellungen , die nicht Standard sind. Der einzige Randfall, in dem ein Upgrade der Datenbank in einem solchen Fall hilfreich sein könnte, ist, wenn der mysql_upgradeProzess selbst die pluginEinstellung berücksichtigt , die ich bezweifle.
JakeGould