ブログの説明

学校に通わないで学んだことを記しています。間違っているところが何かありましたらご指摘下さると幸いです。コメントに対する返信が遅れる可能性があります。その場合は申し訳ありません。

このブログではサイドバーに広告を表示しています。このブログ内の投稿記事を検索するには右上の拡大鏡のアイコンを、アーカイブやラベル付けから投稿記事を閲覧するには左上の三重線のアイコンをクリックして下さい。

数式の表示にはMathJaxを利用させていただいています。数式の表示のためにJavaScriptが有効である必要があります。そうでない場合、訳の分からないLatexのコードが表示されます。幾何学図形やチャートの表示にはHTML5 CanvasやGoogle Chartを使用しています。その表示のためにもJavaScriptが有効である必要があります。

MariaDBをDebian GNU/Linux 10にインストールして使うまでの準備

この記事では、Debian GNU/Linux 10にデータベースサーバーであるMariaDB(MySQLの派生)をインストールし、ユーザーの作成やパスワードの設定を行なう手順について記す。ここで前提とするオペレーティングシステムは次のとおり。

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 10 (buster)
Release:	10
Codename:	buster

MariaDBをインストール

debパッケージになったものがDebian GNU/Linux 10の公式リポジトリにある。例えばコマインドライン上でAPTを用いてそれをインストールするには次のようにする。その際にはオペレーティングシステムの管理者権限が必要。

$ su
# apt update;apt install mariadb-server

MariaDBサーバーのみならず、依存関係でMariaDBクライアントも一緒にインストールされるはず。インストールされなければmariadb-clientもインストールする。

# apt update;apt install mariadb-client

バージョンの確認

mariadbかmysqlの後に--versionというオプションを付ける。

$ mariadb --version
mariadb  Ver 15.1 Distrib 10.3.27-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

サービス(デーモン)の管理

LinuxディストリビューションではMariaDBサーバーはmysqlサービス(/usr/sbin/mysqld)として実行される。サービスはデーモンとも呼ばれている。

mysqlサービスが稼働中かどうかを知るにはsystemctlコマンドの後にis-activeを指定し、その後にmysqlかmariadbを指定。

# systemctl is-active mysql
inavtive

稼働中の場合にはactiveと表示され、稼働中でない場合にはinactiveと表示される。なんらかの理由で起動に失敗した場合はfailedと表示される。

mysqlサービスを開始するためには、systemctlコマンドの後にstartを指定し、その後にmysqlかmariadbを指定する。

# systemctl start mysql

mysqlサービスの停止はstopを指定する。

# systemctl stop mysql

mysqlサービスの状態を確認するにはstatusを指定する。そしてqキーを押してその画面から脱け出す。

# systemctl status mysql

設定ファイルだけを読み込みたい場合はreloadを指定する。

# sytemctl reload mysql

オペレーティングシステムの起動時にmysqlサービスを毎回自動的に起動させたい場合にはenableを指定する。

# systemctl enable mysql

オペレーティングシステムの起動時にmysqlサービスを毎回自動的に起動したくなければdisableを指定する。

# systemctl disable mysql

systemctlコマンドの代わりにserviceコマンドを使う手もある。その場合は次のような書式になる。RedHat系ではこちらのほうが馴染み深い。

# service mysql start
# service mysql stop
# service mysql status
# service mysql reload

Debianの伝統的な流儀では次のようにする。

# /etc/init.d/mysql start
# /etc/init.d/mysql stop
# /etc/init.d/mysql status
# /etc/init.d/mysql reload

安全性向上のための手続き

次のプログラムを実行し、対話形式でいくつかの設定をすることで、セキュリティの向上を実現することができる。ただしその際、MariaDBサーバー(mysqlサービス)が稼働中である必要がある。

このプログラムに関しては公式サイトの次のドキュメントを参照することができる。

https://mariadb.com/kb/ja/mysql_secure_installation/

このプログラムの実行にはオペレーティングシステムの管理者権限が必要。ターミナル・エミュレーターのコマンドライン上で管理者権限を得るには、suコマンドを使うか、sudo -iを使う。

# systemctl restart mysql
# 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):

Enter current password for root(rootの現在のパスワードを入力して)と求められるが、まだ設定していないはずなので、何も入力せずにそのままEnterキーを押す。

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] n
 ... skipping.

Set root password?(パスワードを設定するか)と尋ねられるが、rootのパスワードを設定すると、systemctlコマンドやserviceコマンドや/etc/init.d/mysqlスクリプトでMariaDBサーバーを停止するのに失敗するようになる。それは不都合なのでrootパスワードの設定はスキップする。

次に匿名ユーザーでの利用を無効にする。

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!

Remove anonymous users?(匿名ユーザーを削除するか)と尋ねられるので同意するのであればyと入力してEnterキーを押す。

次にリモートログイン(自機以外からのログイン)を無効にする。

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!

Disallow root login remotely?(リモートログインを禁じるか)と尋ねられるので、自機(localhost)での利用だけを想定している場合はこれに同意するためにyと入力してEnterキーを押す。

誰でもアクセス可能なtestというデータベースがMariaDBにはデフォルトで存在する。

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!

Remove test database and access to it?(testデータベースとそれへのアクセスを削除するか)と尋ねられるのでそれに同意する場合にはyと入力してEnterキーを押す。

次にprivilegeテーブルを再読み込みして設定を反映させる。

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!

Reload privilege tables now?(privilegeテーブルを再読み込みする?)と尋ねられるので、これまでの設定のとおりで良ければyと入力してEnterキーを押す。これで安全性確保のための設定プログラムは終了。

設定ファイルの場所

MariaDBの設定ファイルは、Debian 10の公式リポジトリからdebパッケージをインストールした場合、デフォルトでは/etc/mysqlディレクトリ内にある。

設定ファイルは4種類ある。

グローバルデフォルトのための設定ファイルとして/etc/mysql/mariadb.cnfがある。

グローバルオプションのための設定ファイルとして/etc/mysql/conf.dディレクトリ内の任意の.cnfファイルがある。デフォルトではmysql.cnfがある。

そしてMariaDB専用のオプションのための設定ファイルとして/etc/mysql/mariadb.conf.dディレクトリ内の任意の.cnfファイルがある。デフォルトでは50-server.cnfや50-client.cnfなどがある。

そして最後に、各々のユーザー専用の設定のためにそのユーザーのホームディレクトリ内に.my.cnfという隠しファイルを設けることができる。

設定ファイルおよびオプションファイルはこの順番で読み込まれる仕様になっている。

ここでは設定ファイルの内容については省略する。またの機会に。

ログファイル

ログファイルは/var/log/mysqlディレクトリ内にerror.logというエラーログファイルがある。参照にはオペレーティングシステムの管理者権限かmysqlユーザーの権限が必要。

MariaDBアクセス用のユーザーアカウントを作成

Debian 10の公式リポジトリにあるMariaDBサーバーをインストールした場合、デフォルトでは、オペレーティングシステムの管理者(root)権限によってMariaDBにパスワードなしでアクセスすることができるが、通常の使用ではこの方法は推奨されていない。

MariaDBサーバーへのアクセス用の新しいユーザーを作成してそれにパスワードを設定し、オペレーティングシステムの一般ユーザー権限でその新しいユーザーを使ってMariaDBサーバーにアクセスすることが望ましい。

そのための新規ユーザー作成法とパスワード設定法をここで記す。

ここで作成するユーザーはMariaDBサーバーへアクセスするためのものであり、オペレーティングシステムで使われる一般ユーザーとは異なる。ただし管理者権限だけは共にrootというユーザー名で関連付けられている。

オペレーティングシステムの管理者権限を得てmysqlサービスが稼働中であることを確認し、オペレーティングシステムの管理者権限のままでmysqlシェルを起動する。

-uでユーザー名を指定し、-hでホスト名を指定するが、これらは省略しても問題ない。

$ su
# sytemctl is-active mysql
active
# mysql -u root -h localhost
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 38
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

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

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

MariaDB [(none)]>

うまくいけばMariaDB [(none)]>というプロンプトが現れ、以降対話形式でMariaDBとやりとりすることができる。SQLの構文に終了を表す;を付けずに改行すると、プロンプトが->に置き換わり、SQLの構文の続きを入力することができる。

このプロンプトから抜け出すには\qかquitコマンドかexitコマンドを使う。

MariaDB [(none)]> \q
Bye

Ctrlキーを押したままdキーを押すことによっても終了することができる。

すでに存在するアカウントの一覧を表示させて確認してみる。そのためにはSELECT構文を用い、FROM句にmysql.userを指定する。SQL構文の終了を示す;を忘れずに。

MariaDB [(none)]> SELECT user,host,password FROM mysql.user;
+------+-----------+-------------------------------------------+
| user | host      | password                                  |
+------+-----------+-------------------------------------------+
| root | localhost | ***************************************** |
+------+-----------+-------------------------------------------+
1 row in set (0.000 sec)

rootというユーザーだけが存在することが分かる。パスワードはハッシュ値に変換されている。

SELECTやFROMなどのSQLのキーワードは分かりやすくするためにここでは大文字で記してあるが、小文字で入力しても構わない。

新しいユーザー名を作成するにはCREATE USER構文を用いる。パスワードはIDENTIFIED BY句に指定する。

ユーザー名はホスト名と一緒に'任意のユーザー名'@'ホスト名'という形式で指定する。アクセス対象になるmysqlサーバーが同じコンピュータ上に存在するのであれば、ホスト名にlocalhostと指定すればいい。

MariaDB [(none)]> CREATE USER 'testuser'@'localhost'
    -> IDENTIFIED BY '任意のパスワード';
Query OK, 0 rows affected (0.000 sec)

パスワードは、あらゆる辞書に載っていない文字列で、かつ、大文字と小文字と数字と記号が混じっていることが望ましい。パスワードは自動的にハッシュ値に変換される。

mysql.userテーブルを確認してみる。

MariaDB [(none)]> SELECT user,host,password FROM mysql.user;
+----------+-----------+-------------------------------------------+
| user     | host      | password                                  |
+----------+-----------+-------------------------------------------+
| root     | localhost | ***************************************** |
| testuser | localhost | ***************************************** |
+----------+-----------+-------------------------------------------+
2 rows in set (0.000 sec)

ここでは伏せてあるが、passwordには実際にはハッシュ値が表示される。

すでに存在するユーザーにパスワードを割り当てたり変更したりする場合には、SET PASSWORD構文を用いることができる。FOR句に'ユーザー名'@'ホスト名'を指定し、=の後にPASSWORD()関数の引数として新しいパスワードを指定する。

MariaDB [(none)]> SET PASSWORD FOR 'testuser'@'localhost' = PASSWORD('任意のパスワード');
Query OK, 0 rows affected (0.000 sec)

PASSWORD()関数は平文のパスワードをハッシュ値に変換する働きを持つ。

MariaDBサーバーにアクセスしていない状態、つまりLinuxのシェルのコマンドライン上でもmysqladminというツールを使って次のようにパスワードの変更を行うことができる。その際、オペレーティングシステムの管理者権限が必要。

# mysqladmin --user=testuser password '任意のパスワード'

作成したユーザーはDROP USER構文によって削除することができる。

MariaDB [(none)]> DROP USER 'testuser'@'localhost';
Query OK, 0 rows affected (0.000 sec)

MariaDB [(none)]> SELECT user,host,password FROM mysql.user;
+------+-----------+-------------------------------------------+
| user | host      | password                                  |
+------+-----------+-------------------------------------------+
| root | localhost | ***************************************** |
+------+-----------+-------------------------------------------+
1 row in set (0.000 sec)

アクセス権限の設定

ユーザーの作成とパスワードを設定したら、そのユーザーにアクセス権限を設定する。これを行うにはGRANT構文を用いる。そのON句に対象となるデータベース名を指定し、TO句に'ユーザー名'@'ホスト名'を指定する。

ON句に特定のデータベースを指定するときにはそのデータベースを作成しておく必要があるかもしれないが、ここではALLによって全てのデータベースを指定することにした。

MariaDB [(none)]> GRANT ALL ON *.* TO 'testuser'@'localhost';
Query OK, 0 rows affected (0.000 sec)

権限を表示するにはSHOW GRANTS構文を用いる。特定のユーザーの権限を表示したければFOR句に設けて'ユーザー名'@'ホスト名'を指定する。

MariaDB [(none)]> SHOW GRANTS FOR 'testuser'@'localhost';
+--------------------------------------------------------------------------------------------------------------------------+
| Grants for testuser@localhost                                                                                            |
+--------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO `testuser`@`localhost` IDENTIFIED BY PASSWORD '*****************************************' |
+--------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)

GRANT ALL PRIVILEGESは全ての権限が'testuser'@'localhost'に与えられていることを意味する。

アクセス権限を削除

アクセス権限を削除するにはREVOKE構文を用いる。

例えば、'testuser'@'localhost'に全ての権限が与えられた状態からCREATE USER構文の使用権だけを削除したければ次のようにする。

MariaDB [(none)]> REVOKE CREATE USER ON *.* FROM 'testuser'@'localhost';
Query OK, 0 rows affected (0.000 sec)

例えば、'testuser'@'localhost'からDROP構文とSHUTDOWN構文の使用権を削除したければカンマで区切って次のようにする。

MariaDB [(none)]> REVOKE DROP,SHUTDOWN ON *.* FROM 'testuser'@'localhost';
Query OK, 0 rows affected (0.000 sec)

CREATE USER構文の使用権を再び追加したければGRANT構文を使う。

MariaDB [(none)]> GRANT CREATE USER ON *.* TO 'testuser'@'localhost';
Query OK, 0 rows affected (0.000 sec)

\qと入力してmysqlシェルを一端終了させ、exitでオペレーティングシステムの一般ユーザーに戻り、そこからmysqlシェルを再起動。その際にここで作成したユーザーとパスワードでMariaDBにアクセスする。

MariaDB [(none)]> \q
Bye
# exit
$ mysql -u testuser -h localhost -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 13
Server version: 10.3.27-MariaDB-0+deb10u1 Debian 10

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

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

MariaDB [(none)]>

次のようにエラーメッセージが表示される場合、パスワードが間違っている可能性がある。

ERROR 1045 (28000): Access denied for user 'testuser'@'localhost' (using password: YES)

パスワードを再設定する場合は、オペレーティングシステムの管理者権限になり、mysqlシェルをrootユーザーとして起動し、SET PASSWORD構文を用いてパスワードを設定する。

データベースを新しく作成

SHOW DATABASES;によって既存のデータベース一覧を表示することができる。

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.000 sec)

データベースを新しく作成するにはCREATE DATABASE構文を用い、作成するデータベース名を指定する。

MariaDB [(none)]> CREATE DATABASE mydatabase;
Query OK, 1 row affected (0.000 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mydatabase              |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.000 sec)

データベースを削除するにはDROP DATABASE構文を用い、削除対象のデータベース名を指定する。

MariaDB [(none)]> DROP DATABASE mydatabase;
Query OK, 0 rows affected (0.001 sec)

MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.000 sec)

データベースにアクセスするためにはそれを使用することをシェルに伝えるためUSE構文を用い、対象となるデータベース名をその引数として指定する。そのデータベースが選ばれると、mysqlシェルのプロンプトがMariaDB [(none)]>からMariaDB [指定したデータベース名]>へと置き換わる。

MariaDB [(none)]> USE mydatabase;
Database changed
MariaDB [mydatabase]>

そのデータベース上のテーブルを表示するにはSHOW TABLES構文を用いる。

MariaDB [mydatabase]> SHOW TABLES;
Empty set (0.000 sec)

しかしテーブルはまだ作成されていないので空集合だと表示される。

今回はここまで。テーブルの作成についてはまたの機会に。

まとめ

Debian 10リポジトリからのインストール
# apt install mariadb-server mariadb-client
MariaDBサービスの状態確認
# systemctl status mysql
# systemctl is-active mysql

MariaDBサービス(またはmysqlサービス)の状態には、active(稼働中)、inactive(停止中)、failed(起動に失敗した)などがある。その場合、直近のエラーメッセージをstatusで確認できる。

エラーログのファイルは/var/log/mysql/error.logである。これをコマンドライン上ではcatコマンドまたはtailコマンドなどを用いて参照すればエラーメッセージを確認することができる。

MariaDBサービスの開始
# systemctl start mysql
MariaDBサービスの停止
# systemctl stop mysql
MariaDBサービスの設定ファイル読み込み
# systemctl reload mysql
MariaDBサービスの自動起動
# systemctl enable mysql
MariaDBサービスの自動起動解除
# systemctl disable mysql
MariaDBサービスの再起動
# systemctl restart mysql

mysqlシェルを介して対話形式でMariaDBを操作できる。

ユーザー名は-uで指定できる。rootの場合はそれを省略できる。ホスト名は-hで指定できる。localhostの場合それを省略できる。パスワードを設定している場合は-pが必要。その後、設定したパスワード入力を求められる。

mysqlシェルの起動
$ mysql -u ユーザー名 -h ホスト名 -p
mysqlシェルの終了
MariaDB [(none)]> \q
MariaDB [(none)]> quit
MariaDB [(none)]> exit
ユーザーアカウントの新規作成
MariaDB [(none)]> CREATE USER 'ユーザー名'@'ホスト名' IDENTIFIED BY '設定するパスワード';

ユーザーアカウントはホスト(MariaDBサーバーが稼働している場所)と関連付ける。

パスワードはハッシュ値に自動的に変換される。

ユーザー、ホスト、パスワードの一覧を表示
MariaDB [(none)]> SELECT user,host,password FROM mysql.user;
パスワードの設定
MariaDB [(none)]> SET PASSWORD FOR 'ユーザー名'@'ホスト名' = PASSWORD('任意のパスワード');

SET PASSWORD構文でパスワードを設定・変更する場合にはPASSWORD()関数を用いてパスワードの平文を暗号化する必要がある。

ユーザーアカウントの削除
MariaDB [(none)]> DROP USER 'ユーザー名'@'ホスト名';
特定のユーザーアカウントに全てのアクセス権限を与える
MariaDB [(none)]> GRANT ALL ON *.* TO 'ユーザー名'@'ホスト名';
特定のユーザーアカウントから特定のアクセス権限を奪う
MariaDB [(none)]> REVOKE 権限名 ON *.* FROM 'ユーザー名'@'ホスト名';

権限名には、CREATE USER, GRANT OPTION, CREATE TABLESPACE, PROXY, ALTER, FILE, SUPER, PROCESS, REPLICATION SLAVE, RELOAD, REPLICATION CLIENT, SHUTDOWN, ALLなどがある。これらの権限は一般のユーザーアカウントには与えないほうが安全対策上好ましいかもしれない。

データベース一覧表示
MariaDB [(none)]> SHOW DATABASES;
データベースの新規作成
MariaDB [(none)]> CREATE DATABASE データベース名;
データベースの使用選択
MariaDB [(none)]> use データベース名
データベースの削除
MariaDB [(none)]> DROP DATABASE データベース名;
テーブルの表示
MariaDB [mydatabase]> SHOW TABLES;

関連記事

コメント

このブログの人気の投稿

LATEXで数式:指数と順列などで使う添数・添字

10の補数と9の補数と2の補数と1の補数

Visual Studio 2019にはC++のためのフォームデザイナーがない件