web-dev-qa-db-ja.com

ubuntu 16.04の通常のユーザーアカウントからmysqlユーザールートとしてログインできない

パッケージphpmariadb、およびnginxとともにUbuntu 16.04 LTSをインストールしました。 mysql_secure_installationを実行し、rootパスワードを変更しました。

これで、通常のユーザーアカウントとしてUbuntuにログインしているときにルートアカウントを使用してmysqlにログインしようとすると、アクセスが拒否されます。

Sudo mysqlを使用してログインすると、mysqlはパスワードを要求しません。 mysql_secure_installtionを実行すると、古い設定が永続的に設定されないことがわかります。

何が間違っていますか?

198
codescope

最近、Ubuntu 15.04を16.04にアップグレードしましたが、これでうまくいきました。

  1. まず、Sudo mysqlで接続します

    Sudo mysql -u root
    
  2. データベースに存在するアカウントを確認してください

    SELECT User,Host FROM mysql.user;
    +------------------+-----------+
    | User             | Host      |
    +------------------+-----------+
    | admin            | localhost |
    | debian-sys-maint | localhost |
    | magento_user     | localhost |
    | mysql.sys        | localhost |
    | root             | localhost |
    
  3. 現在のroot @ localhostアカウントを削除する

    mysql> DROP USER 'root'@'localhost';
    Query OK, 0 rows affected (0,00 sec)
    
  4. ユーザーを再作成する

    mysql> CREATE USER 'root'@'%' IDENTIFIED BY '';
    Query OK, 0 rows affected (0,00 sec)
    
  5. ユーザーに許可を与えます(特権をフラッシュすることを忘れないでください)

    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. MySQLを終了し、Sudoなしで再接続を試みます。

これが誰かを助けることを願っています:)

351
Loremhipsum

5.7をインストールし、rootユーザーにパスワードを提供しない場合、auth_socketプラグインが使用されます。そのプラグインは気にせず、パスワードを必要としません。ユーザーがUNIXソケットを使用して接続しているかどうかを確認し、ユーザー名を比較します。

「plugin:auth_socket」を使用したMySQL 5.7のユーザーパスワードの変更

したがって、pluginmysql_native_passwordに戻すには:

  1. Sudoでログイン:

    Sudo mysql -u root
    
  2. pluginを変更し、1つのコマンドでパスワードを設定します。

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

もちろん、上記のコマンドを使用して空のパスワードを設定することもできます。

レコード(およびMariaDB < 10.2ユーザー)だけのために、パスワードを提供せずにpluginのみを変更する(空のままにする)別の方法もあります。

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

要するに、MariaDBで

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

nEWPASSWORDを必要なパスワードに置き換えます。

ここでの問題は、MariaDBまたはMySQLがインストール/更新されるとき(特にある時点でルートがパスワードなしで設定されている場合)、Usersテーブルでパスワードが実際に空(または無視)であり、ログインは対応するシステムユーザーに依存することですMySQLユーザーに。システムルートに切り替えて、次のように入力すると、次のようにテストできます。

mysql -uroot -p

次に、パスワードを入力しないか、wrongパスワードを入力します。おそらくあなたは許可されます(パスワードは無関係であり、ユーザーが定義されているので、単に# mysqlでunixルートからログインすることさえできます)。

それで何が起きているのでしょうか?さて、rootとしてログインして次の操作を行うと:

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

auth_socket(MariaDBではunix_socketと表示される場合があります)に注意してください。これらのソケットはパスワードを無視し、withoutパスワードチェックで対応するUnixユーザーを許可します。これがrootでログインできるが、別のユーザーではログインできない理由です。

したがって、解決策は、auth_socket/unix_socketを使用しないようにユーザーを更新し、パスワードを適切に設定することです。

2017年のUbuntuバージョン16にあるMariaDB(<10.2、以下のコメントを参照)ではこれで十分です。 NEWPASSWORDはパスワードです。 mysql_native_passwordをそのまま入力します。

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

(プラグインを空に設定しても機能する可能性があります。YMMV。私はこれを試しませんでした。したがって、これは代替です。)

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

そうでなければ:

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

それから

FLUSH PRIVILEGES;

記録のために、ユーザーを削除して '%'で再作成するソリューションでは、データベースから完全にロックアウトされ、grantステートメントを正確に取得しない限り、他の問題を引き起こす可能性があります。あなたはすでに持っています。

私の経験では、他のユーザーは初期インストール/更新の一部ではなく手動で追加されるため、この問題はrootユーザーでのみ発生します。

21
Gazzer

ベースリポジトリからMySQL/MariaDBをインストールした場合、ユーザーはUnixログインからMySQLルートユーザーとしてMySQLにログインできません(Sudoアクセス)

  1. MySQLルートシェルにログインします。

    $ Sudo mysql -u root -p
    
  2. 以下のクエリを実行します。

    use mysql;
    update user set plugin='mysql_native_password' where user='root';
    flush privileges; 
    quit;
    
  3. 新しいシェルを開いてから:

    $ mysql -u root -p
    

ソース

8

新しいmysqlアカウントを作成してみてください、私にとってはうまくいきました(mysql 5.7.12):

  1. Sudoとしてログイン:

    Sudo mysql -uroot
    
  2. 新しいユーザーを作成し、権限を付与します(パスワードなし):

    CREATE USER 'admin'@'localhost' IDENTIFIED BY '';
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
    
  3. 新しいユーザーとしてログイン:

    mysql -uadmin
    
2
Alex Yakovlev

私は2つのことをしなければなりませんでした(@Todorと@Loremhipsumに感謝します):

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

その後:

FLUSH PRIVILEGES;

ユーザーrootを削除することはお勧めしません。

2
Franc Drobnič

最初にこのコードを試してください、

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

その後、

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

次にCtrl+Zを押してbgと入力して、フォアグラウンドからバックグラウンドにプロセスを実行し、次の方法でアクセスを確認します。

mysql -u root -proot
mysql> show grants;
1

Rootユーザーでmysqlコマンドを実行すると、root @ localhostでソケット認証が有効になるため、パスワードを要求されることなくアクセスが許可されます。 。

パスワードを設定する唯一の方法は、次のようなネイティブ認証に切り替えることです。

$須藤mysql

mysql> ALTER USER 'root' @ 'localhost' mysql_native_password WITH 'test'で識別;

1
Vadiaz

MariaDBを使用するために作成したいくつかのプロビジョニングスクリプトを調整しており、この問題に遭遇しました。ここで多くの情報をつなぎ合わせて Gazzerの答え 問題に本当にゼロが入ります。すべてはauth_socket/unix_socket設定に要約されます。

そのため、MariaDB 5.5(Ubuntu 14.04)およびMariaDB 10(Ubuntu 16.04)を使用している場合、MySQLにログインしてこのコマンドを実行すると、すぐに問題が解決しました。

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

Loremhipsumによるこの投稿の時点で最も投票された回答 を含む他の回答は、ユーザーをドロップしてから再作成することを推奨することにより、悪い習慣を本当に奨励します。私にとって、それはかなり根本的な解決策です。 pluginの値を無効にし、特権をフラッシュし、生き延びるための最良/最も簡単なソリューションです。

0
JakeGould