it-swarm.com.de

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

Ich habe gerade Ubuntu 16.04 LTS zusammen mit den Paketen php, mariadb und nginx installiert. Ich habe mysql_secure_installation ausgeführt und das root-Passwort geändert.

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

Wenn ich mich mit Sudo mysql anmelde, fragt mich mysql nicht einmal nach dem Passwort. Wenn ich mysql_secure_installtion starte, werden alte Einstellungen nie dauerhaft festgelegt.

Was mache ich falsch?

198
codescope

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

  1. Zuerst verbinden Sie sich 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 :)

351
Loremhipsum

Wenn Sie 5.7 installieren und dem Benutzer root kein Kennwort mitteilen, wird das auth_socket Plugin verwendet. Diesem Plugin ist es egal und es benötigt kein Passwort. Es prüft nur, ob der Benutzer eine Verbindung über einen UNIX-Socket herstellt, und vergleicht dann den Benutzernamen.

Entnommen aus Ändern des Benutzerpassworts in MySQL 5.7 mit "plugin: auth_socket"

Um also plugin zurück zu mysql_native_password zu ändern:

  1. Einloggen mit Sudo:

    Sudo mysql -u root
    
  2. Ändern Sie das plugin und 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.2 Benutzer) gibt es auch eine andere Möglichkeit, plugin nur zu ändern, ohne ein Kennwort 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;
128
Todor

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 Passwort oder das falsche Passwort ein. Sie werden wahrscheinlich hereingelassen. (Möglicherweise können Sie sich sogar mit # mysql vom Unix-Stammverzeichnis aus anmelden, da 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 auth_socket notieren (möglicherweise unix_socket auf MariaDB). Diese Sockets ignorieren Passwörter und lassen den entsprechenden Unix-Benutzer in ohne eine Passwortprüfung zu. 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 den auth_socket/unix_socket nicht verwenden und ein Kennwort ordnungsgemäß festlegen.

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_password Sie geben wörtlich ein.

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;

Für den Datensatz hat mich die Lösung, den Benutzer zu löschen und ihn mit '%' neu zu erstellen, völlig aus der Datenbank ausgeschlossen und kann andere Probleme verursachen, es sei denn, Sie haben die Anweisung grant genau richtig verstanden - einfacher, das Stammverzeichnis zu aktualisieren du hast bereits.

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.

21
Gazzer

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)

  1. Einloggen in die MySQL-Root-Shell:

    $ 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

8

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
    
2
Alex Yakovlev

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 root zu löschen.

2
Franc Drobnič

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+Z und geben Sie Folgendes ein: bg, um den Prozess vom Vordergrund in den Hintergrund zu führen. Überprüfen Sie dann Ihren Zugriff durch:

mysql -u root -proot
mysql> show grants;
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';

1
Vadiaz

Ich habe einige von mir erstellte Bereitstellungsskripte für die Verwendung von MariaDB angepasst und bin auf genau dieses Problem gestoßen. Hier viele Infos zusammenstellen und Gazzers Antwort wirklich Nullen in der Ausgabe; Alles läuft auf die Einstellung auth_socket/unix_socket 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 die Antwort mit der höchsten Stimmenzahl in diesem Beitrag von Loremhipsum - regen wirklich zu schlechten Praktiken an, indem sie empfehlen, einen Benutzer zu löschen und sie dann neu zu erstellen. Für mich ist das eine ziemlich radikale Lösung. Die beste/einfachste Lösung ist, den Wert plugin aufzuheben, Berechtigungen zu löschen und mit dem Leben weiterzumachen.

0
JakeGould