web-dev-qa-db-ja.com

パスワードが指定されていない場合にMySQLルートログインを無効にする方法は?

MySQLは私のラップトップにインストールされており、rootパスワードを入力せずにログインできることを除いて、正常に動作します。 rootパスワードを入力してログインすることもできます。指定されたパスワードが一致しない場合、アクセスを拒否します。ルートパスワードは、MySQLを最初にインストールしたときに自分で選択したものに変更されました。今日、パスワードなしのログインに気づきました。

そのため、パスワードが指定されていない場合は、rootアカウントへのアクセスを停止する必要があります。私がこれまでに試したことは、rootパスワードを次のようにリセットすることです。

mysqladmin -u root password TopSecretPassword

次に、コンソールにログインして、次のコマンドを発行しました。

mysql>フラッシュ特権;出口;

私はまだMySQLにログインすることができます:

%> mysql -u {enter}

この動作を停止するにはどうすればよいですか?

さらなる詳細:

%> mysql -u {enter} 
 
 mysql> SELECT USER()、CURRENT_USER(); 
> root @ localhost、root @ localhost 
 
 mysql> SELECT COUNT(*)FROM mysql.users WHERE user = 'root' AND password = ''; 
> COUNT(*)
> 0 
 
 mysql> SELECT COUNT(*)FROM mysql.users WHERE user = ''; 
> COUNT(*)
> 0 
 
 mysql> SELECT COUNT (*)FROM mysql.users WHERE user = 'root'; 
> COUNT(*)
> 1 
 
%> vi /etc/my.cnf 
/skip-grant-tables 
> E486:パターンが見つかりません:skip-grant-tables 
 
13
a coder

この質問は数か月前のものですが、同じ問題が発生しました。

私の場合は、〜/ .my.cnfにユーザーとパスワードを含むユーザー固有の構成ファイルが存在することが原因でした。私の場合、cPanelはこの設定ファイルを作成しました。

[client]
pass="ROOT_PASSWORD_WAS_HERE!"
user=root

ユーザー固有の構成ファイルはMySQlの機能であり、読み取られるすべての構成ファイルの場所については、ドキュメントで詳しく説明されています。 http://dev.mysql.com/doc/refman/5.1/en/option- files.html

* nix distでmysqlを実行している場合は、次のコマンドを実行して、ユーザー固有の構成ファイルがあるかどうかを確認します。

cat ~/.my.cnf 
6
coffeefiend

MySQL/MariaDBの新しいバージョン(Debian Stretchなど)でこの動作が発生するユーザーは、mysql.userテーブルに「plugin」という列があることに注意する必要があります。 'unix_socket'プラグインが有効になっている場合、rootはパスワードを必要とせずにコマンドラインからログインできます。他のログインメカニズムは無効になります。

それが事実かどうかを確認するには:

SELECT Host, user, password, plugin FROM mysql.user;

これは次のようなものを返すはずです(unix_socketが有効になっている場合):

+-----------+------+--------------------------+-------------+
| Host      | user | password                 | plugin      |
+-----------+------+--------------------------+-------------+
| localhost | root | <redacted_password_hash> | unix_socket |
+-----------+------+--------------------------+-------------+

これを無効にして、rootにパスワードの使用を要求するには:

UPDATE mysql.user SET plugin = '' WHERE user = 'root' AND Host = 'localhost';
FLUSH PRIVILEGES;

注:MySQLの新しいバージョン(5.7.xなど)の@marioivangf(コメント内)で指摘されているように、プラグインを 'に設定する必要がある場合があります。 mysql_native_password '(空白ではなく)。

次に再起動します。

service mysql restart

問題が修正されました!:

root@lamp ~# mysql
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

出典: https://stackoverflow.com/a/44301734/3363571 @SakuraKinomotoに感謝します(これが役に立ったら、彼の答えに投票してください)。

14
Jeremy Davis

1人以上の匿名ユーザーがいるようです。

それらを確認するには、次のクエリを実行します。

_SELECT user,Host,password FROM mysql.user WHERE user='';
_

そのように認証されたことを確認するには、次のコマンドを実行します。

_SELECT USER(),CURRENT_USER();
_

これは、ログインを試みた方法とmysqlがログインを許可した方法を示します

次の2つのクエリを実行します。

_DELETE FROM mysql.user WHERE user='';
FLUSH PRIVILEGES;
_

それはそれをする必要があります!!!

警告#1

これが機能しない場合は、/ etc /my.cnfでこのオプションを確認してください。

_skip-grant-tables
_

それがmy.cnfにある場合は、それを削除してmysqlを再起動します。

警告#2

他に注意すべき点は、複数のルートユーザーがいることです。これを実行してください:

_SELECT user,Host,password FROM mysql.user WHERE user='root';
_

Rootをパスワードを持つように定義し、それでもrootとして取得する場合、これは複数のrootユーザーがいることを示しています。 mysql.userにこれらのエントリがある可能性があります

rootユーザーがパスワードを持っていない場合、mysqlは任意のrootユーザーからの認証を許可する場合があります。これは、SELECT USER(),CURRENT_USER();を実行すると明らかになります。これは、各関数の出力が異なるものとして表示されるためです。

1人のrootユーザーがMD5パスワードを持っていて、他のすべてのrootユーザーが持っていない場合、次のようにそのMD5パスワードを他のrootユーザーに広めることができます。

_UPDATE mysql.user
SET password = 
(
    SELECT password FROM mysql.user
    WHERE user='root' AND password <> ''
)
WHERE user='root' AND password = '';
FLUSH PRIVILEGES;
_
5
RolandoMySQLDBA

Rootパスワードを変更し、パスワードなしでrootログインを停止する方法を検索しているときに誰かがこの投稿に出くわした場合、Perconaはもう一度私のお尻を保存しました:

https://www.percona.com/blog/2016/03/16/change-user-password-in-mysql-5-7-with-plugin-auth_socket/

基本的に私のために働いたコマンド:

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

0
SomeOne_1