【Firewalld講座 第8回】DBを守れ!MySQL(3306)を「特定のWebサーバー」からだけ許可する鉄壁設定

金庫の扉は「身内」にしか開けない

こんにちは!「リナックス先生」です。
Firewalld講座、第8回へようこそ。

前回まではWebやメールといった「外に見せるサービス」の設定でした。
しかし、今回のテーマであるデータベース(MySQL/MariaDB)は違います。

データベースは、Webサイトの裏側で動く「金庫」です。
この扉(3306番ポート)をインターネットに向けて全開放しているサーバーをたまに見かけますが、これは「どうぞデータを盗んでください」と言っているのと同じです。

今回は、「Webサーバーからの接続だけを通し、それ以外はすべて遮断する」という、バックエンドシステムの基本設計をマスターしましょう。

コウ君

先生、僕のサーバーはWordPressひとつだけなんですけど、その場合もDBの設定って必要なんですか?

リナックス先生

良い質問ね。
構成によって「やるべきこと」が変わるわ。
まずは「1台構成」と「2台構成」の違いを整理しましょう。

1. 構成別:Firewalldの正解パターン

データベースの設定は、サーバー構成によって大きく2つに分かれます。

パターンA:オールインワン構成(同居)

WebサーバーとDBサーバーが、同じ1台のサーバー内にある場合(WordPressの標準的な構成など)。

  • 通信経路: サーバー内部の localhost (127.0.0.1) またはソケット通信を使います。
  • Firewalld設定: 【何もしない(ポートを開けない)】が正解です。

Firewalldでポートを開けなくても、内部通信(loインターフェース)は最初から許可されています。
逆に、外部に対して3306番を開ける必要は1ミリもありません。

パターンB:分離構成(WebとDBが別)

アクセスが増えてきたため、WebサーバーとDBサーバーを別のマシンに分けた場合。

  • 通信経路: WebサーバーからLANケーブル(ネットワーク)経由でDBサーバーに接続します。
  • Firewalld設定: 【WebサーバーのIPアドレスからのみ許可する】必要があります。

今回は、この「パターンB(分離構成)」を想定して設定を行います。

2. 【実践】Webサーバーからの接続だけを許可する

シナリオを設定します。

  • DBサーバー(設定対象): あなたの現在のサーバー
  • Webサーバー(接続元): IPアドレス 192.168.1.10 (※環境に合わせて読み替えてください)

第6回で学んだ「Source機能」を使って、Webサーバーからの通信だけを特別扱いします。

Step 1: 専用のゾーンを用意する

今回は internal(内部)ゾーンを活用しましょう。
まずは internal ゾーンに MySQL の許可を与えます。

sudo firewall-cmd --permanent --zone=internal --add-service=mysql

念のため確認します。public ゾーンには mysql が入っていないことを確認してください(重要!)。

sudo firewall-cmd --list-all --zone=public

もし servicesmysql があったら、即座に削除してください。

sudo firewall-cmd --permanent --zone=public --remove-service=mysql

Step 2: WebサーバーのIPを登録する

「IPアドレス 192.168.1.10 からの通信は internal ゾーンで扱う」というルールを追加します。

sudo firewall-cmd --permanent --zone=internal --add-source=192.168.1.10

Step 3: 設定反映と確認

リロードして適用します。

sudo firewall-cmd --reload

アクティブなゾーンを確認します。

sudo firewall-cmd --get-active-zones

▼理想的な実行結果

internal
  sources: 192.168.1.10
public
  interfaces: eth0

これで、「Webサーバー(192.168.1.10)からの通信だけが Internalゾーン(MySQL許可)へ誘導され、それ以外の世界中からのアクセスは Publicゾーン(MySQL拒否)へ誘導される」という鉄壁の構成が完成しました。

コウ君

なるほど!
ポートを開ける・閉めるだけじゃなくて、「誰に対して開けるか」をゾーンで制御するわけですね。
これならインターネットの脅威からDBを守れます!

3. リモートからDB管理ツールを使いたい場合

「自宅のPCに入っている『MySQL Workbench』や『A5:SQL Mk-2』などのGUIツールから直接DBを操作したい」という要望もよくあります。

この場合、対応策は2つあります。

方法①:自宅IPを許可する(非推奨)

先ほどと同じように、自宅のIPアドレスをSourceに追加して 3306 を通す方法です。
しかし、DBの生通信をインターネットに通すのは、暗号化設定などが複雑でリスクが高いです。

方法②:SSHトンネルを使う(推奨)

これがプロのやり方です。
Firewalldの設定変更は一切不要です。

DB管理ツールの接続設定画面で、「SSH Tunneling(SSHトンネル)」や「Over SSH」という項目を選びます。

  • SSH Host: サーバーのIPアドレス(SSHがつながる場所)
  • SSH User: サーバーのOSユーザー名
  • SSH Key: 秘密鍵ファイル
  • MySQL Host: 127.0.0.1 (サーバーから見た自分自身)
  • MySQL Port: 3306

こうすることで、「許可されているSSHの通り道の中に、DBの通信を隠して通す」ことができます。
安全かつ、Firewalldの設定を汚さずに済むため、リモート管理は原則この方法を使いましょう。

4. 【重要】ダブルロックのすすめ

Firewalldの設定は完璧ですが、万が一Firewalldが停止してしまったらどうなるでしょうか?
3306番ポートが全開放されてしまいます。

これを防ぐために、データベース本体(MySQL/MariaDB)の設定ファイルでも制限をかけておくのが「多層防御」の基本です。

MariaDBの設定確認

/etc/my.cnf.d/ 以下の設定ファイルを開き、bind-address を確認します。

# 外部からの接続を受け入れる設定
bind-address = 0.0.0.0

もしWebとDBが同居している(パターンA)なら、ここを 127.0.0.1 に書き換えておけば、Firewalldが死んでも外部からは繋がりません。
分離構成(パターンB)の場合は 0.0.0.0(全許可)にしておき、Firewalldで守る形になります。

5. トラブルシューティング

「設定したのに繋がらない!」という場合に見るべきポイントです。

① DBユーザーの権限

Firewalldが通していても、MySQL側で「そのIPからのユーザー接続」を許可していないと拒否されます。

-- MySQLにログインして確認
SELECT user, host FROM mysql.user;

hostlocalhost だけになっていませんか?
192.168.1.10%(全ホスト)からの接続許可を持つユーザーを作成する必要があります。

② クラウドのファイアウォール

Webサーバー設計時と同じく、AWSやConoHaなどのコンソール画面で、セキュリティグループの設定を確認してください。
「Webサーバーからの3306番」を許可する必要があります。

まとめ:データベースは最重要防衛ライン

第8回では、データベースのセキュリティ設計を行いました。

  • WebとDBが同居しているなら、Firewalldで3306番を開ける必要はない。
  • サーバーが分かれているなら、WebサーバーのIPだけをSource指定して許可する。
  • リモート管理はポート開放ではなく、SSHトンネルを活用する。
  • Firewalldだけでなく、DB側のユーザー権限設定も忘れずに。

これで、Web、メール、データベースという主要なサーバー機能のセキュリティ設定が完了しました。
ここまで来れば、一般的なサーバー構築で困ることはほぼありません。

次回(第9回)は、少し特殊なプロトコル「UDP」に焦点を当てます。
DNSサーバーやNTP(時刻同期)、そして最新のHTTP/3などで使われるUDP通信は、TCPとは少し勝手が違います。
意外と知らないUDPの世界を攻略していきましょう!

▼DB分離構成を試せるVPS

WebサーバーとDBサーバーを2台立ち上げて、プライベートネットワークでの通信制御を実験するには、複数台構成が安価に組めるこちらのVPSがおすすめです。

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント