ファイアウォールとセキュリティ
ストーリー
「DBサーバーのポートは開いてるのに、特定のIPからだけ接続できないって報告があった」
「ポートが開いてるのに接続できない?」
「ファイアウォールだ。ポートが開いていても、ファイアウォールのルールで特定のIPをブロックしていることがある」
「ファイアウォール...名前はよく聞きますが、具体的にどう動くんですか?」
「通信の門番だよ。誰を通して誰を止めるかのルールを設定する」
ファイアウォールとは
ファイアウォールは、ネットワーク通信を監視し、設定したルールに基づいて通信を許可・拒否する仕組みです。
ファイアウォールの種類
| 種類 | 説明 | 例 |
|---|---|---|
| ホストファイアウォール | 個々のサーバーに設定 | iptables, ufw, firewalld |
| ネットワークファイアウォール | ネットワークの境界に設置 | 専用機器、AWS Security Group |
ufw(Uncomplicated Firewall)
Ubuntuで標準的に使われる、シンプルなファイアウォール管理ツールです。
基本コマンド
bash
# ファイアウォールの状態確認
sudo ufw status
# ファイアウォールを有効化
sudo ufw enable
# ファイアウォールを無効化
sudo ufw disableルールの追加
bash
# ポート22(SSH)を許可
sudo ufw allow 22
# ポート80(HTTP)を許可
sudo ufw allow 80
# ポート443(HTTPS)を許可
sudo ufw allow 443
# ポート3306(MySQL)を特定IPからのみ許可
sudo ufw allow from 192.168.1.50 to any port 3306
# ポート5432(PostgreSQL)を特定サブネットから許可
sudo ufw allow from 192.168.1.0/24 to any port 5432ルールの削除
bash
# ルール番号を確認
sudo ufw status numbered
# 番号を指定して削除
sudo ufw delete 3デフォルトポリシー
bash
# 受信をデフォルトで拒否(推奨)
sudo ufw default deny incoming
# 送信をデフォルトで許可
sudo ufw default allow outgoingセキュリティの基本原則: デフォルトですべて拒否し、必要なものだけを許可する(ホワイトリスト方式)。
iptables(参考)
ufwの裏側で動いている、より低レベルなファイアウォールです。
基本構造
bash
# 現在のルールを表示
sudo iptables -L -n
# 入力チェーン(受信トラフィック)
# Chain INPUT
# target prot opt source destination
# ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
# ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:3306
# DROP all -- 0.0.0.0/0 0.0.0.0/0チェーンの種類
| チェーン | 説明 |
|---|---|
| INPUT | 受信トラフィック(自分宛て) |
| OUTPUT | 送信トラフィック(自分から) |
| FORWARD | 転送トラフィック(自分を通過) |
ufwは内部的にiptablesのルールを生成しています。通常はufwで十分ですが、iptablesを理解しておくとトラブルシューティングに役立ちます。
クラウドのセキュリティグループ
AWSなどのクラウド環境では、セキュリティグループがファイアウォールの役割を果たします。
AWSセキュリティグループの例
インバウンドルール(受信):
+------+----------+-----------+-----------------------+
| Type | Protocol | Port | Source |
+------+----------+-----------+-----------------------+
| SSH | TCP | 22 | 203.0.113.0/24 |
| HTTP | TCP | 80 | 0.0.0.0/0 |
| HTTPS| TCP | 443 | 0.0.0.0/0 |
| MySQL| TCP | 3306 | sg-webapp (SG ID) |
+------+----------+-----------+-----------------------+
アウトバウンドルール(送信):
+------+----------+-----------+-----------------------+
| Type | Protocol | Port | Destination |
+------+----------+-----------+-----------------------+
| All | All | All | 0.0.0.0/0 |
+------+----------+-----------+-----------------------+
MySQLのポートは「Webアプリケーションのセキュリティグループ」からのみ許可しています。これにより、DBに直接アクセスできるのはWebサーバーだけになります。
セキュリティの基本原則
最小権限の原則
必要最小限のアクセスのみ許可する
× ポート3306を全世界に公開
○ ポート3306をWebサーバーのIPだけに許可
多層防御(Defense in Depth)
インターネット
→ ネットワークファイアウォール(1層目)
→ セキュリティグループ(2層目)
→ ホストファイアウォール(3層目)
→ アプリケーション認証(4層目)
まとめ
| ポイント | 内容 |
|---|---|