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;
コメント