Cloudflare Docs
Support
Support
Visit Support on GitHub
Set theme to dark (⇧+D)

Cloudflare Logs (ELS)を使用して、DDoSトラフィックを調べる(Enterpriseプランのみ)

Cloudflare Longs(旧ELS)を効果的にそーとして、悪意のあるトラフィックのソースを特定する方法を説明します。

​​ 本記事の内容


​​ 概要

Cloudflare Logs(旧ELS)では、DDoS攻撃と関連するパターンを示している可能性があるトラフィックの分析に役に立つデータへのアクセスができます。Cloudflare Logs のデータをソートすることで、この種類の分析ができます。始めるにあたり、次で説明されている手順に従い、作業の流れ(例)を確認してください。

この手順を始める前に、必要となるもの:


​​ Step 1:Cloudflare Logsを紹介する前に、必要な情報を収集

次の情報を収集してください:

  1. Zone管理者のemail アドレス
  2. Zone ID (概要(Overview)>Zone IDの順で見つけられます)
  3. クライアントAPIキー
  4. 開始時間(例:1529171100)
  5. 終了時間(例:1529171100)

​​ Step 2: ログをダウンロードし、保存

Cloudflareのエンドポイントには1時間のSWATH制限があり、ログのファイルサイズはリクエスト一つに対して1GB未満でなければなりません。ファイルサイズが1GBを超える場合は、リクエストを受けた時間から記録されたイベントを含まないとしても、ダウンロードが1GBになったところで遮断されます。ログの切り捨て処理を避けるために、1時間から45分に時間を短縮し、ログのファイルサイズが1GB未満になるまで続けます。

​​ オプション 1:

Cloudflare Logsから「全て」のフィールドをダウンロードし、els.txtに保存します:

テンプレート:

curl -sv -o els.txt -H "X-Auth-Email: email" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received?start=starttime&end=endtime&fields=(curl -s -H "X-Auth-Email: email" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received/fields" | jq '. | to_entries[] | .key' -r | paste -sd "," -)"

例(値を含む):

curl -sv -o els.txt -H "X-Auth-Email: monkey@bannana.com" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/5b5f0xxxcbfbaxxxxxx0416d22f7b/logs/received?start=1529171100&end=1529171100&fields=(curl -s -H "X-Auth-Email: monkey@bannana.com" -H "X-Auth-Key: api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received/fields" | jq '. | to_entries[] | .key' -r | paste -sd "," -)"

​​ オプション 2:

Cloudflare Logsから「特定」のフィールドをダウンロードして、els.txtを保存します:

このコマンドには、リクエストした次のフィールドだけが含まれます: CacheCacheStatus, CacheResponseBytes, CacheResponseStatus, CacheTieredFill, ClientASN

Cloudflare Logsフィールドの全リストは、 こちらでご覧ください。テンプレート:

curl -sv -o els.txt-H "X-Auth-Email:email" -H "X-Auth-Key:api key" "https://api.cloudflare.com/client/v4/zones/zone id/logs/received?start=starttime&end=endtime&fields=CacheCacheStatus,CacheResponseBytes,CacheResponseStatus,CacheTieredFill,ClientASN”

例(値を含む):

curl -sv -o els.txt-H "X-Auth-Email:monkey@bannana.com" -H "X-Auth-Key:api key" "https://api.cloudflare.com/client/v4/zones/xx5x0xxxc45baxxxxxx0x6d23fxx/logs/received?start=1529171100&end=1529171100&fields=CacheCacheStatus,CacheResponseBytes,CacheResponseStatus,CacheTieredFill,ClientASN”

​​ Step 3: ログのソート

ログをフィールド値でソートし、ファイルに出力します。

  • HTTP 200 レスポンスでソートし、els-200.txtというファイルに出力します。
~$ cat els.txt| grep ":200," > els-200.txt
  • HTTP 525 レスポンスでソートし、els-525.txtというファイルに出力します。
~$ cat els.txt| grep ":525," > els-525.txt

​​ フィールド値の「:525,」はどこから来たのですか?

:525,(コロン、ステータスコード、カンマ)というパターンは、_EdgeResponseStatus_フィールドに固有のものです。コロンと末尾のカンマがないHTTPステータスコード「525」を検索すると、_EdgeStartTimeStamp_のような他のフィールドに _525_がついたログエントリを含むということになります。例えば、数字が長かったり、数値列「525」を含むこともあります。

EdgeResponseStatusフィールドが強調表示された出力ファイルのスクリーンショット

出力ファイル(els-200.txt と els-525.txt)はそのままで読み取りができる状態ではありません。読みやすい形式で表示するために、jqを次のコマンドで使います。

~$ cat els-525.txt | jq '.'

​​ フィールドでリクエストをカウントし、ファイルに出力する

この例では、SSLプロトコルバージョンでリクエストをカウントします。このバージョンはCloudflare Logs(下記のフィールド名以前の期間に注意してください)の_ClientSSLProtocol_ フィールドで示されています。

~$ jq -r .ClientSSLProtocol els-200.txt |sort -n |uniq -c |sort -n > ClientSSLProtocol.txt
~$ cat ClientSSLProtocol.txt

​​ 出力(例):

ELSログをソートする際の出力例のスクリーンショット

 ClientRequestURI、 ClientIP、ClientRequestUserAgent、ClientCountry、_ClientRequestHost_フィールドは通常、こうしたログで攻撃パターンを見つける際に最も役に立つフィールドです。

  • ClientRequestUserAgent でソートすると、ユーザーエージェントによるブロックルールが設定できます。
  • ClientCountry でソートすると、国別でファイアウォールルールが設定できます。
  • ClientRequestURI でソートすると、リクエスト数が最も多いページに対してレート制限の設定ができるようになります。

​​ 作業の流れ(例)

多くの場合、攻撃ソースを分析および特定するために、多くのフィールドでソートする必要があります。例えば、次に示される作業の流れをご覧ください:

Action 1: HTTP 200 レスポンスでダウンロードしたCloudflare ログをソートし、els-200.txt.に出力します。

理由:Cloudflareで、すでにブロックされているレスポンスに興味はないはずです。つまり、HTTPレスポンス 503 または _403_を発生させるリクエストなのです。当社のエッジで_200 HTTP_が発生するリクエストがCloudflareでブロックされていて、アセットがCloudflareのエッジでキャッシュされない場合、オリジンまでずっと進む可能性があります。悪意がある場合、こうしたリクエストは、オリジンに過負荷となるようにデザインされています。

方法

~$ cat els.txt | grep ":200," > els-200.txt

Action 2: URIで「HTTP 200のみ」ソートし、els-200-URI.txtに出力します。

理由:200レスポンスのなかで、最もリクエストされるページが見たいからです。方法

上位のURIを見つける:

~$ jq -r .ClientRequestURI els-200.txt |sort -n |uniq -c |sort -n > els-200-top-URIs.txt
~$ cat els-200-top-URIs.txt

URIをこのリストから選び、URIで自身のファイルにログエントリを出力します。これをするには、次のコマンドを選択したURIを使って次のコマンドを_/ClientRequestURI/path/to/something/_に置き換えます:

~$ cat els-200.txt| grep "/ClientRequestURI/path/to/something/" > els-200-URI-1.txt

Action 3:IPアドレスで、URI特定の「HTTP 200のみ」レスポンスをカウントし、els-200-URI-1-Top-IP.txtに出力します

理由: URIをリクエストし、200レスポンスになるトップIPアドレスを表示するため。

方法:

~$ jq -r .ClientIP els-200-URI-1.txt |sort -n |uniq -c |sort -n > els-200-URI-1-Top-IP.txt

ファイルのコンテンツを出力する:

~$ cat els-200-URI-1-Top-IP.txt

リクエストURIとこうしたURIをリクエストするIPで、200 HTTPSレスポンスを絞り込むことができます。トップIPアドレスでログエントリーを絞り込みながら、その逆のソートもできます。そして、どのURIがIPアドレスで最もリクエストされるかも確認できます。