Cloudflare導入前のご質問で、ログに関して説明して欲しいと言われることが多いため、ざっくり説明したいと思います。
HTTPリクエストのログを残すことはEnterpriseプランのみ対応しています。
ログの取得方法としてはLog Pull(別のサーバなどからCloudflareへログを取りに行く)と、Log Push(予め設定したい宛先と方式でログを送信する)があります。
RESTfull APIで取得する方式になりますが、go言語で書かれたログ取得コマンドラインツールがGitHubに公開されており、こちらも便利です
どんな項目が出力されますか?と聞かれることも多いのですが、ログをPullする際にどの項目が欲しいのかをユーザ自身が指定する必要があります。存在する全項目としては以下の通りです。
項目名 | 説明 |
---|---|
BotScore | BotManagementを使っている場合のボットスコア |
BotScoreSrc | 何を元にボットスコア計算したか |
CacheCacheStatus | キャッシュマッチ結果 |
CacheResponseBytes | キャッシュから返されたバイト数 |
CacheResponseStatus | キャッシュによって返されたHTTPステータスコード |
CacheTieredFill | 階層型キャッシュの使用有無 |
ClientASN | AS番号 |
ClientCountry | 国 |
ClientDeviceType | デバイスタイプ |
ClientIP | クライアントのIPアドレス |
ClientIPClass | IPクラス |
ClientRequestBytes | リクエストのバイト数 |
ClientRequestHost | リクエストされたホスト |
ClientRequestMethod | リクエストのHTTPメソッド |
ClientRequestPath | リクエストされたパス |
ClientRequestProtocol | リクエストのHTTPプロトコル |
ClientRequestReferer | HTTPリクエストリファラ |
ClientRequestURI | リクエストされたURI |
ClientRequestUserAgent | ユーザーエージェント |
ClientSSLCipher | SSL暗号化形式 |
ClientSSLProtocol | Client SSL(TLS)protocol, |
ClientSrcPort | ソースポート番号 |
ClientXRequestedWith | X-Requested-With HTTPヘッダの値 | EdgeColoCode | IATA空港コードに準じたエッジデータンセンターコード | EdgeColoID | エッジID |
EdgeEndTimestamp | 応答を終了したときのタイムスタンプ(ナノ秒) |
EdgePathingOp | リクエストに対してどのタイプの応答が発行されたか |
EdgePathingSrc | セキュリティチェックに基づいてリクエストがどのように分類されたか |
EdgePathingStatus | リクエストの処理を決定するためにどのデータが使用されたか |
EdgeRateLimitAction | ブロッキング規則によってとられる行動 |
EdgeRateLimitID | ブロック(禁止)またはシミュレートアクションをトリガしたレート制限ルールの内部ルールID |
EdgeRequestHost | エッジからオリジンへのリクエストのホストヘッダ |
EdgeResponseBytes | クライアントに返されたバイト数 |
EdgeResponseCompressionRatio | レスポンス圧縮率 |
EdgeResponseContentType | レスポンスのContent-Typeヘッダー値 |
EdgeResponseStatus | クライアントに返されたHTTPステータスコード |
EdgeServerIP | オリジンにリクエストを出しているエッジサーバーのIP |
EdgeStartTimestamp | リクエストを受信したタイムスタンプ |
FirewallMatchesActions | Firewallがとったアクション | FirewallMatchesRuleIDs | マッチしたRuleID | FirewallMatchesSources | マッチした機能またはリクエストのフィールド | OriginIP | オリジンサーバーのIP |
OriginResponseBytes | オリジンサーバーから返されたバイト数 |
OriginResponseHTTPExpires | コンテンツの有効期限日時 |
OriginResponseHTTPLastModified | コンテンツの最終更新日時 |
OriginResponseStatus | オリジンサーバから返されたステータス |
OriginResponseTime | エッジへ応答を返すために要した時間(ナノ秒) |
OriginSSLProtocol | オリジンへの接続に使用されるSSL(TLS)プロトコル |
ParentRayID | 親リクエストのレイID(このリクエストがワーカースクリプトを通じて行われた場合) |
RayID | リクエストのRay ID |
SecurityLevel | リクエスト時に設定されたセキュリティレベル (IPレピュテーションシステムの機密性を判断するために使用) |
WAFAction | WAFによって実行されるアクション |
WAFFlags | 追加の設定フラグ |
WAFMatchedVar | 一致した変数のフルネーム |
WAFProfile | WAFプロファイル |
WAFRuleID | 適用されたWAFルールのID |
WAFRuleMessage | トリガされたルールに関連付けられているメッセージ |
WorkerCPUTime | ワーカーの実行に費やした時間(マイクロ秒) |
WorkerStatus | デーモンから返されたステータス |
WorkerSubrequest | ワーカーのサブリクエストかどうか |
WorkerSubrequestCount | ワーカーによって発行されたサブリクエストの数 |
ZoneID | 内部ゾーンID |
項目名 | 説明 |
---|---|
Action | Firewallがとったアクション |
ClientASN | 送信元のAS番号 |
ClientASNDescription | AS番号に対するDescription |
ClientCountry | クライアントの国 |
ClientIP | クライアントのIPアドレス |
ClientIPClass | クライアントIPの分類(サーチエンジン、BadHost等) |
ClientRefererHost | Refererのホスト名 |
ClientRefererPath | Refererのパス |
ClientRefererQuery | Refererのクエリー部 |
ClientRefererScheme | RefererのURLスキーム |
ClientRequestHost | クライアントがリクエストしたホスト |
ClientRequestMethod | リクエストのメソッド |
ClientRequestPath | リクエストのパス |
ClientRequestProtocol | リクエストのプロトコル |
ClientRequestQuery | リクエストのクエリー部 |
ClientRequestScheme | リクエストのURLスキーム |
ClientRequestUserAgent | リクエストのUser-Agent値 |
Datetime | イベントの日時 |
EdgeColoCode | IATA空港コードに準じたエッジデータンセンターコード |
EdgeResponseStatus | クライアントに返されたレスポンスステータス |
Kind | イベントの種類(現在は「Firewall」のみ) |
MatchIndex | マッチしたRuleの何番目か |
Metadata | 各機能固有の追加情報 | OriginResponseStatus | オリジンサーバが返したレスポンスステータス | OriginatorRayID | Challenge/JSChallengeへの応答の場合の元のリクエストのRayID |
RayID | リクエストを一意に識別するID |
RuleID | このイベントを発行させた機能のRuleID |
Source | このイベントを発行させた機能 |
各種クラウドサービスへプッシュすることが可能です。Google Cloud Storage、Amazon S3、Microsoft Azure(Blob Storage)、Sumo Logicなどに対応しています。Log Pushの設定時に予め取得したい項目名を指定しておき、100,000レコードまたは30秒(何れか早い方)毎にクラウドサービスプロバイダーへログが送られます。
ログの分析については、Google Data Studio、Elastic、Looker、Splunk、Sumo Logic、Datadogなどへ取り込んで可視化するためのAppやテンプレートなどが提供されています。Google Cloudでの連携としては、以下の図のような例が示されています。Log PushでGoogle Cloud Storageへログを送信し、Google Cloud FunctionでBig Queryへインポート、Google Data Studioでインタラクティブなレポートを実行します。
Splunkの場合のは、例としてAmazon S3へPushし、SplunkのAppでS3から取得する方法が考えられます。
ログの形式はJSON形式で、フィールドの順序は保証されていません。また、多数のサーバで並列処理されているためだと思われますが各ログのタイムスタンプも数秒ほど前後することがありますので注意が必要です。ログ項目の中にRayIDというHTTPリクエストを一意に識別するIDがあり、これはHTTPヘッダーにも付与されていますのでオリジンサーバのログでも合わせて出力しておけばトラブルシューティングの際にCloudflareのログと突き合わせできて便利です。
執筆者:角田 貴寛
三井情報株式会社
ソリューション技術本部 次世代基盤第二技術部 第一技術室
CISSP、CCSP、CEH、CND
現在、セキュリティ関連調査研究・教育業務に従事