「SAVACAN」担当のMKです。
今回はSlowlorisというWEBサイトへの攻撃手法と対策についてを取り上げたいと思います。
Slowloris攻撃は、最近ではあまり耳にする機会が多い攻撃手法ではありませんが、弊社の管理するシステムで実際にSlowloris攻撃を受けた事があります。その時の対応も合わせて解説していきます。
始めにSlowloris攻撃がどのようなものかご説明したいと思います。
Slowlorisとはどのような攻撃か
・どのような目的の攻撃か
Slowlorisとは、Slow HTTP DoS攻撃用の攻撃ツールの名前です。
サービスを停止させるDoS攻撃の一種で、細分化したリクエストパケットを遅延して送信することで大量の処理中リクエストを発生させ、サーバーリソースを枯渇させたりプロセスを溢れさせることを狙います。特にApache HTTP Serverに有効な攻撃とされています。
・どのような背景で登場したのか
セキュリティ研究者が、2009年某日にウェブサーバーがDoS攻撃に対して脆弱であったことを発見し、これを悪用するツールとしてSlowlorisを作成したといわれています。一般的なDoS、DDoS攻撃と比べて必要リソースが少なく、またネットワーク帯域にも負担をかけないため非常に容易に攻撃を実行できるとされています。
実際に使用された例として、2009年のイラン大統領選挙の折にイラン政府が運営するサイトに対する攻撃手段としSlowlorisが利用されたとされています。
・攻撃の影響を受けやすいWEBサーバー
Apache1.x および2.x
IIS 6.0 以前
Nginx 1.5.9以前
・httpログにはどのように記録されるか
結論として、Slowloris攻撃によるアクセスはログに記録されない場合が多いです。
httpログは完了したリクエストの結果を記録しますが、Slowloris攻撃はリクエストを完了させない攻撃であり、一般的なhttpログには記録されません。また、ネットワークトラフィックも少量であるため、トラフィック監視でも検知が困難です。
・どのような状態になるか
サーバーリソースを大量に消費させるため、サーバーが過負荷状態となります。また、ウェブの待ち受けを枯渇させるため新規のリクエストを受け付けられなくなり、システムがダウン状態となります。
・どうやってSlowloris攻撃と判断するか
以下の条件が揃っている場合、Slowloris攻撃の可能性が高いと思われます。
- サーバー負荷、待ち受けプロセス状況に対してネットワークトラフィックが極端に少ない
- ウェブサーバーの同時接続数を超えるアクセスがきている
- ウェブサーバーのタイムアウト設定を超えても切断されないコネクションが多数存在する
- リクエスト完了までにウェブサーバーのタイムアウト設定を超過しているログがある
- 実行中のhttpプロセス数に対してログ件数が少ない
Slowloris攻撃への対策
今回はApacheでできるSlowloris攻撃への対策をご紹介します。
Slowloris自体は昔から存在する手法なので、効果的な対策が多数開発されています
・同一IPアドレスからの同時接続数制限
Slowloris攻撃への対策としてLinuxのセキュリティ監査ツールのLynisに推奨されているmod_qosなどの利用が有効です。
同一IPアドレスからの同時接続数を明示的に制限します。DDoS攻撃の場合には効果はありません。
mod_qosをインストールします。
dnf install -y mod_qos
設定ファイルを作成します。
この設定例では、同一IPアドレスからの同時接続数を50件に制限しています。
/etc/httpd/conf.d/mod_qos.conf
<IfModule qos_module>
# qosで制御するリクエスト数の設定(デフォ50000)
QS_ClientEntries 10000
# IPアドレス単位で最大接続数を制限
QS_SrvMaxConnPerIP 50
# 最大接続数を超過したリクエストに503エラーを返す
QS_SrvMaxConnClose 503
</IfModule>
以上で設定完了です。
・リクエスト受信からリクエストヘッダー受信完了までの時間を制限する
Apache2.4の場合は /etc/httpd/conf.modules.d/00-base.conf でmod_reqtimeout.soが読み込まれていることを確認します。
LoadModule reqtimeout_module modules/mod_reqtimeout.so
/etc/httpd/conf/httpd.conf に以下の行を追記します。
この設定例ではリクエストヘッダーの受信タイムアウトを10秒に制限します。
リクエストボディに対して制限を設けることも可能です。
RequestReadTimeout header=10
この手法を採用する場合あまり短く設定してしまうと、逼迫した経路からのリクエストや、帯域を制限されている環境からのリクエストが制限対象となってしまう可能性がありますので、十分に検討した上で設定しましょう。
・同時接続数の増加
クラウド環境や仮想環境の場合、サーバーをスケールアップする事で同時接続数の上限を上げることで解消する場合もあります。しかし、攻撃による負荷は恒常的なものではありませんので対策としては適しておりません。上記の対策が難しい場合や緊急時対応にとどめます。
スペース・アイでのSlowloris攻撃発生事例
最後に弊社で運用しているシステムで実際にあったSlowloris攻撃の発生事例をご紹介させて頂きます。
・クラウドからオンプレミスへの移行により発覚
あるシステムをクラウドサービスからオンプレミス環境へ移行した際、切り替え完了から数分後にSlowloris攻撃が始まりました。
元々クラウドサービスで稼働していた頃から該当サーバー宛にSlowloris攻撃が行われていた可能性がありましたが、クラウドサービス側のセキュリティ設定により弾かれていたと思われます。クラウドベンダー領域で処理されておりサーバーまで攻撃が届いいなかったものが、環境が切り替わった際に顕現したものと推察されます。
Apacheにてリクエストヘッダーの受信タイムアウトを設定する事で対応しました。
・EC-CUBEを利用したECサイトへの攻撃
WordPressやEC-CUBEのようなメジャーなCMS(コンテンツ管理システム)は脆弱性が見つかった際に攻撃対象となるサイトが多く効率が良いため攻撃対象となりやすいと言われています。今回は単純なSlowloris攻撃でしたが弊社管理のEC-CUBEを使ったECサイトに対して攻撃がありました。
同時接続数の調整+同一IPアドレスからの同時接続数制限にて対応しました。
参考例として2点ご紹介しました。弊社では20年以上のシステム運営、管理ノウハウがあります。
設定の調整による対応や各種OSSによる対策、セキュリティアプライアンスの導入手など状況に適した様々なご提案が可能です。システムの運営、管理でお困りの際はお気軽にお問合せください!