
Webシステムやサーバーの管理者が気付かずにやってしまう、最も危険な設定ミスについてご紹介します。
「でも、Webサイトは正常に動いているし、特に問題ないのでは?」「パスワードもあるから大丈夫では?」
まったく大丈夫ではありません。その油断が大きなセキュリティ事故を招きます。
目次
簡単に説明すると、インターネット上に公開される、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 をインターネット上で公開することは、単なる設定ミスだけに留まらず、企業のビジネス自体を脅かす重大なリスクです。
その具体的な危険性を、以下の観点から解説いたします。
-- 攻撃者が直接あなたのデータベースに接続して実行できる
DROP TABLE users;
DELETE FROM orders;
〇 顧客情報(氏名・メールアドレスなどの連絡先)
〇 パスワード(ハッシュ化されていても危険)
〇 全ての注文履歴や機密情報など
データベースを削除されると、Webサイトは完全に機能停止します。(Webサイトも表示されなくなります)
そのデータベースからシステム全体に侵入され、そのあなたのサーバーが攻撃の踏み台にされる可能性があります。(ランサムウェアなど)
下記のような、オンラインツールやコマンドを駆使することで、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
今回は、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サイトがデータベースに接続できなくなった場合は、下記の流れで確認してください。
# MySQL のエラーログを確認する
sudo tail -f /var/log/mysql/error.log
リモート環境からデータベースへ接続する際、データベースへの接続元が、「IPアドレスの指定(固定IPアドレスなど)」と「SSHでの接続(SSHトンネル)」の掛け合わせが絶対条件です。
信頼できる接続元の固定IPを指定しないまま、SSHのポートを開放することは、新たなセキュリティリスクを生み出します。
〇 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#
sudo nano /etc/ssh/sshd_config
以下の設定を追加・変更します。
# パスワード認証の無効化(キー認証のみ)
PasswordAuthentication no
# 特定のユーザーとIPの組み合わせで制限
AllowUsers username@[あなたの固定IP]
# rootログインの無効化
PermitRootLogin no
設定の変更後、SSHのサービスを再起動します。
sudo systemctl restart sshd
接続元の固定IP指定が完了してから、以下のコマンドで安全に接続します。
これで、全ての通信はSSHによって暗号化され、MySQL の port 3306 も外部に公開されることはありません。
sh -L 3306:localhost:3306 [あなたの接続ユーザー名]@[サーバーホストのIPアドレス(またはドメイン名など)]
データベースを直接外部のインターネット上に晒すことは、「鍵のかかっていない金庫を路上に置いている」ようなものです。
「もっと早く対処しておけば…」と、残念な結果になる前に、速やかに下記のことを確認しましょう。
〇 port 3306 が外部公開されていないか確認する
〇 もし外部公開されていたら、即座に設定を修正する
〇 定期的なセキュリティチェックを習慣化する
▼ 企業WeChat公式アカウント▼

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


WeChatスキャンコード
企業公式アカウント
担当者直結WeChat