「誰が来たか」で対応を変える、これぞプロの仕事
こんにちは!「リナックス先生」です。
Firewalld講座、後半戦となる第6回へようこそ。
これまでは「ポートを開ける・閉める」という単純な操作を学んできました。
しかし、実際のWebサーバー運用では、もう少し複雑なことが求められます。
- Webサイト (http/https): 世界中の誰からでもアクセスしてほしい。
- SSH / 管理画面: 攻撃されたくないから、自分(管理者)以外は拒否したい。
この2つを両立させるにはどうすればいいでしょうか?
「SSHのポート番号を変える」のも一つの手ですが、最もスマートで強固なのは、Firewalldの「Source(接続元IPアドレス)」機能を使って、接続してくる相手によって「案内する部屋(ゾーン)」を変えてしまう方法です。
今回は、この「VIP待遇システム」を構築して、鉄壁のWebサーバーを作り上げましょう。
先生、IPアドレス制限ってやつですね!
でも、今の設定だと public ゾーンで SSH も HTTP も全部許可しちゃってますよね。
これをどうやって「SSHだけ特定の人」に制限するんですか?
良い所に気がついたわね。
実はFirewalldは、1つのインターフェース(LANケーブル)に対して、条件によって「2つのゾーン」を同時に適用できるの。
「一般人はPublicゾーンへ」「管理者はTrustedゾーンへ」という風に、入り口で振り分けるイメージね。
1. Firewalldの「優先順位」を知る
設定を始める前に、Firewalldが通信を処理する時の「判定ルール」を理解しておく必要があります。
パケットが届いた時、Firewalldは以下の順番でどのゾーンを使うかを決めます。
- Source(送信元IP)による判定:
「このIPアドレスからの通信は、〇〇ゾーンを使う」という設定があるか?
→あればそのゾーンを適用。(最優先) - Interface(インターフェース)による判定:
上記の指定がない場合、そのパケットが届いたLANポート(eth0など)が所属するゾーンを使う。
→通常はこれでpublicになります。
つまり、特定のIPアドレス(あなたの自宅や会社のIP)を「Source」として登録しておけば、あなたの通信だけはインターフェースの設定を無視して、別の安全なゾーン扱いにできるのです。
2. 今回構築する設計図
今回は、AlmaLinux 9の標準構成をベースに、以下の環境を目指します。
| 接続元 | 適用ゾーン | 許可するサービス |
|---|---|---|
| 一般ユーザー (世界中どこからでも) |
public (Interface: eth0) |
http, https (Web閲覧のみOK、SSHは拒否) |
| 管理者(あなた) (特定のIP: 203.0.113.5) |
trusted (Source指定) |
全許可 (SSHもWebも管理ツールもOK) |
こうすれば、一般ユーザーがSSHポート(22番)を叩いても、public ゾーンにはSSHの許可がないためブロックされます。
一方で、あなたがアクセスした時だけは trusted ゾーン(全許可)に誘導されるため、SSH接続が可能になります。
3. 【実践】管理者専用レーンを作る
それでは設定していきましょう。
※注意: IP制限を行う際は、自分のグローバルIPアドレスが変わると締め出される可能性があります。固定IP環境での実施を推奨します。
Step 1: 自分のIPアドレスを `trusted` ゾーンに登録する
まずは、あなたの接続元IPアドレスを調べます。
(「確認くん」などのサイトで、現在のグローバルIPを確認してください。ここでは例として 203.0.113.5 とします)
次に、そのIPアドレスを trusted(信頼)ゾーンの「Source」として登録します。
sudo firewall-cmd --permanent --zone=trusted --add-source=203.0.113.5
success
まだリロードはしません。
念のため、本当に登録されたか確認しましょう(Permanent設定を見ます)。
sudo firewall-cmd --permanent --zone=trusted --list-all
▼実行結果
trusted target: ACCEPT sources: 203.0.113.5 services: ...
sources の欄にIPが入っていればOKです。
Step 2: リロードして適用する
設定を反映させます。
この時点で、あなたのPCからの通信は全て trusted ゾーン(全許可)として扱われるようになります。
sudo firewall-cmd --reload
Step 3: 自分が特別扱いされているか確認する
ここが重要です。本当に自分が trusted ゾーンに判定されているか確認します。--get-active-zones コマンドを使います。
sudo firewall-cmd --get-active-zones
▼成功時の実行結果
public interfaces: eth0 trusted sources: 203.0.113.5
このように、public と並んで trusted が表示され、そこに自分のIPがあれば成功です!
これで「VIPレーン」が開通しました。
4. 【実践】一般レーン(Public)を制限する
管理者用の裏口を確保したので、次は表玄関(Public)のセキュリティを強化します。
一般ユーザーにはWebサイト以外触らせないようにします。
Step 4: Publicから SSH を削除する
【警告】 Step 3の確認を行わずにこのコマンドを実行すると、もしSource設定が間違っていた場合、SSH接続が切断されて二度と入れなくなります。
必ず「自分がtrustedにいること」を確認してから実行してください。
sudo firewall-cmd --permanent --zone=public --remove-service=ssh
sudo firewall-cmd --permanent --zone=public --remove-service=cockpit
(※cockpitなど不要な管理ツールがあれば一緒に消します)
Step 5: Publicに HTTP/HTTPS を追加する
逆に、Webサイトは見れるようにしなければなりません(第4回のおさらいです)。
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
Step 6: 最終リロードと確認
最後に設定を反映させます。
sudo firewall-cmd --reload
現在の public ゾーンの状態を確認してみましょう。
sudo firewall-cmd --list-all --zone=public
▼理想的な実行結果
public (active) target: default interfaces: eth0 services: dhcpv6-client http https <-- sshがない! ports: ...
services から ssh が消えていれば完成です!
おお…!
これなら、世界中のハッカーがSSHポート(22)を攻撃してきても、そもそも public ゾーンには穴がないから弾かれるわけですね。
でも僕は trusted だから、変わらずSSHでログインできると。完璧じゃないですか!
5. 「Source」利用時の注意点
非常に便利なSource機能ですが、いくつか運用上の注意点があります。
注意点①:IPアドレスが変わったら?
自宅のネット回線などは、ルーターを再起動するとグローバルIPが変わることがあります。
IPが変わった瞬間、あなたは trusted から外れ、public(SSH禁止)に放り込まれるため、SSH接続ができなくなります(締め出し)。
【対策】
VPSの「コンソール機能(ブラウザ操作)」は、ネットワークを経由しないためFirewalldの影響を受けません。
締め出された場合はコンソールからログインし、新しいIPを add-source し直してください。
注意点②:CloudflareなどのCDNを使う場合
Cloudflareなどを通すと、Webサーバーへのアクセス元IPがすべて「CloudflareのIP」になってしまいます。
この場合、Source制限を行うと「Cloudflareからのアクセス」として一括りで扱われてしまうため、Webサーバー側(Nginx/Apache)でのログ設定など、別の工夫が必要になります。
6. 応用:管理用ゾーンを自作する
今回は既存の trusted を使いましたが、セキュリティポリシーとして「全許可は怖い」という場合もあるでしょう。
その場合は、独自の「admin」ゾーンを作って、そこに必要なサービスだけを入れることも可能です。
簡単に手順だけ紹介します。
# 新しいゾーンを作成 sudo firewall-cmd --permanent --new-zone=admin # 設定をリロード(ゾーンを認識させる) sudo firewall-cmd --reload # SSHをadminゾーンに追加 sudo firewall-cmd --permanent --zone=admin --add-service=ssh # 自分のIPをadminゾーンに追加 sudo firewall-cmd --permanent --zone=admin --add-source=203.0.113.5 # リロード sudo firewall-cmd --reload
こうすれば、「管理者IPからはSSHだけ許可(HTTPは見れない)」といった、より細かな制御も可能です。
まとめ:2つの顔を持つサーバーを作ろう
第6回では、Webサーバー構築におけるセキュリティ設計の要、「Source機能」を使ったアクセス制御を学びました。
- Source(送信元IP) の設定は、Interfaceの設定よりも優先される。
- 自分のIPを
trustedゾーンのSourceに登録することで、自分だけ「全許可」にできる。 - その状態で
publicからSSHを削除すれば、外部からの攻撃を完全に遮断できる。 - IPが変わった時のために、VPSのコンソール操作手段を確保しておく。
この構成は、企業のWebサーバーなどでも実際に使われている鉄板の構成です。
これでWebサーバーの基本設計は完了しました。
次回(第7回)は、もう一つの主要なサーバー用途である「メールサーバー(SMTP/IMAP/POP3)」の設計に入ります。
メールはWeb以上に攻撃を受けやすいサービスです。スパムの踏み台にされないためのポート制御をしっかり学びましょう!
▼固定IPが使いやすいVPS
今回の「Source制限」を安全に運用するには、接続元のIPアドレスが変わらない環境や、緊急時にブラウザから操作できるコンソール機能が充実したVPSが必須です。AlmaLinux 9対応のおすすめはこちら。


コメント