NginxでDDoS攻撃を防ぐ方法|トラフィック監視からIP遮断まで徹底解説
DDoS(Distributed Denial of Service)攻撃とは、大量の不正な通信によってサーバーのリソースを食い潰し、正常なサービスを妨害するサイバー攻撃のことです。いわばコンピューターの世界における「組織的な襲撃」であり、無数の悪意あるリクエストが重なり合うことで、経験豊富な管理者が運用するサーバーでさえも機能停止に追い込まれるほどの脅威となります。さらに厄介なのは、こうした攻撃には複数の手口が存在するという点です。幸いにも、サーバー側の設定を適切に行えば、これらの攻撃に効果的に対抗できます。
NginxはUnix系マシンで広く利用されている人気の高いWebサーバーソフトウェアですが、標準機能だけでもDDoS攻撃の被害を大幅に軽減できる十分な機能を備えています。
ここでは、Nginxサーバーでこうした脅威に対処するための実践的な方法をいくつか紹介します。
設定ファイルのバックアップを取る
設定を変更する前に、必ずサーバーの設定ファイルのバックアップを作成しておきましょう。以下のコマンドでバックアップできます。
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup-original

これで準備完了です。次に進みましょう。
トラフィックの監視
サーバーのトラフィックを常に把握しておくことで、セキュリティの最適化や追加対策の実装が格段にしやすくなります。Nginxにはこの目的のための専用モジュールが用意されています。
ステータスページを設定する
Nginxには通常「stub status」(http_stub_status_module)というモジュールが付属しており、これを使えばサーバー環境にステータス監視機能を簡単に組み込めます。まず、以下のコマンドでモジュールが有効になっているか確認しましょう。
nginx -V

grepと組み合わせれば、より素早く確認できます。
nginx -V 2>&1 | grep -o with-http_stub_status_module

上記のような出力が得られれば問題ありません。表示されない場合は、モジュールを含めてNginxを再インストールまたは再コンパイルする必要があります。
ステータスページの設定自体はシンプルですが、セキュリティを保つためにアクセス権限は最小限(自分のマシンのみ)に制限することが重要です。まず「/etc/nginx/nginx.conf」というメイン設定ファイルを開きます。

ファイルを開いたら、「httpディレクティブ」内に以下のコードを追加してモジュールを有効化します。「localhost」「/status_page」「127.0.0.1」の部分はご自身の環境に合わせて書き換えてください。
server {
listen 80;
listen [::]:80;
server_name localhost;
##
# Status Page Settings
##
location /status_page {
stub_status on;
allow 127.0.0.1;
allow ::1;
deny all;
}
}
注意:このファイルを編集するにはsudo権限が必要です。

続いて、設定をテストします。
sudo nginx -t

問題がなければ、サーバーにリロードシグナルを送ります。
sudo systemctl reload nginx

ステータスページにアクセスするには、ブラウザで「server_name/status_page」にアクセスするか、curlなどのコマンドラインツールを使用します(ブラウザのキャッシュが自動更新されない場合に便利です)。例として、以下のcurlコマンドでアクセスできます。
curl localhost/status_page

ブラウザで開くと、以下のように表示されます。

アクセスログを確認する
上記で設定したステータスページを確認して異常なトラフィックに気づいたら、サーバーのアクセスログもチェックするとよいでしょう。ログは「/var/log/nginx/access.log」にあります。ここには、使用されたHTTPメソッド、アクセスの日時、ユーザーエージェント、アクセスされたページなどが記録されており、攻撃の傾向を分析する貴重な手がかりになります。

接続数・リクエスト数の制限
DDoS攻撃への対策として試す価値のある手法の中でも、最もシンプルかつ効果的なのが、受信トラフィックのレート制限です。
理想的なのは、悪意あるボットが人間離れした速度でサーバーを圧倒できないようにしつつ、人間のクライアントには妥当な速度でのアクセスを許可することです。Nginxではlimit_req_zoneディレクティブとlimit_reqディレクティブを使ってこれを実現できます。以下のコードは、サーバーが公開しているあらゆるロケーションで利用できるメモリ容量とレートの制約を定義するものです。
limit_req_zone $binary_remote_addr zone=speedbump:10m rate=10r/s;
「zone」は、ユーザーリクエストを保存するメモリ領域の名前とサイズ(この例では10MB)を指定します。「rate」はNginxが毎秒受け付けるリクエストの総数(この例では10件)を決めます。このコードを「ルール」と捉え、続くコードをそのルールの「適用」と考えてください。
limit_req zone=speedbump burst=20;
上記のコードは単に制限ルールを適用するだけでなく、最大20件までのリクエストキューも追加します。これにより、通常より少し速いだけの正当な接続は柔軟に処理されます。ルールとキューの両方を超えたリクエストには、クライアントへ503エラーが返されます。両ディレクティブをnginx.confに記述すると以下のようになります。

IPアドレスのブラックリスト登録
DDoS攻撃を仕掛けているIPアドレスを特定できたら、それをブラックリストに登録し、その発信元からの接続をすべて拒否できます。
serverディレクティブに以下のコードを追加してください。
location / {
deny 123.123.123.0/28;
# ...
}
特定ファイルへのリクエストをブロックする
DDoS攻撃がサーバー上の特定のファイルを狙っている場合は、そのファイルへのすべてのリクエストをブロックできます。たとえばWordPressのxmlrpc.phpファイルは、WordPressサーバーにおいて特に攻撃対象になりやすいファイルとして知られています。serverディレクティブに以下のコードを追加します。
location /xmlrpc.php {
deny all;
}
以上の手順を実践すれば、ほとんどのDDoS攻撃を防げるようになります。さらなるセキュリティオプションについては、Nginxの公式ドキュメントもぜひ参照してみてください。
-
USB攻撃を防ぐ方法|知っておきたいセキュリティ対策のすべて
デジタル時代において、サイバー犯罪による攻撃やデータ漏洩はもはや日常的な出来事となっています。そして、この脅威がすぐに消えることはありません。ハッカーたちは悪意のあるプログラミング技術を駆使し、私たちのデバイスへ侵入する新たな手法を次々と編み出しています。サイバー犯罪者が個人システムや企業ネットワークに不正アクセスし、プライバシーを侵害するニュースを、私たちは頻繁に耳にするようになりました。 では、USB攻撃はどう防げばよいのか? ハッカーが攻撃を仕掛けるさまざまな手段の中でも、USBフラッシュドライブは特に脆弱な存在です。ファイルの保存や転送に欠かせない手軽な記録メディアであるため、多くの
-
現代のDDoS攻撃の進化:知っておくべき脅威の歴史と最新動向
DDoS(Distributed Denial of Service、分散型サービス拒否攻撃)とは、複数のボットネットシステムが単一のシステムを標的にし、膨大なトラフィックで圧倒することで運用を妨害するサイバー攻撃です。攻撃者の目的は、ウェブサイト上のサービスを停止させることにあります。対象となるのは、アプリケーション、ネットワーク、各種サービス、デバイス、サーバー、さらにはソフトウェア内の特定のトランザクションなど、あらゆるサービスへのアクセスです。 DoS攻撃では1台のシステムが悪意あるデータやリクエストを送信するのに対し、DDoS攻撃は複数のシステムから同時に攻撃が仕掛けられる点が最大の