新しいウェブサーバーは、オンラインになってから数分以内にスキャンされます。そのトラフィックのほとんどは自動化されたもので、基本的な対策をしていれば無害です。このガイドは15 分の堅牢化をもう一歩進め、ファイアウォール、fail2ban によるブルートフォース対策、より安全な Nginx の設定を取り上げます。
ステップ 1:UFW によるデフォルト拒否のファイアウォール
必要なものだけを許可し、残りをブロックします。自分が締め出されないよう、最初に SSH を追加してください。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
標準以外の SSH ポートを使っている場合は、OpenSSH の代わりにそのポートを許可します。
ステップ 2:繰り返しの失敗に対する fail2ban
fail2ban はログを監視し、ログインに失敗し続ける IP アドレスを遮断します。
sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.local > /dev/null <<'CONF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
[sshd]
enabled = true
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
CONF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
SSH 鍵を使い、パスワードログインも無効にしてください。SSH 鍵の解説をご覧ください。
ステップ 3:Nginx のバージョンを隠して安全なヘッダーを追加する
/etc/nginx/nginx.conf の http ブロック内に記述します:
server_tokens off;
サイトの server ブロックに記述します:
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
HSTS ヘッダーは、ドメインと使用しているすべてのサブドメインで HTTPS が動作するようになってから追加してください。
ステップ 4:悪質なリクエストを制限する
レート制限により、ログインページへのブルートフォース攻撃を遅らせられます:
# in the http block
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
# in your server block
location = /wp-login.php {
limit_req zone=login burst=5 nodelay;
# ...your usual PHP handling
}
sudo nginx -t && sudo systemctl reload nginx でテストして適用します。
ステップ 5:最新の状態に保つ
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
自動セキュリティアップデートにより、何もしなくても既知の脆弱性がふさがれます。
監視すべきこと
sudo fail2ban-client status sshdで遮断状況を確認します。/var/log/nginx/error.logをときどき確認します。- プロキシや CDN の背後にある場合は、fail2ban が実際のクライアント IP を読み取るようにしてください。そうしないと、自分のプロキシを遮断してしまうことがあります。