109:不正なドメイン名でのアクセスを拒否する

プログラミング迷子: IPアドレス宛の無差別攻撃

  • 後輩W:Djangoでエラーが起きて Invalid HTTP_HOST header: '91.92.66.124'. You may need to add '91.92.66.124' to ALLOWED_HOSTS. というタイトルのメールがたくさん届くんですけど、どうしたらいいんでしょう?

  • 先輩T:なるほど、botがIPアドレス直でアクセスしに来てるんだね。どうすれば良いと思う?

  • 後輩W:調べてみます……そのIPアドレスにブラウザでアクセスすると403エラーになってエラーが再現するので、アクセスできるように settings.pyALLOWED_HOSTS91.92.66.124 を加えればよさそうです。

  • 先輩T:それはちょっと安直だね。Djangoの公式ドキュメントには ALLOWED_HOSTS の目的が詳しく書いてあるよ 1

  • 後輩W:読みます……なるほど、 ALLOWED_HOSTS は攻撃を防ぐためにあるから、アクセス許可するのは悪手ってことですね。エラーメール通知を完全にオフにするのは良くなさそうだし、今はエラーメールが多いと言っても日に10通程度なのでこのままにしておくのが良さそうです。

  • 先輩T:それだと対応が必要なエラー通知が埋もれちゃうだろうね。それに不要なアクセスがDjangoまで届いているのも良くないよ。

エラーメッセージには、多くの場合エラーの直接の原因が書かれています。 しかし、この ALLOWED_HOSTS のケースでは指示通りに対処すると、かえって問題を深刻にしていまいます。

1

https://docs.djangoproject.com/ja/2.2/ref/settings/#allowed-hosts

具体的な失敗

インターネット上では、ウイルスやbotなどによってすべてのIPアドレスに対して無差別に攻撃が行われています。 ALLOWED_HOSTS はそのような攻撃を防ぐことが目的の設定なため、エラーメッセージで You may need to add '91.92.66.124' と言われたからといって安直に追加してはいけません。 また、こういった攻撃の中には、IPアドレスではなく本来とは異なるドメイン名でアクセスすることでプログラムの脆弱性を突いて侵入しようとするケースもあります。 発生件数が少ないからといってエラーを放置してしまうとDjangoアプリが攻撃に晒され、たとえ攻撃が無効だとしてもDjangoでのリクエスト処理でサーバーリソースが占有されてしまいます。

cover

(中略)詳細は書籍 自走プログラマー をご参照ください