コンテンツにスキップ

統計サービス

WallarmのNGINXまたはNativeノードの統計は、wallarm_statusサービスで取得できます。本記事では、このサービスの設定方法と使用方法を説明します。

Nativeノードの統計サービス

Nativeノードでは、wallarm_statusは利用可能ではあるもののレガシーサービスです。主たるサービスはmetricsで、curl localhost:9000/metricsで利用できます(Nativeノードの設定にある"metrics"パラメータをご参照ください)。

セットアップ

重要

統計サービスは専用ファイルで設定し、他のNGINX設定ファイル内ではwallarm_statusディレクティブを使用しないことを強く推奨します。後者は安全でない可能性があるためです。wallarm-statusの設定ファイルは次の場所にあります:

  • オールインワンインストーラーの場合: /etc/nginx/wallarm-status.conf
  • その他のインストールの場合: /etc/nginx/conf.d/wallarm-status.conf

また、デフォルトのwallarm-status設定に含まれる既存の行は変更しないことを強く推奨します。

このディレクティブを使用すると、統計はJSON形式またはPrometheus互換形式で提供できます。使用方法:

wallarm_status [on|off] [format=json|prometheus];

Info

このディレクティブはserverおよび/またはlocationコンテキストで設定できます。

ほとんどのデプロイメントオプションではformatパラメータのデフォルト値はjsonです。例外はNGINXベースのDockerイメージで、コンテナ外部から/wallarm-statusエンドポイントを呼び出すと、Prometheus形式のメトリクスを返します。

デフォルト設定

デフォルトでは、フィルタノードの統計サービスは最も安全な設定になっています。/etc/nginx/conf.d/wallarm-status.conf(オールインワンインストーラーの場合は/etc/nginx/wallarm-status.conf)の設定ファイルは次のとおりです:

server {
  listen 127.0.0.8:80;
  server_name localhost;

  allow 127.0.0.8/8;   # フィルタノードサーバのループバックアドレスからのみアクセス可能です
  # NGINXベースのDockerコンテナで実行している場合:
  # allow 127.0.0.0/8;
  deny all;

  wallarm_mode off;
  disable_acl "on";   # リクエスト送信元のチェックは無効化され、denylistにあるIPでもwallarm-statusサービスへのリクエストが許可されます。 https://docs.wallarm.com/admin-en/configure-parameters-en/#disable_acl
  wallarm_enable_apifw off;
  access_log off;

  location /wallarm-status {
    wallarm_status on;
  }
}

統計の取得を許可するIPアドレスの制限

wallarm_statusディレクティブの設定時に、統計をリクエストできる送信元IPアドレスを指定できます。デフォルトでは、127.0.0.1::1のIPアドレスを除きアクセスは拒否され、Wallarmをインストールしたサーバからのみリクエストを実行できます。

別のサーバからのリクエストを許可するには:

  1. /etc/nginx/wallarm-status.confファイルで、許可したいサーバのIPアドレスを指定したallowディレクティブを設定に追加します。例:

    ...
    server_name localhost;
    
    allow 127.0.0.8/8;
    + allow 10.41.29.0;
    ...
    
  2. 設定を変更したら、NGINXを再起動して反映します:

    sudo systemctl restart nginx
    
    sudo service nginx restart
    
    sudo systemctl restart nginx
    
    sudo systemctl restart nginx
    
    sudo systemctl restart nginx
    
  • Dockerコンテナを環境変数のみを渡して実行している場合、許可するCIDRを環境変数WALLARM_STATUS_ALLOWで渡します。
  • Dockerコンテナを設定ファイルをマウントして実行している場合:

    1. 許可するアドレスをallowディレクティブで指定したwallarm-status.confファイルを準備します。例:

      server {
          listen 127.0.0.8:80;
      
          server_name localhost;
      
          allow 127.0.0.0/8;
      +    allow 10.41.29.0;
          deny all;
      
          wallarm_mode off;
          disable_acl "on";
          wallarm_enable_apifw off;
          access_log off;
      
          location ~/wallarm-status$ {
              wallarm_status on;
          }
      }
      
    2. コンテナを起動する際に、準備したファイルをコンテナ内の/etc/nginx/conf.d/wallarm-status.confへマウントします。

  1. /etc/nginx/conf.d/wallarm-status.confファイルで、許可したいサーバのIPアドレスを指定したallowディレクティブを設定に追加します。例:

    ...
    server_name localhost;
    
    allow 127.0.0.8/8;
    + allow 10.41.29.0;
    ...
    
  2. 設定を変更したら、NGINXを再起動して反映します:

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

統計サービスのIPアドレスやポートの変更

統計サービスのIPアドレスやポートを変更するには、以下の手順に従います。

  1. /etc/nginx/wallarm-status.confファイルを開き、listenディレクティブに新しいサービスアドレスを指定します。
  2. NGINXを再起動して変更を反映します:

    sudo systemctl restart nginx
    
    sudo service nginx restart
    
    sudo systemctl restart nginx
    
    sudo systemctl restart nginx
    
    sudo systemctl restart nginx
    
  • NGINXベースのDockerイメージで統計サービスのデフォルトポートのみを変更する場合は、NGINX_PORT変数に新しいポートを設定してコンテナを起動します。その他の変更は不要です。
  • 統計サービスのIPアドレスとポートの両方を変更する場合:

    1. listenディレクティブに新しいアドレスを指定したwallarm-status.confファイルを準備します:

      server {
          listen 127.0.0.8:80;
      
          server_name localhost;
      
          allow 127.0.0.8/8;
          # NGINXベースのDockerコンテナで実行している場合:
          # allow 127.0.0.0/8;
          deny all;
      
          wallarm_mode off;
          disable_acl "on";
          wallarm_enable_apifw off;
          access_log off;
      
          location ~/wallarm-status$ {
              wallarm_status on;
          }
      }
      
    2. コンテナを起動する際に、準備したファイルをコンテナ内の/etc/nginx/conf.d/wallarm-status.confへマウントします。

  1. /etc/nginx/conf.d/wallarm-status.confファイルを開き、listenディレクティブに新しいサービスアドレスを指定します。
  2. NGINXを再起動して変更を反映します:

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

フィルタノードのホストにSELinuxがインストールされている場合は、SELinuxを適切に設定するか、無効化してください。簡潔のため、本ドキュメントではSELinuxが無効であることを前提とします。

上記の設定を適用すると、ローカルのwallarm-status出力はリセットされることにご注意ください。

Prometheus形式で統計を取得する

ほとんどのデプロイメントオプションはデフォルトでJSON形式の統計を返します。NGINXベースのDockerイメージは例外で、コンテナ外部から/wallarm-statusエンドポイントを呼び出すと、Prometheus形式のメトリクスを返します。

JSONがデフォルトのノードデプロイメントからPrometheus形式の統計を取得するには:

  1. 次の設定を/etc/nginx/conf.d/wallarm-status.confファイル(オールインワンインストーラーの場合は/etc/nginx/wallarm-status.conf)に追加します:

    ...
    
    location /wallarm-status {
      wallarm_status on;
    }
    
    + location /wallarm-status-prometheus {
    +   wallarm_status on format=prometheus;
    + }
    
    ...
    

    デフォルトの/wallarm-status設定を削除・変更しないでください

    /wallarm-statusロケーションのデフォルト設定は削除や変更をしないでください。このエンドポイントの既定の動作は重要です。

  2. NGINXを再起動して変更を反映します:

    sudo systemctl restart nginx
    
    sudo service nginx restart
    
    sudo systemctl restart nginx
    
    sudo systemctl restart nginx
    
    sudo systemctl restart nginx
    
  3. 新しいエンドポイントを呼び出してPrometheusメトリクスを取得します:

    curl http://127.0.0.8/wallarm-status-prometheus
    

使用方法

フィルタノードの統計を取得するには、許可されたIPアドレスのいずれかからリクエストします(上記参照):

curl http://127.0.0.8/wallarm-status

結果として、次のようなレスポンスが得られます:

{
    "requests": 0,
    "streams": 0,
    "messages": 0,
    "attacks": 0,
    "blocked": 0,
    "blocked_by_acl": 0,
    "acl_allow_list": 0,
    "abnormal": 0,
    "tnt_errors": 0,
    "api_errors": 0,
    "requests_lost": 0,
    "overlimits_time": 0,
    "segfaults": 0,
    "memfaults": 0,
    "softmemfaults": 0,
    "proton_errors": 0,
    "time_detect": 0,
    "db_id": 73,
    "lom_id": 102,
    "custom_ruleset_id": 102,
    "custom_ruleset_ver": 51,
    "db_apply_time": 1598525865,
    "lom_apply_time": 1598525870,
    "custom_ruleset_apply_time": 1598525870,
    "proton_instances": {
        "total": 3,
        "success": 3,
        "fallback": 0,
        "failed": 0
    },
    "stalled_workers_count": 0,
    "stalled_workers": [],
    "ts_files": [
        {
        "id": 102,
        "size": 12624136,
        "mod_time": 1598525870,
        "fname": "/etc/wallarm/custom_ruleset"
        }
    ],
    "db_files": [
        {
        "id": 73,
        "size": 139094,
        "mod_time": 1598525865,
        "fname": "/etc/wallarm/proton.db"
        }
    ],
    "startid": 1459972331756458216,
    "timestamp": 1664530105.868875,
    "rate_limit": {
        "shm_zone_size": 67108864,
        "buckets_count": 4,
        "entries": 1,
        "delayed": 0,
        "exceeded": 1,
        "expired": 0,
        "removed": 0,
        "no_free_nodes": 0
    },
    "split": {
        "clients": [
        {
            "client_id": null,
            "requests": 78,
            "streams": 0,
            "messages": 0,
            "attacks": 0,
            "blocked": 0,
            "blocked_by_acl": 0,
            "overlimits_time": 0,
            "time_detect": 0,
            "applications": [
            {
                "app_id": 4,
                "requests": 78,
                "streams": 0,
                "messages": 0,
                "attacks": 0,
                "blocked": 0,
                "blocked_by_acl": 0,
                "overlimits_time": 0,
                "time_detect": 0
            }
            ]
        }
        ]
    }
}
curl http://127.0.0.8/wallarm-status-prometheus

アドレスは異なる場合があります。実際のアドレスは/etc/nginx/conf.d/wallarm-status.conf(オールインワンインストーラーの場合は/etc/nginx/wallarm-status.conf)でご確認ください。

結果として、次のようなレスポンスが得られます:

# HELP wallarm_requests リクエスト数
# TYPE wallarm_requests gauge
wallarm_requests 2
# HELP wallarm_streams リクエスト数
# TYPE wallarm_streams gauge
wallarm_streams 0
# HELP wallarm_messages リクエスト数
# TYPE wallarm_messages gauge
wallarm_messages 0
# HELP wallarm_attacks 攻撃リクエスト数
# TYPE wallarm_attacks gauge
wallarm_attacks 0
# HELP wallarm_blocked ブロックされたリクエスト数
# TYPE wallarm_blocked gauge
wallarm_blocked 0
# HELP wallarm_blocked_by_acl ACLによってブロックされたリクエスト数
# TYPE wallarm_blocked_by_acl gauge
wallarm_blocked_by_acl 0
# HELP wallarm_acl_allow_list allowlistにより許可されたリクエスト数
# TYPE wallarm_acl_allow_list gauge
wallarm_acl_allow_list 0
# HELP wallarm_abnormal 異常と判定されたリクエスト数
# TYPE wallarm_abnormal gauge
wallarm_abnormal 2
# HELP wallarm_tnt_errors wstore書き込みエラー数
# TYPE wallarm_tnt_errors gauge
wallarm_tnt_errors 0
# HELP wallarm_api_errors API書き込みエラー数
# TYPE wallarm_api_errors gauge
wallarm_api_errors 0
# HELP wallarm_requests_lost ロストしたリクエスト数
# TYPE wallarm_requests_lost gauge
wallarm_requests_lost 0
# HELP wallarm_overlimits_time overlimits_time回数
# TYPE wallarm_overlimits_time gauge
wallarm_overlimits_time 0
# HELP wallarm_segfaults セグメンテーションフォールトの回数
# TYPE wallarm_segfaults gauge
wallarm_segfaults 0
# HELP wallarm_memfaults 仮想メモリ上限到達イベント数
# TYPE wallarm_memfaults gauge
wallarm_memfaults 0
# HELP wallarm_softmemfaults リクエストメモリ上限到達イベント数
# TYPE wallarm_softmemfaults gauge
wallarm_softmemfaults 0
# HELP wallarm_proton_errors libprotonのメモリ以外の障害イベント数
# TYPE wallarm_proton_errors gauge
wallarm_proton_errors 0
# HELP wallarm_time_detect_seconds 検知に費やした時間
# TYPE wallarm_time_detect_seconds gauge
wallarm_time_detect_seconds 0
# HELP wallarm_db_id proton.dbファイルID
# TYPE wallarm_db_id gauge
wallarm_db_id 71
# HELP wallarm_lom_id LOMファイルID
# TYPE wallarm_lom_id gauge
wallarm_lom_id 386
# HELP wallarm_custom_ruleset_id カスタムルールセットファイルID
# TYPE wallarm_custom_ruleset_id gauge
wallarm_custom_ruleset_id{format="51"} 386
# HELP wallarm_custom_ruleset_ver カスタムルールセットのファイルフォーマットバージョン
# TYPE wallarm_custom_ruleset_ver gauge
wallarm_custom_ruleset_ver 51
# HELP wallarm_db_apply_time proton.dbファイルの適用時刻
# TYPE wallarm_db_apply_time gauge
wallarm_db_apply_time 1674548649
# HELP wallarm_lom_apply_time LOMファイルの適用時刻
# TYPE wallarm_lom_apply_time gauge
wallarm_lom_apply_time 1674153198
# HELP wallarm_custom_ruleset_apply_time カスタムルールセットファイルの適用時刻
# TYPE wallarm_custom_ruleset_apply_time gauge
wallarm_custom_ruleset_apply_time 1674153198
# HELP wallarm_proton_instances protonインスタンス数
# TYPE wallarm_proton_instances gauge
wallarm_proton_instances{status="success"} 5
wallarm_proton_instances{status="fallback"} 0
wallarm_proton_instances{status="failed"} 0
# HELP wallarm_stalled_worker_time_seconds libprotonでスタックしたworkerの時間
# TYPE wallarm_stalled_worker_time_seconds gauge
wallarm_stalled_worker_time_seconds{pid="3169104"} 25

# HELP wallarm_startid 一意の起動ID
# TYPE wallarm_startid gauge
wallarm_startid 3226376659815907920

利用可能なレスポンスパラメータは次のとおりです(Prometheusのメトリクスにはwallarm_プレフィックスが付きます):

  • requests: フィルタノードが処理したリクエスト数です。

  • streams(Wallarmリリース6.2.0以降で利用可能): 処理されたgRPC/WebSocketストリームの数です。

  • messages(Wallarmリリース6.2.0以降で利用可能): 処理されたgRPC/WebSocketメッセージの数です。

  • attacks: 記録された攻撃の数です。

  • blocked: denylistにあるIPからのリクエストを含む、ブロックされたリクエストの数です。

  • blocked_by_acl: denylistにある送信元によってブロックされたリクエストの数です。

  • acl_allow_list: allowlistにある送信元からのリクエスト数です。

  • abnormal: アプリケーションが異常と見なしたリクエストの数です。

  • tnt_errors: ポストアナリティクスモジュールで解析されなかったリクエストの数です。これらのリクエストについてはブロック理由は記録されますが、リクエスト自体は統計やふるまい検査にカウントされません。

  • api_errors: さらなる解析のためにAPIへ送信されなかったリクエストの数です。これらのリクエストにはブロックパラメータが適用されます(つまり、システムがブロッキングモードで動作している場合は不正なリクエストがブロックされます)が、これらのイベントのデータはUIには表示されません。このパラメータは、Wallarmノードがローカルのポストアナリティクスモジュールと連携している場合にのみ使用されます。

  • requests_lost: ポストアナリティクスモジュールで解析されずAPIへ転送されたリクエストの数です。これらのリクエストにはブロックパラメータが適用されます(つまり、システムがブロッキングモードで動作している場合は不正なリクエストがブロックされます)が、これらのイベントのデータはUIには表示されません。このパラメータは、Wallarmノードがローカルのポストアナリティクスモジュールと連携している場合にのみ使用されます。

  • overlimits_time: フィルタリングノードが検出した計算資源の過剰制限タイプの攻撃数です。

  • segfaults: workerプロセスの緊急終了を引き起こした問題の回数です。

  • memfaults: 仮想メモリの上限に達した問題の回数です。

  • softmemfaults: proton.db +lomの仮想メモリ上限を超過した問題の回数です(wallarm_general_ruleset_memory_limit)。

  • proton_errors: 仮想メモリ上限超過によるものを除く、proton.dbのエラー数です。

  • time_detect: リクエスト解析に要した総時間です。

  • db_id: proton.dbのバージョンです。

  • lom_id: まもなく廃止予定です。custom_ruleset_idを使用してください。

  • custom_ruleset_id: カスタムルールセットビルドのバージョンです。

    リリース4.8以降、Prometheus形式ではwallarm_custom_ruleset_id{format="51"} 386のように表示され、format属性内のcustom_ruleset_verがフォーマットバージョンで、メインの値がルールセットのビルドバージョンになります。

  • custom_ruleset_ver(Wallarmリリース4.4.3以降で利用可能): カスタムルールセットのフォーマットです:

  • db_apply_time: proton.dbファイルの最終更新のUnix時間です。

  • lom_apply_time: まもなく廃止予定です。custom_ruleset_apply_timeを使用してください。

  • custom_ruleset_apply_time: カスタムルールセットファイルの最終更新のUnix時間です。

  • proton_instances: ダウンロードされたproton.db + LOMのペアに関する情報です:

    • total: ペアの総数です。
    • success: Wallarm Cloudから正常にダウンロードされたペア数です。
    • fallback: バックアップディレクトリからダウンロードされたペア数です。これは、Cloudから最新のproton.db + LOMをダウンロードする際に問題があったものの、wallarm_fallbackディレクティブがonであるため、NGINXがバックアップディレクトリから古いバージョンのproton.db + LOMを読み込めたことを示します。
    • failed: 初期化に失敗したペア数です。つまり、NGINXがCloudおよびバックアップディレクトリのいずれからもproton.db + LOMをダウンロードできなかったことを意味します。wallarm_fallbackが有効でこれが発生した場合、Wallarmモジュールは無効化され、NGINXモジュールのみが動作します。原因調査にはNGINXのログを確認するか、Wallarmサポートへお問い合わせいただくことを推奨します。
  • stalled_workers_count: リクエスト処理の時間制限を超えたworkerの数です(制限はwallarm_stalled_worker_timeoutディレクティブで設定します)。

  • stalled_workers: リクエスト処理の時間制限を超えたworkerの一覧と、処理に費やした時間です(制限はwallarm_stalled_worker_timeoutディレクティブで設定します)。

  • ts_files: LOMファイルに関する情報です:

    • id: 使用中のLOMのバージョンです。
    • size: LOMファイルサイズ(バイト)です。
    • mod_time: LOMファイルの最終更新のUnix時間です。
    • fname: LOMファイルへのパスです。
  • db_files: proton.dbファイルに関する情報です:

    • id: 使用中のproton.dbのバージョンです。
    • size: proton.dbファイルサイズ(バイト)です。
    • mod_time: proton.dbファイルの最終更新のUnix時間です。
    • fname: proton.dbファイルへのパスです。
  • startid: フィルタノードのランダムに生成された一意のIDです。

  • timestamp: 直近の受信リクエストがノードで処理された時刻です(Unix Timestamp形式)。

  • rate_limit: Wallarmのレート制限モジュールに関する情報です:

    • shm_zone_size: Wallarmのレート制限モジュールが消費できる共有メモリの総量(バイト)です(wallarm_rate_limit_shm_sizeディレクティブを基に決まり、デフォルトは67108864です)。
    • buckets_count: バケットの数です(通常はNGINXのworker数に等しく、最大は8です)。
    • entries: 制限を計測する一意のリクエストポイント値(キー)の数です。
    • delayed: burst設定によりレート制限モジュールがバッファしたリクエスト数です。
    • exceeded: 上限超過によりレート制限モジュールが拒否したリクエスト数です。
    • expired: 60秒ごとの定期的な処理で、制限を超過しなかったキーがバケットから削除された累計数です。
    • removed: バケットから突発的に削除されたキーの数です。もし値がexpiredより大きい場合は、wallarm_rate_limit_shm_sizeの値を増やしてください。
    • no_free_nodes: 0以外の値は、レート制限モジュールに割り当てたメモリが不足していることを示します。wallarm_rate_limit_shm_sizeの値を増やすことを推奨します。
  • split.clients: 各テナントの主要統計です。マルチテナンシー機能が有効でない場合、統計は唯一のテナント(お客様のアカウント)に対して返され、"client_id":nullという固定値になります。

  • split.clients.applications: 各アプリケーションの主要統計です。このセクションに含まれていないパラメータは、すべてのアプリケーションに関する統計を返します。

すべてのカウンタのデータは、NGINXの起動時点から累積されます。既存のNGINXがあるインフラにWallarmを導入した場合は、統計の収集を開始するためにNGINXサーバを再起動する必要があります。