【VPS構築③】ファイアウォールとfail2banでセキュリティ強化

ファイアウォールとfail2ban対策

記事内に広告を含みます

いよいよここまで来ました!ここを乗り越えればようやく実際のウェブサーバーを構築していけますので、もう少しだけ頑張りましょー!

大前提;VPSはインターネット上で直接攻撃を受けやすい

特にSSH(22番ポート)は、公開した瞬間から世界中のbotが総当たりしてくるらしいのです。
だからこそ、最後までセキュリティ対策は抜かりなく行います。

次にやるべきはこの2つ↓

  • firewalld … 通信を制御(不要ポートを閉じる)
  • fail2ban … 不正ログインを自動でBAN

これを入れれば、VPSの最初にしておくべきセキュリティ対策 はひとまず安心ライン!

 

個人的には最初調べながらの作業だったので意味分からずやっていた事が多いです。

ですので必ずご利用の際は自己責任でコピペだけではなく、コマンドの意味、用語の意味、設定内容、必然性なども調べつつ取り組んでいただくことを推奨します。

VPS会社や契約が異なると状態も違う事が多いです。自分の環境、状態をチェックして、必要な事だけを行っていきましょう。

ファイアウォール設定(firewalld)

この設定を行う目的

  • VPSは外から丸見え、初期状態では全ポートが開いていることもある
  • 不要な通信を遮断して、攻撃対象を減らす
  • 最低限開けるのは 22 / 80 / 443 のみ

MacなどからSSHログインして、実行します(例:ssh -i ~/.ssh/key.pem user@IPアドレス

確かめながら1つずつコマンド打ってみてください。

AlmaLinux系で標準インストール済みのこともあるので、まず先に入っているかどうかをチェックしています。

導入手順

# firewalld が入っているか確認
rpm -q firewalld

# なければインストール
sudo dnf -y install firewalld

# 起動と自動起動設定
sudo systemctl enable --now firewalld

# SSH, HTTP, HTTPS だけ許可
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# 反映
sudo firewall-cmd --reload

確認

sudo firewall-cmd --list-all

最後に services: ssh http https と表示されればOK。
この状態が外部公開するWebサーバーの最小構成になっています。

ポートはこれだけ覚えておこう
  • ssh (22):自分がログインするため。これを閉じると自分も入れない
  • http (80):SSL証明書の初期取得やリダイレクトなどで使用
  • https (443):Webサイトを暗号化して公開するためのメインポート
  • cockpit (9090):Web管理GUIツール、(VPSでは不要な場合が多く削除推奨)
  • dhcpv6-client:IPv6を使わないなら削除(VPS契約にIPv6あるのか確認)

不要なサービスを閉じるコマンド

# cockpitとIPv6クライアントを閉じる
sudo firewall-cmd --permanent --remove-service=cockpit
sudo firewall-cmd --permanent --remove-service=dhcpv6-client
sudo firewall-cmd --reload

SSH総当たり攻撃を防ぐ(fail2ban)

次はこの見慣れないfail2banですね。

SSHを公開しているサーバーでは、世界中からの総当たり攻撃(ブルートフォース攻撃)が常に試みられています。

ファイアウォールは「開く/閉じる」を制御しますが、fail2banはログを監視して攻撃元IPを自動で一定時間BANするツールです。
SSHを公開するなら、必須レベルの防御対策とも言われています。

 

ちなみに日本ではどんな攻撃が多いのか?

IPA(情報処理推進機構)は経産省所管の公的機関で、毎年情報セキュリティ10大脅威 2025を発表しています。

脆弱性のニュースも上がっているので定期的に確認してみるのもオススメです。

fail2banの導入手順

# 依存パッケージ & fail2ban インストール
sudo dnf -y install epel-release
sudo dnf -y install fail2ban fail2ban-firewalld

# 自動起動
sudo systemctl enable --now fail2ban

設定ファイルの作成

共通設定(/etc/fail2ban/jail.d/00-defaults.local)

sudo nano /etc/fail2ban/jail.d/00-defaults.local

内容:

[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
backend  = systemd
banaction = firewallcmd-rich-rules

設定の意味

  • banaction:firewalldを利用してBANを適用
  • bantime:BANの持続時間(1時間)
  • findtime:失敗回数のカウント期間(10分)
  • maxretry:許容失敗回数(5回)
  • backend:ログの監視方式(systemdに対応)

bantime1h(1時間)ですが、実運用では 10h24h に延ばす例もあり。fail2ban では無期限BANも設定可能。も気になる方は更に踏み込んだ設定も可能!

SSH用設定(/etc/fail2ban/jail.d/sshd.local)

sudo nano /etc/fail2ban/jail.d/sshd.local

内容:

[sshd]
enabled = true
port    = ssh
filter  = sshd
journalmatch = _SYSTEMD_UNIT=sshd.service

設定反映と動作確認

sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

出力例:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 0
|- Actions
|  |- Currently banned: 0

Currently banned: 0などと出れば正常に稼働中。
実際にログイン失敗を繰り返すと、そのIPが自動BANされます。

確認

# 全体の状態
sudo fail2ban-client status

# SSH監視の状態
sudo fail2ban-client status sshd

# 常駐確認
systemctl status fail2ban

Banned IP list にIPが出ていればBAN成功。
fail2banはバックグラウンド常駐して、SSH攻撃を自動で防御してくれます。

ファイアウォール(firewalld)と連携して動作しているため、banaction設定がfirewallcmd-rich-rulesになっている点が重要です。

お疲れ様でした!

これで、firewalld+fail2banの組み合わせによる堅牢なSSH防御が完成しました。

もちろん完璧ではないでしょうが、まずは初期設定としてのセキュリティ対策はクリア出来ました。

いよいよ次からはWebサーバーをVPS上に構築していきます。

大変だけど楽しいですよね?