tohokuaikiのチラシの裏

技術的ネタとか。

MariaDBでrootでログインしている場合はノンパスワードでshellからコネクトする

こんな感じ

これでいきなりログインできるようにしたい。

sudo mysql -u root
MariaDB [(none)]>

MariaDBによるとrootのシェル取ってるんだから、MariaDBで認証してても無駄ですよねって。そりゃそーだ。

やり方

unix_socketというプラグインを使うとできるということで、これを有効にする。

プラグインの状況を確認してインストール

まず、パスワード付きでmariadbに接続

mysql -u root -p

プラグインの状態確認

show plugins;

| unix_socket                   | ACTIVE   | AUTHENTICATION     | auth_socket.so | GPL     |

と出ていればいいんだけど、多分まだ出てないんですよね。なのでMySQLコマンドで、

INSTALL SONAME 'auth_socket';

としてインストール。

もし

| unix_socket                   | DISABLED | AUTHENTICATION     | auth_socket.so | GPL     |

となっていれば、

UNINSTALL PLUGIN unix_socket;
INSTALL PLUGIN unix_socket;

として再インストールする。

MariaDBの再起動時にも有効にするために、/etc/my.cnf

[mysqld]
plugin_load_add = auth_socket

として永続化する。

rootがunix_socketを使えるようにする

以下のUPDATE文を走らせる。

UPDATE mysql.user SET plugin = 'unix_socket' WHERE user = 'root' AND host = 'localhost';
flush privileges;

これでパスワード無しでいける。

SELECT user, host, plugin FROM mysql.user WHERE user = 'root';

+------+-----------+-------------+
| user | host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket |
+------+-----------+-------------+

となっていればOK。ちなみに、MySQLの場合はunix_socketではなくauth_socket

プラグインをロードする前にrootにunix_socketを使わせるUPDATE文を実行してしまった場合

残念ながら、mysql -u root しても、 ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded となってMariaDBに接続できない。

落ち着いて、MariaDBをsafeモードで再起動する

systemctl stop mariadb
mysqld_safe --skip-grant-tables --skip-networking &
  • --skip-grant-tables:ユーザー認証なしですべての操作が可能
  • --skip-networking:外部アクセス禁止(安全対策)

すると、 mysql -u root で入れるので

UPDATE mysql.user SET plugin = '' WHERE user = 'root' AND host = 'localhost';

として元のパスワードありに戻す。

戻したら、ps auxw|grep mysqld_safe で出てきたPIDをkillして、MariaDBを起動