検証済みのドキュメントです
クラウドサーバーを作成し、このドキュメントのコマンドを最初から最後までそのまま実行して確認したドキュメントです。
- OS
- Ubuntu 24.04.5 LTS · x86_64
- インストールしたバージョン
- MySQL 8.0.46 (8.0.46-0ubuntu0.24.04.4)
- テストサーバー
- DigitalOcean · 1 vCPU / 1 GB RAM / 25 GB SSD (s-1vcpu-1gb, sgp1)
- 最終確認
- 2026-10-09
このドキュメントにはアフィリエイトリンクが含まれています。リンクから登録するとコードサンドが手数料を受け取ることがありますが、内容や評価には影響しません。
Ubuntu 24.04 サーバーに MySQL 8.0 をインストールし、基本のセキュリティ設定と外部接続用のユーザー・データベースを作成したあと、自分の PC からだけ接続できるように外部接続の設定とファイアウォールまで設定します。
1. 準備するもの
- Ubuntu 24.04 LTS サーバー 1 台(メモリ 1GB 以上を推奨)
sudo権限のあるアカウントで SSH 接続できること- 外部から接続する PC のグローバル IP アドレス(例:
203.0.113.10)
サーバーがない場合は、DigitalOcean の最小構成の Droplet(1 vCPU・1GB)を作成してみてください。この Droplet でも MySQL 8.0 は十分にインストールできます。このドキュメントのすべての手順は、Droplet(1 vCPU・メモリ 1GB・25GB SSD・Ubuntu 24.04・シンガポール)でサーバーを作成して確認しました。
2. MySQL のインストール
Ubuntu 24.04 の標準リポジトリには MySQL 8.0 が含まれています。パッケージ一覧を更新してからインストールします。
sudo apt update
sudo apt install -y mysql-serverインストールが終わったら、インストールされたバージョンを確認します。
mysql --versionmysql Ver 8.0.46-0ubuntu0.24.04.4 for Linux on x86_64 ((Ubuntu))3. サービスの状態確認
インストールが終わると、mysql サービスが自動で起動します。
sudo systemctl status mysql --no-pager● mysql.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; preset: enabled)
Active: active (running) since Fri 2026-10-09 11:41:25 UTC; 17s agoどのアドレスとポートで接続を受け付けているか確認します。
sudo ss -tlnp | grep mysqldLISTEN 0 70 127.0.0.1:33060 0.0.0.0:* users:(("mysqld",pid=3339,fd=21))
LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=3339,fd=23))3306 は通常の MySQL クライアントが接続するポートで、33060 は MySQL Shell などが使う X プロトコルのポートです。どちらのポートも 127.0.0.1 でしか開いていないので、今はサーバー上からしか接続できません。このドキュメントでは 3306 番ポートだけを外部に開きます。
次に、MySQL に接続できるか確認します。インストール直後は、sudo mysql でパスワードなしに root として接続できます。
sudo mysql -e "SELECT VERSION();"+-------------------------+
| VERSION() |
+-------------------------+
| 8.0.46-0ubuntu0.24.04.4 |
+-------------------------+パスワードなしで接続できる理由は、MySQL のユーザー一覧で確認できます。
sudo mysql -e "SELECT user, host, plugin FROM mysql.user;"+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| debian-sys-maint | localhost | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | auth_socket |
+------------------+-----------+-----------------------+MySQL の root は auth_socket 方式で認証します。auth_socket はパスワードの代わりに、MySQL に接続した Linux アカウント名を確認する方式なので、Linux の root 権限(sudo)で実行した場合にだけ MySQL の root として接続できます。
4. 基本のセキュリティ設定
MySQL には、基本のセキュリティ設定を質問形式で進める mysql_secure_installation ツールがあります。このツールは、パスワード検証機能の設定、root パスワードの設定、匿名ユーザーの削除、外部から接続できる root の削除、test データベースの削除を順に尋ねます。このドキュメントでは、このうちユーザーとデータベースを整理する作業を SQL で直接実行します。root は auth_socket を使うので、パスワードは設定しません。
まず、現在のデータベース一覧を確認します。
sudo mysql -e "SHOW DATABASES;"+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+Ubuntu のパッケージでインストールすると、上のユーザー一覧とデータベース一覧のように匿名ユーザーと test データベースはなく、root は localhost からしか接続できません。ほかの方法でインストールした場合や設定を変更したことがある場合は、以下のコマンドで同じ状態にします。すでに上と同じ状態であれば、実行しても何も変わらず、出力もありません。
sudo mysql -e "DELETE FROM mysql.user WHERE User='';"
sudo mysql -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"
sudo mysql -e "DROP DATABASE IF EXISTS test;"
sudo mysql -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';"
sudo mysql -e "FLUSH PRIVILEGES;"1 行目は名前のない匿名ユーザーを、2 行目はサーバーの外から接続できる root を削除します。3 行目と 4 行目は test データベースとそのアクセス権限を削除し、最後の行は変更した権限をすぐに反映します。
5. ユーザーとデータベースの作成
アプリケーションでは、管理者アカウントである root ではなく専用ユーザーで接続するほうが安全です。データベース appdb とユーザー appuser を作成します。パスワードは必ず自分で決めた値に置き換え、203.0.113.10 は接続する PC のグローバル IP に置き換えてください。
sudo mysql -e "CREATE DATABASE appdb;"
sudo mysql -e "CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'change-this-password';"
sudo mysql -e "CREATE USER 'appuser'@'203.0.113.10' IDENTIFIED BY 'change-this-password';"
sudo mysql -e "GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost', 'appuser'@'203.0.113.10';"MySQL はユーザーを ユーザー名@接続元のアドレス で区別します。'appuser'@'localhost' はサーバー上から接続するとき、'appuser'@'203.0.113.10' は自分の PC から接続するときに使われます。どちらのユーザーも appdb のすべての権限だけを持ち、ほかのデータベースにはアクセスできません。
ユーザーが作成されたか確認します。
sudo mysql -e "SELECT user, host, plugin FROM mysql.user WHERE user = 'appuser';"+---------+----------------+-----------------------+
| user | host | plugin |
+---------+----------------+-----------------------+
| appuser | 203.0.113.10 | caching_sha2_password |
| appuser | localhost | caching_sha2_password |
+---------+----------------+-----------------------+サーバー上で appuser として接続してみます。-p オプションはパスワードの入力を受けるという意味で、最後の appdb は接続するデータベースです。
mysql -u appuser -p appdb -e "SELECT CURRENT_USER(), DATABASE();"Enter password:
+-------------------+------------+
| CURRENT_USER() | DATABASE() |
+-------------------+------------+
| appuser@localhost | appdb |
+-------------------+------------+6. 外部接続の許可
デフォルトの設定では localhost からの接続しか許可していません。外部からの接続を許可するには、/etc/mysql/mysql.conf.d/mysqld.cnf の bind-address を 0.0.0.0 に変更します。0.0.0.0 は、サーバーのすべての IPv4 アドレスで接続を受け付けるという意味です。
sudo sed -i 's/^bind-address.*/bind-address = 0.0.0.0/' /etc/mysql/mysql.conf.d/mysqld.cnf
grep -n 'bind-address' /etc/mysql/mysql.conf.d/mysqld.cnf31:bind-address = 0.0.0.0
32:mysqlx-bind-address = 127.0.0.132 行目の mysqlx-bind-address は X プロトコル(33060 番ポート)の設定なので、そのままにします。MySQL を再起動し、3306 番ポートが外部のアドレスでも開いたか確認します。0.0.0.0:3306 が表示されていれば正常です。
sudo systemctl restart mysql
sudo ss -tlnp | grep mysqldLISTEN 0 70 127.0.0.1:33060 0.0.0.0:* users:(("mysqld",pid=4048,fd=21))
LISTEN 0 151 0.0.0.0:3306 0.0.0.0:* users:(("mysqld",pid=4048,fd=23))7. ファイアウォール(ufw)の設定
MySQL の設定とは別に、ファイアウォールでも自分の PC の IP だけが 3306 番ポートに接続できるように許可します。ファイアウォールを有効にする前に、必ず先に SSH を許可してください。SSH を許可せずにファイアウォールを有効にすると、サーバーへの接続が切れてしまいます。
sudo ufw allow OpenSSH
sudo ufw allow from 203.0.113.10 to any port 3306 proto tcp
sudo ufw --force enable
sudo ufw statusStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
3306/tcp ALLOW 203.0.113.10
OpenSSH (v6) ALLOW Anywhere (v6)8. 自分の PC からの接続確認
PC に mysql クライアントがない場合は、Docker で MySQL クライアントを実行して接続できます。203.0.113.20 はサーバーの IP に置き換えてください。--rm オプションを付けているので、コマンドが終わるとコンテナは自動で削除されます。-it は、パスワードを入力できるように端末を接続するオプションです。
docker run --rm -it mysql:8.0 mysql -h 203.0.113.20 -u appuser -p appdb -e "SELECT CURRENT_USER(), DATABASE();"Enter password:
+------------------------+------------+
| CURRENT_USER() | DATABASE() |
+------------------------+------------+
| appuser@203.0.113.10 | appdb |
+------------------------+------------+appuser@ の後ろに自分の PC の IP が表示されれば、外部接続は正常です。接続が暗号化されているかも確認します。
docker run --rm -it mysql:8.0 mysql -h 203.0.113.20 -u appuser -p appdb -e "SHOW STATUS LIKE 'Ssl_version';"Enter password:
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| Ssl_version | TLSv1.3 |
+---------------+---------+TLSv1.3 は、接続が TLS で暗号化されているという意味です。MySQL 8.0 は初回起動時に自己署名証明書を作成し、クライアントはサーバーが対応していれば暗号化された接続を使います。
9. トラブルシューティング
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
MySQL の root は auth_socket 方式なので、パスワードでは接続できません。サーバー上で sudo mysql で接続してください。アプリケーションや外部ツールでは、手順 5 で作成した appuser を使ってください。
ERROR 2003 (HY000): Can't connect to MySQL server on '203.0.113.20:3306' (111)
MySQL が外部のアドレスで接続を受け付けていないという意味です。bind-address を変更する前に外部から接続すると、このエラーが出ます。かっこ内の 111 は接続拒否(Connection refused)を表します。grep -n 'bind-address' /etc/mysql/mysql.conf.d/mysqld.cnf で 0.0.0.0 になっているか、変更したあとに sudo systemctl restart mysql を実行したかを確認してください。
ERROR 1045 (28000): Access denied for user 'appuser'@'203.0.113.10' (using password: YES)
パスワードが間違っているか、接続した ユーザー@アドレス の組み合わせのユーザーが存在しないという意味です。このドキュメントの設定で外部の PC から root に接続しても、Access denied for user 'root'@'203.0.113.10' と同じエラーが出ます。自宅や会社のグローバル IP が変わった場合は、sudo mysql -e "SELECT user, host, plugin FROM mysql.user WHERE user = 'appuser';" で登録されているアドレスを確認してください。
10. 削除
MySQL とデータをすべて削除するには、以下のコマンドを実行します。データベースファイルまですべて削除されるため、必要なデータは先に mysqldump でバックアップしてください。
sudo DEBIAN_FRONTEND=noninteractive apt purge -y 'mysql-*'
sudo apt autoremove -y
sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysqlDEBIAN_FRONTEND=noninteractive は、パッケージを削除する間に設定の質問画面を表示せず、デフォルト値で進めるオプションです。'mysql-*' を引用符で囲んでいるのは、シェルが * をファイル名に置き換えずに、そのまま apt に渡すようにするためです。実行すると Package 'mysql-server-5.7' is not installed, so not removed のように、インストールされていないパッケージ名が何行も表示されます。名前が mysql- で始まるパッケージをすべて確認するためで、正常です。
ファイアウォールに追加した 3306 番ポートのルールも削除します。
sudo ufw delete allow from 203.0.113.10 to any port 3306 proto tcpRule deletedMySQL のパッケージが残っていないか確認します。0 が表示されれば、すべて削除されています。
dpkg -l | grep -c mysql0実際に試してみる
サーバーがなければ、以下のサービスで数分あれば Ubuntu サーバーを作れます。 このドキュメントは DigitalOcean で検証しました。
このドキュメントは役に立ちましたか? 間違いや変わった点があればお知らせください。
内容の修正を依頼