コンテンツにスキップ

フィルタリングノードのログの操作

本記事では、Wallarmフィルタリングノードのログファイルの場所を確認する方法を説明します。

ログファイルは/opt/wallarm/var/log/wallarmディレクトリにあります。以下に、存在するログファイルと各ファイルに含まれる情報の概要を示します。

  • api-firewall-out.log: API specification enforcementのログです。

  • appstructure-out.log(Dockerコンテナでのみ): API Discoveryモジュールの動作ログです。

  • wstore-out.log(NGINX Node 5.x and earlierではtarantool-out.log): postanalyticsモジュールの動作ログです。

  • wcli-out.log: ブルートフォース検知、Cloudへの攻撃エクスポート、Cloudとのノード同期状況など、大半のWallarmサービスのログです。

  • supervisord-out.log: サービスの起動、ステータス変更、警告など、Supervisorのプロセス管理に関するログです。

  • go-node.log: Native Nodeのログです。

NGINX‑ベースのフィルタノードの拡張ロギングの設定

NGINXは処理済みリクエスト(アクセスログ)のログを、既定のcombinedロギングフォーマットを使用して別のログファイルに書き込みます。

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $request_id $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent" ';

必要に応じて他のNGINX変数と同様に、1つ以上のフィルタノード変数を含めたカスタムのロギングフォーマットを定義して使用できます。NGINXのログファイルからフィルタノードの診断をより迅速に実施できるようになります。

フィルタノード変数

NGINXのロギングフォーマットを定義する際に、以下のフィルタノード変数を使用できます。

名前
request_id String リクエスト識別子
値の形式は次のとおりです: a79199bcea606040cc79f913325401fb
wallarm_request_cpu_time Float フィルタリングノードが動作するマシンのCPUがリクエスト処理に費やした時間(秒)。
wallarm_request_mono_time Float CPUがリクエスト処理に費やした時間+キュー内での待機時間(秒)。例えば、リクエストがキューで3秒待機し、CPUで1秒処理された場合は、次のとおりです:
  • "wallarm_request_cpu_time":1
  • "wallarm_request_mono_time":4
wallarm_serialized_size Integer シリアライズされたリクエストのサイズ(バイト)。
wallarm_is_input_valid Integer リクエストの正当性
0 - リクエストは有効です。リクエストはフィルタノードで検査され、LOMルールに一致しています。
1 - リクエストは無効です。リクエストはフィルタノードで検査され、LOMルールに一致していません。
wallarm_attack_type_list String リクエストで検出された攻撃タイプ。タイプはテキスト形式で示されます:
  • xss
  • sqli
  • rce
  • xxe
  • ptrav
  • crlf
  • redir
  • nosqli
  • infoleak
  • overlimit_res
  • data_bomb
  • vpatch
  • ldapi
  • scanner
  • mass_assignment
  • ssrf
  • ssi
  • mail_injection
  • ssti
  • invalid_xml
  • file_upload_violation
  • API仕様違反:
    • undefined_endpoint
    • undefined_parameter
    • missing_auth
    • missing_parameter
    • invalid_parameter_value
    • invalid_request
    • processing_overlimit
  • blocked_source
  • GraphQL攻撃:
    • gql_aliases
    • gql_debug
    • gql_depth
    • gql_doc_size
    • gql_docs_per_batch
    • gql_introspection
    • gql_value_size
  • トリガーに基づく攻撃(オリジンがトリガーによりdenylistまたはgraylistに入れられた場合にのみ返されるタイプ):
  • API Abuse(モジュールがオリジンをdenylistまたはgraylistに入れた場合にのみ返されるタイプ):
    • bot
    • api_abuse
    • account_takeover
    • security_crawlers
    • scraping
    • resource_consumption
  • credential_stuffing
1つのリクエストで複数の攻撃タイプが検出された場合は、記号|で連結されます。例えばXSSとSQLiが検出された場合、変数の値はxss|sqliです。
wallarm_attack_type Integer リクエストで検出された攻撃タイプ。タイプはビット列形式で示されます:
  • 0x00000000 - no attack - "0"
  • 0x00000002 - xss - "2"
  • 0x00000004 - sqli - "4"
  • 0x00000008 - rce - "8"
  • 0x00000010 - xxe - "16"
  • 0x00000020 - ptrav - "32"
  • 0x00000040 - crlf - "64"
  • 0x00000080 - redir - "128"
  • 0x00000100 - nosqli - "256"
  • 0x00000200 - infoleak - "512"
  • 0x20000000 - overlimit_res - "536870912"
  • 0x40000000 - data_bomb - "1073741824"
  • 0x80000000 - vpatch - "2147483648"
  • 0x00002000 - ldapi - "8192"
  • 0x4000 - scanner - "16384"
  • 0x20000 - mass_assignment - "131072"
  • 0x80000 - ssrf - "524288"
  • 0x02000000- ssi - "33554432"
  • 0x04000000 - mail_injection - "67108864"
  • 0x08000000 - ssti - "134217728"
  • 0x10000000 - invalid_xml - "268435456"
  • 0x8000000000000- file_upload_violation - 2251799813685248
  • API悪用(bot攻撃):
    • 0x10000000000000 - resource_consumption - 4503599627370496
  • API仕様違反:
    • 0x100000000 - undefined_endpoint - "4294967296"
    • 0x200000000 - undefined_parameter - "8589934592"
    • 0x400000000- missing_auth - "17179869184"
    • 0x800000000- missing_parameter - "34359738368"
    • 0x1000000000 - invalid_parameter_value - "68719476736"
    • 0x2000000000 - invalid_request - "137438953472"
    • 0x4000000000 - processing_overlimit - "274877906944"
  • 0x100000 - blocked_source - "1048576"
  • GraphQL攻撃:
    • 0x20000000000 - gql_aliases - "2199023255552"
    • 0x200000000000 - gql_debug - "35184372088832"
    • 0x8000000000 - gql_depth - "549755813888"
    • 0x40000000000 - gql_doc_size - "4398046511104"
    • 0x80000000000 - gql_docs_per_batch - "8796093022208"
    • 0x100000000000 - gql_introspection - "17592186044416"
    • 0x10000000000 - gql_value_size - "1099511627776"
  • トリガーに基づく攻撃(オリジンがトリガーによりdenylistまたはgraylistに入れられた場合にのみ返されるタイプ):
    • 0x400 - brute - "1024"
    • 0x800 - dirbust - "2048"
    • 0x10000 - bola - "65536"
    • 0x400000 - vectors - "4194304"
  • API Abuse(モジュールがオリジンをdenylistまたはgraylistに入れた場合にのみ返されるタイプ):
    • 0x8000 - bot - "32768"
    • 0x200000 - api_abuse - "2097152"
    • 0x400000000000 - account_takeover - "70368744177664"
    • 0x800000000000 - security_crawlers - "140737488355328"
    • 0x1000000000000 - scraping - "281474976710656"
  • 0x1000000 - credential_stuffing - "16777216"
1つのリクエストで複数の攻撃タイプが検出された場合は、値が加算されます。例えばXSSとSQLiが検出された場合、変数の値は6です。
wallarm_attack_point_list (NGINXノード5.2.1以降) String 悪意のあるペイロードを含むリクエストのポイントを列挙します。1つのポイントが複数のパーサーで順次処理される場合、それらすべてが値に含まれます。複数のポイントに悪意のあるペイロードが含まれる場合は、|で連結されます。
例: [post][json][json_obj, 'data'][base64]は、JSONのdataボディパラメータに含まれるbase64エンコードされた悪意のあるペイロードを示します。
このログデータは、Wallarm Console UIに表示される簡略化されたユーザーフレンドリーな表示と異なる場合があります。
wallarm_attack_stamp_list (NGINXノード5.2.1以降) String リクエストで検出された各攻撃シグンの内部Wallarm IDを列挙します。複数のシグンIDは|で連結されます。同一の攻撃シグンが複数の解析段階で検出された場合、IDが重複することがあります。例えば、union+select+1のようなSQLi攻撃では、複数回の検出を示す7|7が返ることがあります。
このログデータは、Wallarm Console UIに表示される簡略化されたユーザーフレンドリーな表示と異なる場合があります。
wallarm_block_reason (NGINXノード6.4.0以降) String ブロック理由(該当する場合)。理由はテキスト形式で示されます:
  • not blocked - リクエストはブロックされませんでした(例: allowlisted IPから送信された場合)。
  • antibot - リクエストはAPI Abuse Preventionモジュールによりブロックされました。
  • attack mask=<MASK> - 攻撃が検出されました。MASKは攻撃タイプを表すビット列です(例: mask=0000000000000020はptrav攻撃を示します)。すべての攻撃タイプは上記のwallarm_attack_typeセクションに記載されています。
  • overlimit - マスク内でresource overlimit攻撃が検出されました。
  • acl blacklist SRC TYPE - denylistに登録されたリクエストソースが原因でリクエストがブロックされました。可変部分には次の値が入ります:
      SRC:
      • ip
      • country
      • proxy
      • datacenter
      • tor
    • TYPE:
      • blocked_source
      • brute
      • dirbust
      • bola
      • bot
      • api_abuse
      • vectors
      • account_takeover
      • security_crawlers
      • scraping
      • resource_consumption
      • session_anomaly
      • enum
      • rate_limit
      • query_anomaly
      • ai_prompt_injection
      • ai_prompt_retrieval

設定例

wallarm_combinedという名前の拡張ロギングフォーマットを定義し、次の変数を含めるとします。

  • combinedフォーマットで使用されているすべての変数

  • すべてのフィルタノード変数

この場合、次の手順を実行します。

  1. 以下の行は目的のロギングフォーマットを示します。NGINX構成ファイルのhttpブロックに追加します。

    log_format wallarm_combined '$remote_addr - $remote_user [$time_local] '
                                '"$request" $request_id $status $body_bytes_sent '
                                '"$http_referer" "$http_user_agent" '
                                '$wallarm_request_cpu_time $wallarm_request_mono_time $wallarm_serialized_size $wallarm_is_input_valid $wallarm_attack_type $wallarm_attack_type_list $wallarm_attack_point_list $wallarm_attack_stamp_list';
    
  2. 同じブロックに次のディレクティブを追加して、拡張ロギングフォーマットを有効にします。

    access_log /var/log/nginx/access.log wallarm_combined;

    処理済みリクエストのログは、/var/log/nginx/access.logファイルにwallarm_combinedフォーマットで書き込まれます。

    条件付きロギング

    上記のディレクティブでは、攻撃に関連しないものを含め、すべての処理済みリクエストがログファイルに記録されます。

    条件付きロギングを設定して、攻撃の一部であるリクエスト(これらのリクエストではwallarm_attack_type変数の値がゼロではありません)のみを記録することもできます。その場合は、前述のディレクティブに条件を追加します: access_log /var/log/nginx/access.log wallarm_combined if=$wallarm_attack_type;

    ログファイルのサイズを抑えたい場合や、フィルタノードをSIEMソリューションのいずれかと連携する場合に役立ちます。

  3. 使用しているOSに応じて、次のいずれかのコマンドを実行してNGINXを再起動します。

    sudo systemctl restart nginx
    
    sudo service nginx restart
    
    sudo systemctl restart nginx
    
    sudo systemctl restart nginx
    
    sudo systemctl restart nginx
    

詳細情報

NGINXでのロギング設定の詳細は、このリンクをご覧ください。