ryotatake blog

Webエンジニア

`mysql -u root -p` でERROR 1698 (28000): Access denied for user 'root'@'localhost'と表示されるときの解決方法

mysql_secure_installationrootのパスワードを設定した後、mysql -u root -pとしたときに以下のようにエラーが出て困ったので、解決方法をまとめます。

$ mysql -u root -p
Enter password:  
ERROR 1698 (28000): Access denied for user 'root'@'localhost' 

環境

事象

$ sudo apt install mysql-server

MySQL 5.7をインストールした後、mysql_secure_installationで初期設定を行いました。

mysql_secure_installationでは最初にrootのパスワードを設定するように言われるので、パスワードを設定して指示に従って最後まで設定を進めました。

$ sudo mysql_secure_installation

Securing the MySQL server deployment. 

Connecting to MySQL using a blank password.
The 'validate_password' plugin is installed on the server. 
The subsequent steps will run with the existing configuration
of the plugin.
Please set the password for root here.

New password:
 
Re-enter new password:

...(略)

しかしこのパスワードを使ってmysqlにアクセスしようとすると権限で弾かれます。

$ mysql -u root -p
Enter password:  
ERROR 1698 (28000): Access denied for user 'root'@'localhost' 

ちなみに、sudo mysql -u rootであればエラーせずに入れました。

原因

MySQL 5.7では認証にauth_socket plugin(MySQL :: Security in MySQL :: 6.1.11 Socket Peer-Credential Pluggable Authentication) というものを使っていて、これを使っているとパスワードではアクセスできず、MySQLのユーザー名と、システムのユーザー名が一致しているときのみアクセスできるようです。

次のようにして確かめられます。

$ sudo mysql -u root

mysql> USE mysql;
mysql> SELECT User, Host, plugin FROM mysql.user; 
+------------------+-----------+-----------------------+ 
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| root             | localhost | auth_socket           |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| debian-sys-maint | localhost | mysql_native_password |
+------------------+-----------+-----------------------+

通常のパスワードで入るには、mysql_native_password pluginを使います。

mysql_secure_installationでパスワードを設定したならauth_socketからmysql_native_passwordに勝手に変更していてほしいですが、バグのようでそうなっていません。

Bug #1610574 “mysql_secure_installation/mysqladmin cannot set password when auth_socket is enabled” : Bugs : mysql-5.7 package : Ubuntu

解決方法

解決方法は2つあります。

  1. rootの認証をmysql_native_password pluginを使うように変える。
  2. システムユーザーと同じ名前のユーザーをauth_socket pluginを使うように作り、mysql -u {system-user-name}でアクセスするようにする。

1. rootの認証をmysql_native_password pluginを使うように変える

$ sudo mysql -u root

mysql> USE mysql;
mysql> UPDATE user SET plugin='mysql_native_password' WHERE User='root';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ sudo service mysql restart
$ mysql -u root -p
Enter password:

2. システムユーザーと同じ名前のユーザーをauth_socket pluginを使うように作り、mysql -u {system-user-name}でアクセスするようにする

以下のYOUR_SYSTEM_USERNEW_PASSWORDを置き換えてください。
パスワードはauth_socketを使う場合は使うことがないですが、mysql_secure_installationで設定したバリデーションに引っかからないような文字列を入力しないとuserが作れません。

$ sudo mysql -u root

mysql> USE mysql;
mysql> CREATE USER 'YOUR_SYSTEM_USER'@'localhost' IDENTIFIED BY 'NEW_PASSWORD';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'YOUR_SYSTEM_USER'@'localhost';
mysql> UPDATE user SET plugin='auth_socket' WHERE User='YOUR_SYSTEM_USER';
mysql> FLUSH PRIVILEGES;
mysql> exit;

$ service mysql restart
$ mysql -u YOUR_SYSTEM_USER

解決方法はこちらを完全に参考にさせていただきました。
mysql - ERROR 1698 (28000): Access denied for user 'root'@'localhost' - Stack Overflow

参考