Datadog Agent またはデータセキュリティ向けトレーサーを構成する

概要

Datadog で収集しているパフォーマンスデータおよびトレースには、除外、難読化、フィルタリング、修正したり、収集しないことを選択したりするべき機密情報が含まれることがあります。さらに、エラー数が不正確にカウントされたり、サービスの正常性が Datadog で正確にされないという問題の原因となるシンセティックトラフィックを含む場合もあります。

Datadog Agent および一部のトレーシングライブラリには、このような状況に対応してスパンを修正または破棄するオプションが用意されています。その他さまざまなオプションは、下記をご参照ください。トレーサーおよび Agent を構成しセキュリティ要件を満たすための一般的な方法をご紹介しています。

ご希望の調整ニーズが記載されていない場合は、Datadog サポートチームまでお問い合わせください。

リソース名の一般化とベースラインのフィルタリング

Datadog では、スパンに標準としてのフィルターメカニズムを実行し、基本的なセキュリティに対する正当なデフォルトと、分析中のグループ化のためのリソース名の生成を提供します。具体的には:

  • 環境変数は Agent によって収集されません。

  • プリペアドステートメントを使用しない場合でも、SQL 変数は難読化されます。たとえば、SELECT data FROM table WHERE key=123 LIMIT 10 という sql.query 属性は、変数が難読化されて、SELECT data FROM table WHERE key = ? LIMIT ? というリソース名になります。

  • SQL strings are identified using standard ANSI SQL quotes (SQL 文字列は、標準的な ANSI SQL 引用符**を使用して識別されます): これは、文字列はシングルクォート (') で囲まなければならないことを意味します。SQL の種類によっては、オプションで文字列のダブルクォート(")をサポートしていますが、ほとんどの場合、ダブルクォートされたものは識別子として扱われます。Datadog の難読化ツールは、これらを文字列ではなく識別子として扱い、難読化を行いません。

  • リソース名 (リクエスト URL など) 内の数字は難読化されます。たとえば、次の elasticsearch 属性:

    Elasticsearch : {
        method : GET,
        url : /user.0123456789/friends/_count
    }
    

    は、URL 内の数字が難読化されて、GET /user.?/friends/_count というリソース名になります。

Agent トレースの難読化

Agent トレースの難読化は、デフォルトで無効になっています。トレースに付加された情報を難読化するには、datadog.yaml コンフィギュレーションファイルで難読化を有効にする必要があります。

このオプションは、以下のサービスでご利用いただけます。

  • mongodb
  • elasticsearch
  • redis
  • memcached
  • http
  • remove_stack_traces

注: 複数のタイプのサービスに、同時に自動スクラビングを使用することができます。datadog.yaml ファイルの obfuscation セクションでそれぞれを構成します。.

mongodb タイプのスパン(具体的には mongodb.query スパンタグ)に適用するには、次のように構成します。

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    # MongoDB 難読化規則。"mongodb" タイプのスパンに適用。
    # 具体的には、"mongodb.query" タグ。
    mongodb:
      enabled: true
      # ここにリストされたキーの値は難読化されません。
      keep_values:
        - document_id
        - template_id
  • keep_values - Agent トレースの難読化から除外するキーのセットを定義します。

elasticsearch タイプのスパン(具体的には elasticsearch.body スパンタグ)に適用するには、次のように構成します。

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    # ElasticSearch 難読化規則。"elasticsearch" タイプのスパンに適用。
    # 具体的には、"elasticsearch.body" タグ。
    elasticsearch:
      enabled: true
      # ここにリストされたキーの値は難読化されません。
      keep_values:
        - client_id
        - product_id

redis タイプのスパン(具体的には redis.raw_command スパンタグ)に適用するには、次のように構成します。

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    redis:
      enabled: true

memcached タイプのスパン(具体的には memcached.command スパンタグ)に適用するには、次のように構成します。

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    memcached:
      enabled: true

http タイプのスパンでは、http.url メタデータに以下の HTTP 難読化規則が適用されます。

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    http:
      remove_query_string: true
      remove_paths_with_digits: true
  • remove_query_string: true に設定すると、URL に含まれるクエリ文字列が難読化されます。
  • remove_paths_with_digits: true に設定すると、数字を含む URL のパスセグメントが “?” で置換されます。

remove_stack_traces パラメーターを true に設定すると、スタックトレースが削除され、"?" で置換されます。

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    remove_stack_traces: true

収集した HTTP データ

Datadog は、サポートされているトレーシングライブラリ間で、Web スパン用に収集されるタグを標準化しています。これらのタグの収集が実装されているかどうかは、ライブラリのリリースノートを確認してください。完全に標準化されたライブラリの場合、スパンタグのセマンティクスを参照してください。

URL のクエリを編集する

http.url タグには、クエリ文字列を含む完全な URL 値が割り当てられます。クエリ文字列は機密データを含む可能性があるため、デフォルトで Datadog はこれをパースし、疑わしい値を削除します。この編集プロセスは構成可能です。編集に使われる正規表現を変更するには、DD_TRACE_OBFUSCATION_QUERY_STRING_REGEXP 環境変数に有効な正規表現を設定します。有効な正規表現はプラットフォームに依存します。この正規表現は疑わしいキーと値のペアを見つけると、それを <redacted> に置き換えます。

クエリ文字列を収集したくない場合は、環境変数 DD_HTTP_SERVER_TAG_QUERY_STRINGfalse に設定します。デフォルトは true です。

ルートスパンにヘッダータグを適用する

トレースヘッダータグを収集するには、 DD_TRACE_HEADER_TAGS 環境変数に、大文字小文字を区別しないヘッダーキーとタグ名のマップを設定します。ライブラリは、マッチするヘッダー値をルートスパンのタグとして適用します。この設定は、例えば、指定されたタグ名のないエントリーを受け入れることもできます。

DD_TRACE_HEADER_TAGS=CASE-insensitive-Header:my-tag-name,User-ID:userId,My-Header-And-Tag-Name

ログの機密スパンのスクラビング

スパンのタグから機密データをスクラブするには、datadog.yaml コンフィギュレーションファイルreplace_tags 設定、または DD_APM_REPLACE_TAGS 環境変数を使用します。設定または環境変数の値は、タグ内で機密データの置換方法を指定するパラメーターグループの一覧です。パラメーターは以下のとおりです。

  • name: 置換するタグのキー。すべてのタグを照合するには、* を使用します。リソースを照合するには、resource.name を使用します。
  • pattern: 照合対象の正規表現パターン。
  • repl: 置換文字列。

例:

apm_config:
  replace_tags:
    # タグ "http.url" 内で、文字列 `token/` で始まるすべての文字を "?" で置換します
    - name: "http.url"
      pattern: "token/(.*)"
      repl: "?"
    # リソース名の末尾の "/" 文字を削除します
    - name: "resource.name"
      pattern: "(.*)\/$"
      repl: "$1"
    # "bar" を持つタグに存在するすべての "foo" を置換します
    - name: "*"
      pattern: "foo"
      repl: "bar"
    # すべての "error.stack" タグの値を削除します
    - name: "error.stack"
      pattern: "(?s).*"
    # エラーメッセージの連番を置換します
    - name: "error.msg"
      pattern: "[0-9]{10}"
      repl: "[REDACTED]"
DD_APM_REPLACE_TAGS=[
      {
        "name": "http.url",
        "pattern": "token/(.*)",
        "repl": "?"
      },
      {
        "name": "resource.name",
        "pattern": "(.*)\/$",
        "repl": "$1"
      },
      {
        "name": "*",
        "pattern": "foo",
        "repl": "bar"
      },
      {
        "name": "error.stack",
        "pattern": "(?s).*"
      },
      {
        "name": "error.msg",
        "pattern": "[0-9]{10}",
        "repl": "[REDACTED]"
      }
]

この環境変数は、daemonset configuration を使用している場合は trace-agent コンテナに、helm chart を使用している場合は values.yaml ファイル内の agents.containers.traceAgent.env に記述してください。

- name: DD_APM_REPLACE_TAGS
  value: '[
            {
              "name": "http.url",
              "pattern": "token/(.*)",
              "repl": "?"
            },
            {
              "name": "resource.name",
              "pattern": "(.*)\/$",
              "repl": "$1"
            },
            {
              "name": "*",
              "pattern": "foo",
              "repl": "bar"
            },
            {
              "name": "error.stack",
              "pattern": "(?s).*"
            },
            {
              "name": "error.msg",
              "pattern": "[0-9]{10}",
              "repl": "[REDACTED]"
            }
          ]'
- DD_APM_REPLACE_TAGS=[{"name":"http.url","pattern":"token/(.*)","repl":"?"},{"name":"resource.name","pattern":"(.*)\/$","repl": "$1"},{"name":"*","pattern":"foo","repl":"bar"},{"name":"error.stack","pattern":"(?s).*"}, {"name": "error.msg", "pattern": "[0-9]{10}", "repl": "[REDACTED]"}]

リソースを収集から除外

特定のリソースをトレースしないオプションに関する詳しい概要については、不要なリソースを無視するをご参照ください。

サービスに、ヘルスチェックなどシミュレーショントラフィックが含まれる場合、このようなトレースの収集を除外して、サービスのメトリクスが本番トラフィックと一致するようにすることが望ましい場合があります。

そこで、Agent により Datadog に送信されるトレースから、特定のリソースを除外するように Agent を設定できます。特定のリソースが送信されないようにするには、datadog.yaml ファイルの ignore_resources 設定を使用します。そして、1 つ以上の正規表現のリストを作成し、リソース名に基づき Agent で除外するリソースを指定します。

コンテナ化された環境で実行している場合は、代わりに Datadog Agent を使用してコンテナに DD_APM_IGNORE_RESOURCES を設定します。詳細については、Docker APM Agent 環境変数をご参照ください。

## @param ignore_resources - 文字列のリスト - オプション
## リソース名に基づいて特定のトレースを除外するために、正規表現のリストを指定できます。
## すべてのエントリは二重引用符で囲み、カンマで区切る必要があります。
# ignore_resources: ["(GET|POST) /healthcheck","API::NotesController#index"]

トレースを Agent API に直接送信

特定のアプリケーション用にカスタマイズされたインスツルメンテーションが必要な場合は、Agent 側のトレース API を使用して、トレースに含めるスパンを個別に選択することを検討してください。詳細については、API に関するドキュメントを参照してください。

Datadog トレーサーでスパンを修正

このページでは、データが Datadog Agent に到達してから修正する方法について説明していますが、一部のトレーシングライブラリは拡張可能です。カスタムポストプロセッサーを作成してスパンをインターセプトし、適宜 (正規表現マッチなどに基づき) 調整または破棄することが可能です。詳細は、ご希望の言語で「カスタムインスツルメンテーション」ドキュメントをご参照ください。

テレメトリーの収集

Datadog は、お客様のトレーシングライブラリに関する環境情報や診断情報を収集して処理することがあります。これには、アプリケーションを実行しているホスト、オペレーティングシステム、プログラミング言語とランタイム、使用する APM インテグレーション、およびアプリケーションの依存関係に関する情報が含まれる場合があります。さらに、Datadog は、診断ログ、難読化されたスタックトレースを含むクラッシュダンプ、および様々なシステムパフォーマンスメトリクスなどの情報を収集する場合があります。

このテレメトリー収集を無効にするには、インスツルメンテーションを行うアプリケーションで DD_INSTRUMENTATION_TELEMETRY_ENABLED 環境変数を false に設定してください。

APM における PCI DSS 準拠

APM の PCI 準拠は、US1 サイトで作成された新しい Datadog 組織でのみ利用可能です。

APM の PCI 準拠は、Datadog の組織を新規に作成する際に利用できます。PCI 準拠の Datadog 組織をセットアップするには、以下の手順に従います。

  1. US1 サイトに新しい Datadog 組織をセットアップします。PCI DSS 準拠は、US1 で作成された新しい組織にのみサポートされています。
  2. Datadog サポートまたはカスタマーサクセスマネージャーに連絡し、新しい組織を PCI 準拠の組織として構成するようリクエストします。
  3. 新しい組織で監査証跡を有効にします。PCI DSS 準拠のため、監査証跡を有効にし、有効なままにする必要があります。
  4. Datadog サポートまたはカスタマーサクセスが新しい組織が PCI DSS に準拠していることを確認した後、PCI 準拠の専用エンドポイント (https://trace-pci.agent.datadoghq.com) にスパンを送信するように Agent コンフィギュレーションファイルを構成します。
    apm_config:
      apm_dd_url: <https://trace-pci.agent.datadoghq.com>
    

ログ で PCI 準拠を実現するためには、ログ管理の PCI DSS 準拠を参照してください。

APM の PCI 準拠は、 サイトではご利用いただけません。