金庫の扉は「身内」にしか開けない
こんにちは!「リナックス先生」です。
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
もし services に mysql があったら、即座に削除してください。
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;
host が localhost だけになっていませんか?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がおすすめです。


コメント