Tutorial

Ubuntu 20.04にMySQLをインストールする方法

UbuntuMySQLDatabasesUbuntu 20.04

このチュートリアルの以前のバージョンは、Hazel Virdóによって作成されました。

はじめに

MySQLは、人気のあるLAMP(Linux、Apache、MySQL、PHP/Python/Perl)スタックの一部として一般的にインストールされているオープンソースデータベース管理システムです。リレーショナルモデルを実装し、データを管理するためにStructured Query Language(SQLの名で知られる)を使用します。

このチュートリアルでは、Ubuntu 20.04サーバーにMySQLバージョン8.0をインストールする方法について学習します。チュートリアルを完了すると、ウェブサイトやアプリケーションの構築に使えるリレーショナルデータベースができます。

必要条件

このチュートリアルを実行するには、次のものが必要です。

ステップ1 — MySQLをインストールする

Ubuntu 20.04では、APTパッケージリポジトリを使用してMySQLをインストールできます。本記事執筆時点で、デフォルトのUbuntuリポジトリで使用可能なMySQLバージョンは、バージョン8.0.19です。

インストールに当たり、サーバーのパッケージインデックスをしばらく更新していなければ、更新しておきます。

  • sudo apt update

次に、mysql-serverパッケージをインストールします。

  • sudo apt install mysql-server

これにより、MySQLがインストールされますが、パスワードを設定したり、その他の構成を変更するように求められることはありません。このままでは MySQLのインストールが安全ではないため、次に対処します。

ステップ2 — MySQLの設定

新規インストールの場合は、付属のセキュリティスクリプトを実行する必要があります。 これにより、リモートrootログインやサンプルユーザーなどの安全性の低いデフォルトオプションの一部が変更されます。

セキュリティスクリプトを sudoで実行します。

  • sudo mysql_secure_installation

これにより、一連のプロンプトが表示され、MySQLインストールのセキュリティオプションを変更できます。 最初のプロンプトでは、MySQLパスワードの強度をテストするために使用できるValidate Password Pluginをセットアップするかどうかを尋ねられます。

Validate Password Pluginを設定する場合、パスワードで認証するMySQLユーザーにはすべて、選択したポリシーを満たすパスワードを設定する必要があります。最強のポリシーレベルは2を入力して選択できますが、大文字、小文字、数字、特殊文字を含む8文字以上のパスワードが必要です。

Output
Securing the MySQL server deployment. Connecting to MySQL using a blank password. 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? Press y|Y for Yes, any other key for No: Y There are three levels of password validation policy: 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: 2

Validate Password Pluginを設定するかどうかにかかわらず、次のプロンプトではMySQLrootユーザーのパスワードを設定します。選択した安全なパスワードを入力して確認します。

Output
Please set the password for root here. New password: Re-enter new password:

root MySQLユーザーのパスワードを設定していても、このユーザーはMySQLシェルに接続するときにパスワード認証するように設定されていないことに注意してください。

Validate Password Pluginを使用した場合、新しいパスワードの強さの評価を受け取ります。次に、入力したパスワードを保持するか、新しいパスワードを入力するかを尋ねられます。入力したパスワードの強さが十分であると判断したら、Y を入力してスクリプトを継続します。

Output
Estimated strength of the password: 100 Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

そこから、Y を入力してからENTER を押して、後続のすべての質問のデフォルトを受け入れることができます。 これにより、匿名 MySQLユーザーとテストデータベースの削除、リモート root ログインの禁止、 これらの新しいルールの読み込みが行われ、行ったばかりのMySQLの変更がすぐに反映されます。

スクリプトが完了すると、MySQLインストールが保護されます。MySQLクライアントを使用して専用のデータベースユーザーを作成することができます。

ステップ3 — 専用のMySQLユーザーの作成と権限の付与

MySQLは、インストール時に、データベースを管理するrootユーザーアカウントを作成します。このユーザーはMySQLサーバーに完全な権限を有しており、すべてのデータベース、テーブル、ユーザーに対して100%制御が可能です。このため、このアカウントを管理機能以外で使用しないのがよいでしょう。このステップでは、MySQL root 権限を使って新しいユーザーアカウントを作成し、特権を付与する方法をまとめています。

MySQL 5.7(またそれ以降のバージョン)を実行しているUbuntuシステムでは、rootMySQLユーザーはデフォルトによりパスワードではなくauth_socketプラグインを使用して認証するように設定されています。ただしこのプラグインを使うには、MySQLクライアントを呼び出すオペレーティングシステムユーザー名と、コマンドで指定したMySQLユーザー名を一致させる必要があるため、root MySQLユーザーにアクセスできるようにするには sudo 権限でmysqlを呼び出す必要があります。

  • sudo mysql

注: 他のチュートリアルに従いMySQLをインストールし、rootのパスワード認証を有効にした場合、MySQLシェルにアクセスするには別のコマンドを使用する必要があります。以下は、MySQL クライアントを通常のユーザー権限で実行し、認証によってデータベース内の管理者権限のみを取得するものです。

  • mysql -u root -p

MySQLプロンプトにアクセスすると、CREATE USER ステートメントで新しいユーザーを作成できます。これらは、次の一般的な構文に従います。

  • CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';

CREATE USERの後、ユーザー名を指定します。続いて@、このユーザーが接続するホスト名、となります。Ubuntuサーバーからローカルでこのユーザーにアクセスするだけなら、localhostを指定できます。必ずしもユーザー名とホスト名をシングルクォーテションで囲む必要はありませんが、エラーを防ぐのに役立ちます。

ユーザーの認証プラグインを選択する際には、いくつかのオプションがあります。前述のauth_socketプラグインは便利なもので、正規ユーザーがデータベースにアクセスするのにパスワードの入力を必要とせず、強力なセキュリティを実現します。しかし、リモート接続を止めてしまうため、外部プログラムがMySQLとやりとりする必要がある場合は事態が複雑になります。

代案として、MySQLのデフォルト認証プラグインであるcaching_sha2_passwordでユーザー認証させる際、構文のWITHauthentication plugin部分を完全に省くことができます。MySQLドキュメントでは、強力なセキュリティ機能を理由にパスワードログインを希望するユーザーにこのプラグインを推奨しています。

caching_sha2_passwordで認証するユーザーを作成するには、次のコマンドを実行します。 sammy > を好きなユーザー名に変更し、passwordを強力なパスワードに変更してください。

  • CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';

: PHPのバージョンによってはcaching_sha2_password がエラーになるに問題が発生することが知られています。たとえばphpMyAdmin など、PHPアプリケーションでこのデータベースを使用しようとしているなら、 古くてもより確実なmysql_native_passwordプラグインで認証するユーザーを作成した方がよいでしょう。

  • CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

バージョンが分からなければ、caching_sha2_plugin で認証するユーザーを作成しておき、後から次のコマンドで変更することもできます。

  • ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

新しいユーザーを作成した後、適切な権限を付与できます。ユーザー権限を付与する一般的な構文は次のとおりです。

  • GRANT PRIVILEGE ON database.table TO 'username'@'host';

この例の構文の PRIVILEGE 値は、指定された databasetable でユーザーが実行できるアクションを定義します。各コマンドをカンマ区切りでつなげ、同じユーザーに複数の権限を付与できます。また、データベースとテーブル名の代わりにアスタリスク (*) を入力して、グローバル権限を付与することもできます。SQLにおいてアスタリスクは「すべて」のデータベースまたはテーブルを表す特殊文字です。

例に挙げると、次のコマンドは、データベース、テーブル、ユーザーをCREATEALTERDROP したり、サーバー上の任意のテーブルからデータをINSERTUPDATEDELETE したりできるユーザーグローバル権限を付与します。同様に、データをクエリするSELECT権限、キーワードを使用して外部キーを作成するREFERENCES権限、FLUSH操作を実行するRELOAD権限も付与します。ただし、必要以上の権限をユーザーに付与するべきではないので、必要に応じてユーザー権限を調整してください。

使用可能な権限の完全なリストは公式MySQLドキュメントで確認できます。

sammy を自分のMySQLユーザーの名前に置き換えてこのGRANTステートメントを実行し、ユーザーにこれらの権限を付与してください。

  • GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

このステートメントにはWITH GRANT OPTIONも含まれています。これにより、MySQLユーザーからシステム上の他のユーザーに必要な権限を付与できます。

警告: MySQLユーザーにALL PRIVILEGES権限を付与すると、多くのユーザーにrootユーザーと同様の広範なスーパーユーザー権限を与えることになります。

  • GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

このMySQLユーザーにアクセスできるユーザーは誰でもサーバー上のすべてのデータベースを100%制御できることになるので、このような広範な権限は軽率に付与すべきではありません

権限付与に続けてFLUSH PRIVILEGESコマンドを実行すると良いでしょう。このコマンドは前述のCREATE USERGRANTステートメントの結果としてサーバーがキャッシュしたメモリを解放します。

  • FLUSH PRIVILEGES;

これでMySQLクライアントを終了できます。

  • exit

将来、新しいMySQLユーザーとしてログインするには、次のコマンドを使用します。

  • mysql -u sammy -p

-pフラグにより、MySQLクライアントからMySQLユーザーの認証パスワードを求められます。

最後に、MySQLインストールをテストしましょう。

ステップ4 — MySQLのテスト

インストール方法に関係なく、MySQLは自動的に起動するはずです。これをテストするには、ステータスを確認してください。

  • systemctl status mysql.service

次のような出力が表示されます。

Output
● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Tue 2020-04-21 12:56:48 UTC; 6min ago Main PID: 10382 (mysqld) Status: "Server is operational" Tasks: 39 (limit: 1137) Memory: 370.0M CGroup: /system.slice/mysql.service └─10382 /usr/sbin/mysqld

MySQLが実行されていなければ、sudo systemctl start mysqlで起動できます。

追加のチェックとして、管理コマンドを実行できるクライアントである mysqladmin ツールを使用してデータベースへの接続を試すことができます。 たとえば、このコマンドは、sammy (-u sammy) としてMySQLに接続し、パスワードの入力を求め(-p) 、バージョンを返すように指示します。 sammy を専用のMySQLユーザー名に変更し、求められたらそのユーザーパスワードを入力してください:

  • sudo mysqladmin -p -u sammy version

次のような出力が表示されます。

Output
mysqladmin Ver 8.0.19-0ubuntu5 for Linux on x86_64 ((Ubuntu)) Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Server version 8.0.19-0ubuntu5 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/run/mysqld/mysqld.sock Uptime: 10 min 44 sec Threads: 2 Questions: 25 Slow queries: 0 Opens: 149 Flush tables: 3 Open tables: 69 Queries per second avg: 0.038

これは、MySQLが稼働していることを意味します。

まとめ

これで、基本的なMySQLセットアップがサーバーにインストールされました。 次のステップの例をいくつか示します。

Creative Commons License