セットアップと構成

互換性

サポートされている Java バージョン

Datadog ライブラリは、Oracle JDK と OpenJDK の両方の Java JRE 1.8 以降をサポートし、以下のアーキテクチャに対応しています。

  • Linux (GNU) x86、x86-64
  • Alpine Linux (musl) x86、x86-64
  • macOS (Darwin) x86、x86-64
  • Windows (msvc) x86、x86-64

Datadog は、Java の早期アクセスバージョンを公式にサポートしていません。

Docker、Kubernetes、AWS ECS、AWS Fargate で動作する Java アプリのアプリケーションセキュリティを監視することができます。

サポートされているフレームワーク

Framework Web Serverフレームワークの最小バージョン
Servlet 互換2.3+、3.0+
Spring3.1

: WebSphere、WebLogic、JBoss など、多くのアプリケーションサーバーは Servlet と互換性があり、ASM でサポートされています。また、Spring Boot などのフレームワークは、サポートされている組み込みアプリケーションサーバー (Tomcat、Jetty、Netty など) を使用することでサポートされます。

サポートされている .NET バージョン

以下の .NET バージョンに対応しています。

  • .NET Core 6
  • .NET Core 5
  • .NET Framework 4.8
  • .NET Framework 4.7.2
  • .NET Framework 4.7
  • .NET Framework 4.6.2
  • .NET Framework 4.6.1

これらは、以下のアーキテクチャでサポートされています。

  • Linux (GNU) x86、x86-64
  • Alpine Linux (musl) x86、x86-64
  • macOS (Darwin) x86、x86-64
  • Windows (msvc) x86、x86-64

Docker、Kubernetes、AWS ECS、AWS Fargate で動作する .NET アプリのアプリケーションセキュリティを監視することができます。

サポートされているフレームワーク

.NET トレーサーは .NET ベースのすべての言語 (C#、F#、Visual Basic など) をサポートしています。

Framework Web Serverフレームワークの最小バージョン
ASP.NET4.6
ASP.NET Core2.1

サポートされている Go バージョン

Datadog Go トレーシングライブラリは、以下のアーキテクチャの Go バージョン 1.14 以降をサポートしています。

  • Linux (GNU) x86-64
  • Alpine Linux (musl) x86-64
  • macOS (Darwin) x86-64

Docker、Kubernetes、AWS ECS で動作する Go アプリのアプリケーションセキュリティを監視することができます。

サポートされているフレームワーク

以下の Web フレームワークのリストにある APM トレーサーのインテグレーションを使用して、Go トレーサーを統合します。インテグレーションのドキュメントをクリックすると、サポートされているパッケージとその API の詳細な概要、および使用例が記載されています。

CGO の有効化

ASM を有効にしてコードをコンパイルすることは、CGO を伴うため、以下が必要です。

  • ターゲット GOOSGOARCH 用の gcc コンパイラ。
  • C ライブラリのヘッダー。
  • CGO バインディングが有効であること。これは環境変数 CGO_ENABLED によって制御され、ネイティブコンパイル時にはデフォルトで有効になっています。

上記の要件をインストールするには

オペレーティングシステムコンソールコマンド
Debian、Ubuntu$ apt install gcc libc6-dev
Alpine$ apk add gcc musl-dev
RHEL、CentOS、Fedora$ yum install gcc glibc-devel
macOS$ xcode-select --install

: Go ツールチェーンは、クロスコンパイル時に CGO を無効にするので、CGO を明示的に有効にする必要があります。

サポートされている Ruby バージョン

Datadog Ruby ライブラリは、以下の Ruby インタプリターの最新 gem をサポートしています。

これらは、以下のアーキテクチャでサポートされています。

  • Linux (GNU) x86-64、aarch64
  • Alpine Linux (musl) x86-64、aarch64
  • macOS (Darwin) x86-64、arm64

Docker、Kubernetes、AWS ECS、AWS Fargate で動作する Ruby アプリのアプリケーションセキュリティを監視することができます。

サポートされているフレームワーク

Framework Web Serverフレームワークの最小バージョン
Rack1.1
Rails3.2 (Ruby のバージョンにも依存します)
Sinatra1.4

Datadog PHP ライブラリは、以下のアーキテクチャの PHP バージョン 7.0 以降をサポートしています。

  • Linux (GNU) x86-64
  • Alpine Linux (musl) x86-64

Docker、Kubernetes、AWS ECS で動作する PHP アプリのアプリケーションセキュリティを監視することができます。

すべての PHP フレームワークの使用をサポートし、またフレームワークなしの使用も可能です。

サポートされている NodeJS バージョン

Datadog NodeJS ライブラリは、以下の NodeJS のバージョンをサポートしています。

  • NodeJS 13.10.0 以降
  • NodeJS 12.17.0 以降

これらは、以下のアーキテクチャでサポートされています。

  • Linux (GNU) x86-64
  • Alpine Linux (musl) x86-64
  • macOS (Darwin) x86-64
  • Windows (msvc) x86、x86-64

Docker、Kubernetes、AWS ECS、AWS Fargate で動作する NodeJS アプリのアプリケーションセキュリティを監視することができます。

サポートされているフレームワーク

Framework Web Serverフレームワークの最小バージョン
Express4.0

トレースへのユーザー情報追加

標準化されたユーザータグを使用してサービスをインスツルメントし、アプリケーションのパフォーマンスやアプリケーションのセキュリティを追跡することで、認証されたユーザーのアクティビティを追跡できます。

こうすることで、疑わしいセキュリティ活動を行う悪質なアクターを特定し、この時間帯のすべての活動を確認し、認証済みの攻撃対象領域を狙う最も高度な攻撃やシグナルに優先的に対処することができます。

ルートスパンにカスタムタグを追加する方法と、後述のインスツルメンテーション関数を利用する方法があります。

ルートスパンにカスタムタグを追加するための Java トレーサーの API を使用し、アプリケーションで認証されたリクエストを監視できるように、ユーザー情報を追加します。

ユーザーモニタリングタグは、ルートスパンに適用され、プレフィックス usr の後にフィールド名が続きます。例えば、usr.name は、ユーザーの名前を追跡するユーザーモニタリングタグです。

: アプリケーションに必要な依存関係が追加されていることを確認してください。

以下の例では、ルートスパンを取得し、関連するユーザーモニタリングタグを追加する方法を示しています。

// アクティブスパンの取得
final Span span = GlobalTracer.get().activeSpan();
if ((span instanceof MutableSpan)) {
   MutableSpan localRootSpan = ((MutableSpan) span).getLocalRootSpan();
   // 必須ユーザー ID タグの設定
   localRootSpan.setTag("usr.id", "d131dd02c56eec4");
   // オプションのユーザーモニタリングタグを設定する
   localRootSpan.setTag("usr.name", "Jean Example");
   localRootSpan.setTag("usr.email", "jean.example@example.com");
   localRootSpan.setTag("usr.session_id", "987654321");
   localRootSpan.setTag("usr.role", "admin");
   localRootSpan.setTag("usr.scope", "read:message, write:files");
}

.NET トレーサーパッケージは SetUser() 関数を提供し、トレースにユーザー情報を追加することで認証されたリクエストを監視できるようにします。

以下の例では、関連するユーザーモニタリングタグを追加する方法を示しています。


using Datadog.Trace;

// ...

    var userDetails = new UserDetails()
    {
        // ユーザーに対するシステム内部識別子
        Id = "d41452f2-483d-4082-8728-171a3570e930",
        // ユーザーのメールアドレス
        Email = "test@adventure-works.com",
        // システムによって表示されるユーザー名
        Name = "Jane Doh",
        // ユーザーのセッション ID
        SessionId = "d0632156-132b-4baa-95b2-a492c5f9cb16",
        // ユーザーがリクエストしたロール
        Role = "standard",
    };
    Tracer.Instance.ActiveScope?.Span.SetUser(userDetails);

情報およびオプションについては、.NET トレーサーのドキュメントをお読みください。

Go トレーサーパッケージは SetUser() 関数を提供し、トレースにユーザー情報を追加することで認証されたリクエストを監視できるようにします。他のオプションについては、Go トレーサーのドキュメントをご覧ください。

この例では、現在のトレーサースパンを取得し、それを使用してユーザーモニタリングタグを設定する方法を示します。

// HTTP リクエストのコンテキストから現在のトレーサースパンを取得します
if span, ok := tracer.SpanFromContext(request.Context()); ok {
    // スパンが所属するトレースにユーザー情報を記録します
    tracer.SetUser(span, usr.id, tracer.WithUserEmail(usr.email), tracer.WithUserName(usr.name))

以下の API のいずれかを使用して、トレースにユーザー情報を追加し、アプリケーションで認証されたリクエストを監視できるようにします。

ddtrace 1.1.0 からは、Datadog::Kit::Identity.set_user メソッドが使用できるようになりました。これは、トレースにユーザ情報を追加するための推奨 API です。

# アクティブトレースを取得する
trace = Datadog::Tracing.active_trace

# 必須ユーザー ID タグを設定する
Datadog::Kit::Identity.set_user(trace, id: 'd131dd02c56eeec4')

# または、オプションのユーザーモニタリングタグを設定する
Datadog::Kit::Identity.set_user(
  trace,

  # 必須 ID
  id: 'd131dd02c56eeec4',

  #セマティクスが分かっているオプションタグ
  name: 'Jean Example',
  email:, 'jean.example@example.com',
  session_id:, '987654321',
  role: 'admin',
  scope: 'read:message, write:files',

  # オプションの自由形式タグ
  another_tag: 'another_value',
)

Datadog::Kit::Identity.set_user がニーズに合わない場合は、代わりに set_tag を使用することができます。

ユーザーモニタリングタグは、トレースに適用され、プレフィックス usr. の後にフィールド名が続きます。例えば、usr.name は、ユーザーの名前を追跡するユーザーモニタリングタグです。

以下の例では、アクティブトレースを取得し、関連するユーザーモニタリングタグを追加する方法を示しています。

:

  • タグの値は文字列でなければなりません。
  • usr.id タグは必須です。
# アクティブトレースを取得する
trace = Datadog::Tracing.active_trace

# 必須ユーザー ID タグを設定する
trace.set_tag('usr.id', 'd131dd02c56eeec4')

# セマティクスが分かっているユーザーモニタリングタグをオプションで設定する
trace.set_tag('usr.name', 'Jean Example')
trace.set_tag('usr.email', 'jean.example@example.com')
trace.set_tag('usr.session_id', '987654321')
trace.set_tag('usr.role', 'admin')
trace.set_tag('usr.scope', 'read:message, write:files')

# 自由形式のタグを設定する
trace.set_tag('usr.another_tag', 'another_value')

ルートスパンにカスタムタグを追加するための PHP トレーサーの API を使用し、アプリケーションで認証されたリクエストを監視できるように、ユーザー情報を追加します。

ユーザーモニタリングタグは、ルートスパンの meta セクションに適用され、プレフィックス usr の後にフィールド名が続きます。例えば、usr.name は、ユーザーの名前を追跡するユーザーモニタリングタグです。

以下の例では、ルートスパンを取得し、関連するユーザーモニタリングタグを追加する方法を示しています。

<?php
$rootSpan = \DDTrace\root_span();

 // ユーザーの一意な識別子が必要です。
$rootSpan->meta['usr.id'] = ‘123456789’;

// その他のフィールドはすべてオプションです。
$rootSpan->meta['usr.name'] = ‘Jean Example’;
$rootSpan->meta['usr.email'] = ‘jean.example@example.com’;
$rootSpan->meta['usr.session_id'] = ‘987654321’;
$rootSpan->meta['usr.role'] = ‘admin’;
$rootSpan->meta['usr.scope'] = ‘read:message, write:files’;
?>

Node トレーサーパッケージは tracer.setUser(user) 関数を提供し、トレースにユーザー情報を追加することで認証されたリクエストを監視できるようにします。

以下の例では、関連するユーザーモニタリングタグを追加する方法を示しています。

const tracer = require('dd-trace').init()

function handle () {
  tracer.setUser({
    id: '123456789', // *必須* ユーザーの一意な識別子。

    // その他のフィールドはすべてオプションです。
    email: 'jane.doe@example.com', // ユーザーのメールアドレス。
    name: 'Jane Doe', // ユーザーのユーザーフレンドリーな名前。
    session_id: '987654321', // ユーザーのセッション ID。
    role: 'admin', // ユーザーがリクエストしたロール。
    scope: 'read:message, write:files', // ユーザーが現在持っているスコープまたは付与された権限。

    // ユーザーへのカスタムデータ (RBAC、Oauth など) をアタッチするために、任意のフィールドも受け付けます
    custom_tag: 'custom data'
  })
}

情報およびオプションについては、NodeJS トレーサーのドキュメントをお読みください。

データセキュリティへの配慮

Datadog で収集するデータには、除外、難読化、フィルタリング、修正したり、収集しないことを選択したりするべき機密情報が含まれることがあります。さらに、脅威検出が不正確になったり、サービスのセキュリティが Datadog で正確にされないという問題の原因となるシンセティックトラフィックを含む場合もあります。

デフォルトでは、ASM は疑わしいリクエストから情報を収集し、そのリクエストが疑わしいと判定された理由を理解するのに役立ちます。データを送信する前に、ASM はデータが機密であることを示すパターンとキーワードをスキャンします。データが機密であると判断された場合、それは <redacted> フラグに置き換えられるので、リクエストは疑わしいが、データセキュリティの懸念からリクエストデータを収集できなかったことがわかります。

ユーザーのデータを保護するために、ASM では機密データスキャンがデフォルトで有効になっています。以下の環境変数を使用することで、構成をカスタマイズすることができます。スキャンは RE2 構文に基づいているため、スキャンをカスタマイズするには、これらの環境変数の値を有効な RE2 パターンに設定します。

  • DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP - 値が一般的に機密データを含むキーをスキャンするためのパターン。見つかった場合、そのキーと関連する値およびすべての子ノードが編集されます。
  • DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP - 機密データを示す可能性のある値をスキャンするためのパターン。見つかった場合、その値とすべての子ノードが編集されます。
Ruby のみ、ddtrace バージョン 1.1.0 から

また、コードでスキャンパターンを構成することも可能です。

Datadog.configure do |c|
  # ...

  # カスタム RE2 正規表現を設定する
  c.appsec.obfuscator_key_regex = '...'
  c.appsec.obfuscator_value_regex = '...'
end

以下は、デフォルトで機密と判定されるデータの例です。

  • pwdpasswordipasswordpass_phrase
  • secret
  • keyapi_keyprivate_keypublic_key
  • token
  • consumer_idconsumer_keyconsumer_secret
  • signsignedsignature
  • bearer
  • authorization
  • BEGIN PRIVATE KEY
  • ssh-rsa

Datadog Agent やライブラリの他のメカニズムで、機密データを削除するために使用できるものについては、APM データセキュリティを参照してください。

除外フィルター

ASM のシグナル、つまり不審なリクエストが誤検出される場合があります。例えば、ASM が同じ不審なリクエストを繰り返し検出し、シグナルが発生したが、そのシグナルは確認され、脅威ではないことがあります。

ルールからイベントを無視する除外フィルターを設定することで、このようなノイズの多いシグナルパターンを排除し、正当な疑わしいリクエストに焦点を当てることができます。

除外フィルターを作成するには、次のいずれかを行います。

  • ASM Signals のシグナルをクリックし、左上にある Create Exclusion Filter ボタンをクリックします。この方法では、対象となるサービスに対するフィルタークエリが自動的に生成されます。
  • Exclusion Filters Configuration に移動し、独自のフィルタークエリに基づいて新しい除外フィルターを手動で構成します。

: 除外フィルターに一致するリクエスト (トレース) は請求されません。

アプリケーションセキュリティモニタリングを無効にする

ASM を無効にするには、アプリケーションの構成から DD_APPSEC_ENABLED=true 環境変数を削除します。削除したら、サービスを再起動します。

さらにサポートが必要な場合は、Datadog サポートにお問い合わせください。

その他の参考資料