Beyond‘s blog

IT/Webの技術

【危険】MySQL の port 3306 の外部公開

Webシステムやサーバーの管理者が気付かずにやってしまう、最も危険な設定ミスについてご紹介します。

「でも、Webサイトは正常に動いているし、特に問題ないのでは?」「パスワードもあるから大丈夫では?」

まったく大丈夫ではありません。その油断が大きなセキュリティ事故を招きます。

port 3306 を外部公開しているとどうなる?

簡単に説明すると、インターネット上に公開される、Webサイトやシステムのデータベース(MySQL や MariaDB)のドアに鍵をかけずに、全世界に向けて「全開放」している状態です。

このデータベースには、それらのシステムなど使用される、社内の機密情報であったり、顧客情報のデータが格納されています。

つまり、このような重要なデータを、インターネット上で世界中に公開している状態なので、「どうぞ勝手にデータを奪ってください」と言っているようなものです。

たとえ、Webサイトやシステムにパスワードを掛けていても、ブルートフォース攻撃でパスワードを簡単に破られる可能性があります。

正常な設定 危険な設定
Webサーバー localhost または 127.0.0.1 の 3306 port Webサーバー 0.0.0.0 または サーバーの公開IPの 3306 port
外部からの接続 完全に遮断されアクセスできない 外部からの接続 誰でもアクセス可能

※ 127.0.0.1 は、コンピューターにとって特別に予約されたIPアドレスで、これは「自分自身」を指す住所として決まっています

なぜ、このような設定になってしまうのか?

このような危険な設定は、単純な知識不足だけでなく、特定の作業状況下で発生しやすくなります。

「一時的だから」「動いているから」という考えが、取り返しのつかない事態を生み出す温床となります。

主に、以下のような事例が要因にあげられます。

初期設定時のミス チュートリアルサイトの設定例(bind-address = 0.0.0.0)のまま、システムの本番環境で運用してしまう。
外部サービス連携時の一時対応 外部の分析ツールやバックアップサービスから、直接データベース接続が必要になり、一時的に開放したまま忘れてしまう。
担当者の引き継ぎ時における伝達漏れ 前任者が「一時的な対応」で変更した設定が、引き継ぎ資料に記載されておらず、そのまま固定化された運用になっている。
外部業者による設定ミス 外部委先のシステム会社のよる作業で、テスト環境用の設定を本番環境に誤適用してしまう。

port 3306 の外部公開で起こるトラブル

port 3306 をインターネット上で公開することは、単なる設定ミスだけに留まらず、企業のビジネス自体を脅かす重大なリスクです。

その具体的な危険性を、以下の観点から解説いたします。

① データベースへの直接攻撃の窓口を開放


-- 攻撃者が直接あなたのデータベースに接続して実行できる
DROP TABLE users;
DELETE FROM orders;

② 情報漏洩のリスク

〇 顧客情報(氏名・メールアドレスなどの連絡先)
〇 パスワード(ハッシュ化されていても危険)
〇 全ての注文履歴や機密情報など

③ サイトの完全破壊

データベースを削除されると、Webサイトは完全に機能停止します。(Webサイトも表示されなくなります)

④ サーバーが乗っ取られる

そのデータベースからシステム全体に侵入され、そのあなたのサーバーが攻撃の踏み台にされる可能性があります。(ランサムウェアなど)

今すぐできる port 3306 の外部公開を確認

下記のような、オンラインツールやコマンドを駆使することで、MySQL の port 3306 が、外部公開されているかどうかを確認できます。

① オンラインツールで確認

これらのようなサイトで、サーバーIPアドレスの 3306ポート が「OPEN」になっていないか確認しましょう。

〇 ping.eu
https://ping.eu/port-chk

〇 you get signal
https://www.yougetsignal.com/tools/open-ports

② サーバー内のコマンドラインで確認

もしサーバー内から接続できる場合、即座に対処してください。

telnet [そのサーバーIP] 3306

MySQL の port 3306 の正しい設定ガイド

今回は、Webサーバーとデータベースの機能が、同じサーバーホストに同居している環境を想定した、MySQL の port 3306 の正しい設定についてご紹介いたします。

※ 重要:本番環境で作業を実行する場合は、作業前にデータベースのバックアップを取得することを強く推奨します。万が一の設定ミスに備え、安全な状態を保ちながら作業を進めてください。

① 現在の設定状態を確認する

このコマンドで、現在の設定状態が表示されます。もし 0.0.0.0 やサーバーのグローバルIPが表示される場合は、即座に対処が必要な状態です。

# MySQLの設定ファイルを確認 * bind-address を確認
sudo grep -r "bind-address" /etc/mysql/

# 現在の MySQL が、どのネットワークインターフェースで待ち受けているかを確認
sudo netstat -tlnp | grep mysql

[mysqld]
bind-address = 127.0.0.1 # これが正常!
# bind-address = 0.0.0.0 # このようになっていたら危険!

② 設定ファイルを編集する

MySQL の設定ファイルを編集して、ローカルホストからの接続だけを受け付けるように変更します。

# 設定ファイルの編集(環境によりファイルパスが異なります)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

# または
sudo nano /etc/mysql/my.cnf

MySQL の設定ファイル内で、以下の行を探し修正します。

# 安全な設定(このように変更または確認)
bind-address = 127.0.0.1



# 危険な設定(このようになっていたら変更必須)
# bind-address = 0.0.0.0
# bind-address = そのサーバーのグローバルIP 

③ 設定ファイルの変更内容を反映させる

MySQL の設定ファイルを保存したら、MySQL を再起動して変更を反映させます。

# 設定ファイルの文法チェック(任意ですが推奨)
sudo mysqld --validate-config

# MySQL サービスの再起動
sudo systemctl restart mysql

# または(システムによっては)
sudo service mysql restart

# 正常に再起動したか確認
sudo systemctl status mysql

④ 設定の確認

MySQL の設定変更が、正しく反映されたかどうか確認します。

# 新しい設定で MySQL が応答しているか確認
sudo netstat -tlnp | grep mysql



# 期待される出力例:
# tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -

# MySQL のプロセス情報からも確認
sudo ps aux | grep mysql

これで 127.0.0.1:3306 と表示されていれば成功です。これでデータベースは外部から見えない安全な状態になりました。

もし問題が発生した場合について

もし、MySQL の設定変更後に、Webサイトがデータベースに接続できなくなった場合は、下記の流れで確認してください。

  1. 設定ファイルの構文を再確認:タイプミスや余計な文字がないか確認する。
  2. Webアプリケーションの接続設定を確認:接続先ホストが localhost または 127.0.0.1 になっているか確認する。
  3. MySQL のエラーログを確認:エラーの詳細を確認する。
# MySQL のエラーログを確認する
sudo tail -f /var/log/mysql/error.log 

リモート環境からデータベースへ接続したい場合

リモート環境からデータベースへ接続する際、データベースへの接続元が、「IPアドレスの指定(固定IPアドレスなど)」と「SSHでの接続(SSHトンネル)」の掛け合わせが絶対条件です。

信頼できる接続元の固定IPを指定しないまま、SSHのポートを開放することは、新たなセキュリティリスクを生み出します。

① データベースサーバーでの固定IP指定

〇 RHEL  / AlmaLinux(firewalld 使用)の場合

# 信頼できる固定IPからの、SSH接続のみを許可
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="[あなたの固定IP]" port port="22" protocol="tcp" accept'
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload

# 設定確認
sudo firewall-cmd --list-all

〇 Ubuntu(UFW 使用)の場合

# 信頼できる固定IPからの、SSH接続のみを許可
sudo ufw allow from [あなたの固定IP] to any port 22
sudo ufw deny 22
sudo ufw reload#

② SSH設定の強化

sudo nano /etc/ssh/sshd_config

以下の設定を追加・変更します。

# パスワード認証の無効化(キー認証のみ)
PasswordAuthentication no

# 特定のユーザーとIPの組み合わせで制限
AllowUsers username@[あなたの固定IP]

# rootログインの無効化
PermitRootLogin no

設定の変更後、SSHのサービスを再起動します。

sudo systemctl restart sshd

③ SSHトンネルの確立

接続元の固定IP指定が完了してから、以下のコマンドで安全に接続します。

これで、全ての通信はSSHによって暗号化され、MySQL の port 3306 も外部に公開されることはありません。

sh -L 3306:localhost:3306 [あなたの接続ユーザー名]@[サーバーホストのIPアドレス(またはドメイン名など)]

まとめ

データベースを直接外部のインターネット上に晒すことは、「鍵のかかっていない金庫を路上に置いている」ようなものです。

「もっと早く対処しておけば…」と、残念な結果になる前に、速やかに下記のことを確認しましょう。

〇 port 3306 が外部公開されていないか確認する
〇 もし外部公開されていたら、即座に設定を修正する
〇 定期的なセキュリティチェックを習慣化する

 

ホームページ制作、サーバー構築/運用のことなら

 

弊社へのお問い合わせについて

  • ▼ 企業WeChat公式アカウント▼

  • ▼ WeChatで担当者に直接連絡 ▼

お気軽にお問い合わせください

CONTACT

お気軽にお問い合わせください

WeChatスキャンコード