Raspbian LAMP化 [4] MariaDB

先日の"Raspberry Pi 3 Model B" LAMP化 : 準備編に続き、MariaDB を導入します。

目次

MariaDB 導入

$ sudo apt-get install mariadb-server mycli

以下の追加パッケージがインストールされます:
  python3-click python3-colorama python3-configobj python3-crypto
  python3-pkg-resources python3-prompt-toolkit python3-pygments
  python3-pymysql python3-six python3-sqlparse python3-wcwidth
提案パッケージ:
  python-configobj-doc python3-crypto-dbg python-crypto-doc python3-setuptools
  ttf-bitstream-vera python-pymysql-doc python-sqlparse-doc
以下のパッケージが新たにインストールされます:
  mariadb-server mycli python3-click python3-colorama python3-configobj
  python3-crypto python3-pkg-resources python3-prompt-toolkit python3-pygments
  python3-pymysql python3-six python3-sqlparse python3-wcwidth
アップグレード: 0 個、新規インストール: 13 個、削除: 0 個、保留: 0 個。

初期設定

初期設定は、MySQL と同じコマンド「mysql_secure_installation」を使います。

なぜか、アクセスが拒否されます。

※以下では、空Enter を押しています。
インストール直後、root のパスワードは未設定なので、Enter キー押下の後、パスワード設定を行うのですが・・・。

$ mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
Enter current password for root (enter for none): 
Aborting!

Cleaning up...

原因の確認

ターミナルからログイン

ターミナルからだとログインできます。

$ sudo mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 61
Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0

プラグイン

root ユーザにプラグインが設定されています。
なお、ユーザ cacti があるのは、サーバ管理ツールCactiをインストールしているからです。

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [mysql]> select host, user, password, plugin from user;
+-----------+-------+-------------------------------------------+-------------+
| host      | user  | password                                  | plugin      |
+-----------+-------+-------------------------------------------+-------------+
| localhost | root  |                                           | unix_socket |
| localhost | cacti | *F1B0E5B59A161BF409661F3EC6FC979BE4646AC4 |             |
+-----------+-------+-------------------------------------------+-------------+
2 rows in set (0.00 sec)
unix_socket プラグイン

認証プラグイン「Unix Socket」が有効だと、強制的に Unixソケット経由での接続になるようです。
Unixソケット経由(Unixドメインソケット通信)だと、通信範囲が localhost に限定されるというセキュアなメリットもありますが、OS認証後に利用可能になるプラグインのため、mysql_secure_installation と相性が良くないのでしょう。

base on Authentication Plugin - Unix Socket - MariaDB Knowledge Base

This plugin allows the user to use operating system credentials when connecting to MariaDB via Unix socket.

The UNIX_SOCKET plugin is installed by default in new installs of Ubuntu 15.10 and later, and Debian testing.

このプラグインを使用すると、Unixソケット経由でMariaDBに接続するときに、オペレーティングシステムの資格情報を使用できます。

UNIX_SOCKETプラグインは、デフォルトで、Ubuntu 15.10以降の新規インストールとDebianテストにインストールされます。

base on Pluggable Authentication - MariaDB Knowledge Base

The unix_socket plugin allows a user to connect via a unix socket, if the user is already authenticated to the OS.

unix_socketプラグインを使用すると、ユーザーがOSにすでに認証されている場合、UNIXソケット経由で接続できます。

$ whoami
serg
$ mysql --user=serg
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.2.0-MariaDB-alpha-debug Source distribution
MariaDB [test]> quit
Bye

この例では、ユーザーsergはすでにシステムにログインしており、フル・シェル・アクセス権を持っています。 彼は自分自身をOSに特定しているので、データベースのために再度実行する必要はなく、MariaDBはOS資格情報を信頼します。 しかし、彼は別のユーザーとしてデータベースに接続することはできません。

unix_socket はビルトイン

unix_socket はビルトインなので削除できません。

MariaDB [mysql]> uninstall plugin unix_socket;
ERROR 1619 (HY000): Built-in plugins cannot be deleted

MariaDB [mysql]> quit

base on MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.7.3.4 UNINSTALL PLUGIN 構文

13.7.3.4 UNINSTALL PLUGIN 構文

UNINSTALL PLUGIN plugin_name

プラグイン解除

root ユーザのプラグインを外します。

MariaDB [mysql]> update user set plugin='' where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

MariaDB [mysql]> select host, user, password, plugin from user where user = 'root';
+-----------+------+----------+--------+
| host      | user | password | plugin |
+-----------+------+----------+--------+
| localhost | root |          |        |
+-----------+------+----------+--------+
1 row in set (0.00 sec)

再度、初期設定

下記内容の詳細は、MySQL5.7の導入手順をご参照ください。

※「ERROR 1698 (28000): Access denied for user 'root'@'localhost'」になる場合は、sudo 権限付与。

pi@raspberrypi:~ $ sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] y
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] y
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] y
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!
pi@raspberrypi:~ $ mysql -u root -p                                        
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 58
Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> select user, host from user;
+-------+-----------+
| user  | host      |
+-------+-----------+
| cacti | localhost |
| root  | localhost |
+-------+-----------+
2 rows in set (0.00 sec)

MariaDB [mysql]> Ctrl-C -- exit!
Aborted