MySQL環境の構築

IT

MySQLサーバは、オープンソースのリレーショナルデータベース管理システム (relational database management system) です。買収の末、オラクルが所有しています。
MySQLの派生版としてMariaDBもあります。

環境

Ubuntu24.04の環境を前提とします。

インストール

バージョンを確認するには、以下のコマンドを実行します。

mysql --version

インストールされている場合は、以下の様にバージョンなどが表示されます。

mysql  Ver 8.0.36-2ubuntu3 for Linux on x86_64 ((Ubuntu))

インストールするには、以下のコマンドを実行します。
PHPと連携するために、php-mysqlも指定します。

sudo apt install mysql-server php-mysql

以下のパッケージがインストールされます。

  libaio1t64 libcgi-fast-perl libcgi-pm-perl libevent-core-2.1-7t64
  libevent-pthreads-2.1-7t64 libfcgi-bin libfcgi-perl libfcgi0t64
  libhtml-template-perl libmecab2 libprotobuf-lite32t64 mecab-ipadic
  mecab-ipadic-utf8 mecab-utils mysql-client-8.0 mysql-client-core-8.0
  mysql-common mysql-server mysql-server-8.0 mysql-server-core-8.0 php-common
  php-mysql php8.3-common php8.3-mysql

削除する場合は、以下のコマンドを実行します。

sudo apt purge mysql*

MySQL インストールのセキュリティ改善

以下のコマンドにより、 MySQLインストールのセキュリティを改善できます。

  • root アカウントのパスワードを設定できます。
  • ローカルホスト以外からアクセス可能な root アカウントを削除できます。
  • 匿名ユーザーアカウントを削除できます。
  • test データベース (デフォルトでは、匿名ユーザーであっても、すべてのユーザーがアクセスできます)、および test_ で始まる名前を持つデータベースへのアクセスを許可する権限を削除できます。
sudo mysql_secure_installation

まず初めに以下の質問を受けます。

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

パスワードを設定する際の制限を設定するかです。yを選ぶと、以下の選択を求められます。

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 0

どれかを選択します。
次に匿名ユーザを除くかどうか質問されます。

Remove anonymous users? (Press y|Y for Yes, any other key for No) :

どれかを選択します。
次にリモートからの root ログインを禁止するか質問されます。

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? (Press y|Y for Yes, any other key for No) : 

どれかを選択します。
次に誰でもアクセスできるテスト用のデータベースを作成するか質問されます。

By default, MySQL 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? (Press y|Y for Yes, any other key for No) : 

どれかを選択します。
全ての変更を確実に反映させるか質問されます。

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

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : 

どれかを選択します。

自動起動

OS起動時に自動実行させるためには、以下のコマンドを実行します。

sudo systemctl enable --now mysql

起動状態を確認するには、以下のコマンドを実行します。

sudo systemctl status mysql

起動中であれば、「active (running)」と表示されます。

 mysql.service - MySQL Community Server
     Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; preset: enabled)
     Active: active (running) since Wed 2024-05-01 10:11:55 JST; 1h 57min ago

表示を終了させるには、ctrl+zを押します。

設定

設定ファイルは。いくつかの場所に設定できます。どこの設定ファイルをどの順に読み込むかは、以下のコマンドで確認できます。

mysql --help

今回のバージョンでは、以下の構成でした。

~中略~
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 
~中略~

今回の構成では、/etc/mysql/my.cnf->/etc/alternatives/my.cnf->/etc/mysql/mysql.cnfを読み込み、/etc/mysql/conf.d/と/etc/mysql/mysql.conf.d/内の’.cnf’ファイルを読み込む構成になっていました。
/etc/mysql/conf.d/mysql.cnfファイルが用意されていますが、内容は実質的に空でした。
/etc/mysql/mysql.conf.d/には、mysql.cnfとmysqld.cnfがあり、mysql.cnfはクライアント用の設定、mysqld.cnfはサーバ用の設定となっていました。

外部からアクセス可能にするには

サーバの設定ファイル(/etc/mysql/mysql.conf.d/mysqld.cnf)にローカルとのみ接続する設定があるので、これをコメントにします。

#bind-address		= 127.0.0.1

MySQLへ接続

MySQLへ接続するには、端末より以下のコマンドを実行します。

sudo mysql

コマンドプロンプトが mysql> となると接続できています。
終了するには、mysql>に以下のコマンドを与えます。

exit

ユーザ操作

root

初めから設定されているユーザです。全ての権限が設定されています。

認証方法について確認します。
以下のコマンドを実行してMySQLへ接続します。

sudo mysql

以下を実行して状態を確認します。

use mysql;
SELECT user,plugin, authentication_string from mysql.user;

このような結果でした。

+------------------+-----------------------+---------------------------------------------+
| user             | plugin                | authentication_string                       |
+------------------+-----------------------+---------------------------------------------+
| root             | auth_socket           |                                             |
+------------------+-----------------------+---------------------------------------------+

auth_socketは、ソケットユーザ名 (オペレーティングシステムユーザ名) がクライアントプログラムによって指定された MySQL ユーザ名とサーバと一致するかどうかをチェックします。

MySQL独自のパスワード(rootroot)を設定するには、以下のコマンドを実行します。

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

パスワードは、以下の様に暗号化されて保存されます。

+------------------+-----------------------+---------------------------------------------+
| user             | plugin                | authentication_string                       |
+------------------+-----------------------+---------------------------------------------+
| root             | mysql_native_password | *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B   |
+------------------+-----------------------+---------------------------------------------+

パスワードを使いmysqlへアクセスしてみます。

mysql -u root -p

接続解除するには、以下のコマンドを実行します。

quit

任意のアカウント

ユーザ設定

以下のコマンドを実行してMySQLへ接続します。

sudo mysql

ユーザを追加するには、ユーザ(hoge)とパスワード(hogehoge)を同時に設定した、以下のコマンドを実行します。

CREATE USER 'hoge'@'localhost' IDENTIFIED BY 'hogehoge';

パスワードを設定するには、以下のコマンドを実行します。

USE mysql;
ALTER USER 'hoge'@'localhost' IDENTIFIED BY 'hogehogehoge';

ユーザを削除するには、以下のコマンドを実行します。

DROP USER test;

権限設定

ローカルアクセス接続でユーザ「hoge」がDB「fuga」の全てのテーブルに対して他のユーザに権限を付与する権限以外の全ての権限を付与するには、以下のコマンドを実行します。

GRANT ALL ON fuga.* TO 'hoge'@'localhost';

他のユーザに権限を付与する権限も付ける場合は、以下のコマンドを実行します。

GRANT ALL ON fuga.* TO 'hoge'@'localhost' WITH GRANT OPTION;

ちなみに、外す場合は、以下のコマンドを実行します。

REVOKE GRANT OPTION ON fuga.* FROM 'hoge'@'localhost';

権限変更を確実に反映するには、以下のコマンドを実行します。

FLUSH PRIVILEGES;

コメント

タイトルとURLをコピーしました