いまさらNginxでDoS攻撃対策してみる(3つの対応してみた)
NginxでDoS攻撃対策してみる
テレワーク中、自宅サーバのアクセスログを眺めているとDoS攻撃が頻繁にあり、しかもかなりしつこい輩でしたので対応してみました(いままで対応してなかったのも問題ですが汗)
とりあえず3つほど対応してみました。相変わらずシツコク攻撃してくるけどまあ自分なりに納得してますw
・DoS攻撃・DDoS攻撃とは?攻撃の目的や種類、事例、対策方法を解説
前提
我が家は、Apache -> Nginx として Nginxを リバースプロキシサーバー としています。そのため Nginx 側でいくつかの攻撃を防いでみることを前提としてみています。
その1:NginxでIPアドレス制限かけてみる(ブラックリスト形式)
ログから攻撃者のIPが判る場合、手っ取り早くIPを弾いてみます。下記の様に攻撃者IPをブラックリスト形式で登録してみます。
server {
・
・
    location / {
        deny 118.107.46.156;  ※IP指定
        deny 193.38.54.0/24;  ※範囲指定
        allow all;
} 
該当のIPであれば「403 Forbidden」を返却します。
その2:NginxでIPアドレス制限かけてみる(ブラックリスト形式)
上記と同じような感じですが、ブラックリストとして別ファイルに攻撃者IPを記述する方法。レスポンスコードを指定することができるので後から集計するときに便利と思われます。
geo $access_filter {
    default OK;
    include /etc/nginx/conf.d/ip_deny_list.txt;
}
server {
・
・
    # black list
    if ($access_filter = "NG") {
        return 444;
    }
} 
193.38.54.237 NG;
162.241.217.141 NG;
該当のIPであれば「444 Nginx独自のステータスコード」を返却します。
その2の1:NginxでIPアドレス制限かけてみる(ブラックリスト形式-国指定)
とりあえず静になったかな?と思ったら某国から大量のアタック!!うっさいですよね、かまってちゃん・・・
国別のIPアドレスをまとめている http://nami.jp/ipv4bycc/ サイトさんから cidr.txt.gz をダウンロードして上記の /etc/nginx/conf.d/ip_deny_list.txt に追加する手順を実施してみます。
$ wget http://nami.jp/ipv4bycc/cidr.txt.gz
$ gunzip cidr.txt.gz
$ sudo sed -E 's/^(CN|KR|DE|GB|BR|FR|CA|AU|IT|NL|RU|IN)\t(.*)/\2 NG;/g' cidr.txt | grep 'NG;' >> /etc/nginx/conf.d/ip_deny_list.txt
$ systemctl restart nginx.service
とりあえずこれで多少はマシになるハズ。
・世界の国別 IPv4 アドレス割り当てリスト
・Nginxで一部海外IPからのアクセスを遮断する
その3:過度アクセスする輩の対策をしてみる
秒あたり数百リクエストしてくる攻撃者には limit_req こちらがよさげ。
limit_req を使用すると単位時間あたりにリクエスト数に制限をかけることができるらしい。
以下定義としてみます。
 ① limit_req_zone にて「攻撃者の同IPからアクセスが秒間1回以上の制限する」定義をする。
 ② limit_req で秒間5回までのリクエストを受け付ける。
http {
    # dos対策, レスポンス 444で返却
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
    limit_req_log_level error;
    limit_req_status 444;
}
server {
    location / {
        # dos 秒あたり 5リクエストは受け付け、それ以外は破棄=444
        limit_req zone=one burst=5 nodelay;
    }
} 
おわり
攻撃者か否かの判定をステータスコードで判別できる点がいいなと思いました。
弱小サイトだけどこれだけしているだけでも、だいぶ違うと思いましまね。
参考サイト
・nginxでIPアドレス制限
・[Nginx] メンテナンス状態に設定する
・nginxでIPフィルタを設定した上で無許可IPにはステータスコードを返さない
・過度のアクセスに備える(その2)!!Nginxのlimit_reqの設定と検証
Discussion