Datadog Sensitive Data Scanner で APM スパンの機密データをマスキングしてみた
こんにちは。テクニカルサポートチームのShiinaです。
はじめに
個人情報や API キーなどの機密データがうっかりログやトレースに出力してしまったことはありませんか?
特に APM は便利な反面、気づかないうちに機密データが Datadog に取り込まれてしまうこともあります。
本来、ログやトレースに機密データを含めるべきではありませんが、デバッグやトラブルシューティングの過程で、うっかり出力してしまうこともあります。
Datadog の Sensitive Data Scanner を利用すると、機密データを自動で検出&マスキングできるため、情報漏洩やコンプライアンス違反のリスクを減らすことができます。
今回は、APM スパンに含まれる URL のクエリ文字列に対して、Sensitive Data Scanner を使ってマスキングしてみました。
Sensitive Data Scanner とは
Datadog に取り込まれるアプリケーションログ、APM スパン、RUM イベントなどのテレメトリーデータ内に含まれる、以下のような機密データの検出・分類・マスキングを行う機能です。
- クレジットカード番号
- API キーやアクセストークン
- IP アドレス
- 個人を特定できる情報(PII) など
Datadog に新たに取り込まれるデータに対してのみ有効です。
すでに取り込まれて保存されているデータに対して、後からマスキングを行うことはできません。
機密データに対するアクション
検出された機密データに対して以下の5つのアクションを設定できます。
-
Redact
一致するすべてのデータを、指定したテキストに置き換えます。
元の値は保持されません。
設定前:&search=foo
設定後:[sensitive_data]
-
Partially Redact
一致したデータの一部をマスキング(墨消し)します。
データの一部を残すことで識別性を保ちつつ保護できます。
設定前:&search=foo
設定後:&search=f**
-
Hash
一致したデータを一意のハッシュ値に変換します。
元の値は保持されません。
設定前:&search=foo
設定後:8d824a449db63429
-
Mask
一致する値を指定のテキストで難読化します。(ログのみ対応)
※権限があるユーザーは復元可能なため、注意が必要です。
設定前:&search=foo
設定後:[Hidden_data]
-
アクションなし
データの置き換えは行わず、検出された機密データにタグを付与します。
主に検知や分類目的で使用され、データの可視性は維持されます。
定義済みルール
Sensitive Data Scanner には、あらかじめ用意された事前定義ルール[1]があり、正規表現を一から書く必要はありません。
代表的なものとして、以下のルールが用意されています。
-
Secrets and credentials
API キー、アクセストークン、パスワード、クラウドサービスの認証情報など
例:AWS Access Key、Claude API Key、GitHub Token など -
Credit cards and banking
クレジットカード番号や銀行口座情報などの金融データ
例:Visa、MasterCard、Amex、銀行口座番号など -
Personal Identifiable Information (PII)
個人を特定できる情報
例:氏名、住所、電話番号、パスポート番号など -
Network and device information
ネットワークやデバイスに関する技術的な情報
例:IP アドレス、MAC アドレス、HTTP ヘッダー、クッキーなど
料金
Sensitive Data Scanner はスキャン対象のデータ量(GB)に応じて課金されます。
AP1 サイトでは 1GB あたり $0.38 /月です。
たとえば、1か月間に10 GB のログやスパンデータがスキャンされた場合、
0.38 ドル × 10 GB = 3.80 ドル / 月 の料金が発生します。
最新の料金についてはドキュメント[2]をご参照ください。
やってみた
今回は APM スパンに含まれるクエリ文字列に対して Sensitive Data Scanner のカスタムルールを追加し、機密データをマスキングしてみます。
以下の URL に含まれるクエリパラメータ search=foo
の foo
部分を機密データとみなし、Datadog の Sensitive Data Scanner を使ってマスキングします。
https://example.com/api/products?page=1&limit=12&search=foo
前提
- Datadog APM がすでにセットアップされていること
マスキング対象の APM スパン属性
APM スパンには、以下の属性にクエリ文字列が含まれています。
- Span Attributes
- @http.url (リクエスト全体の URL)
- @http.url_details.queryString(クエリパラメータ部分のみ)
1. Scanning Group 設定
Datadog コンソール Security より Sensitive Data Scanner の Setting を選択します。
Add Group を選択します。
以下のように設定を行い、グループを追加します。
-
Filter for telemetry data to be included in the scanning group
テレメトリデータのフィルター(例:env:development
) -
Define scanning group name:
任意の名前(例:scanning group for Development Telemetry)
正しく対象データをフィルタできているかは PREVIEW で APM Spans を選択することで確認可能です。
2.Scanning Rule 設定(url属性)
作成したグループに対して Add Scanning Rule を選択します。
以下のように設定を行い、ルールを追加します。
-
ルール
Custom Rule -
Rule name
任意の名前(例:URL QueryString Rule) -
Priority
任意の重要度 -
Define regex pattern
([?&]search=)[^&]*
-
Type or paste event data to test the rule
https://example.com/api/products?page=1&limit=12&search=foo
対象 URL を入力し、正規表現がマッチしていることを確認します。 -
How much of the event do you want to scan?
Entrie Event -
マスキングアクション
今回は Redact を選択し[sensitive_data]
に置き換えてみます。 -
Add tag(s):
sensitive_data_category:user.search_query
設定後、APM スパンを確認してみます。
url 属性のsearch=foo
は[sensitive_data]
に置き換わったことが確認できました。
しかしながら、queryString 属性はマスキングがされておらず、機密データのマスキング処理が不十分です。
queryString 属性は後述の設定を行うことでマスキングが可能です。
3.Scanning Rule 設定(queryString属性)
同様に Add Scanning Rule を選択します。
以下のように設定を行い、さらにルールを追加します。
-
ルール
Custom Rule -
Rule name
任意の名前(例:HTTP QueryString Rule) -
Priority
任意の重要度 -
Define regex pattern
.+
-
How much of the event do you want to scan?
Specific Attributes -
For finer-grained processing, specify the attribute(s) to include in
http.url_details.queryString.search
-
マスキングアクション
今回は Redact を選択し[sensitive_data]
に置き換えてみます。 -
Add tag(s):
sensitive_data_category:user.search_query
設定後、APM スパンを確認してみます。
queryString 属性も[sensitive_data]
に置き換わったことが確認できました。
検知サマリーを確認する
検知した機密データはルールごとにイベントのサマリーを確認することができます。
Datadog コンソール Security より Sensitive Data Scanner の Summary を選択します。
OF EVENTS より件数を確認することが可能です。
スキャンデータ量の確認する
Datadog コンソール Security より Sensitive Data Scanner の Settings を選択します。
GROUPS 一覧より該当の GROUP NAME の DATA SCANNED(PAST24H) にカーソルを移動します。
Logs、APM Spans、Events ごとに過去24時間のスキャンデータ量を確認することが可能です。
Filter を利用してスキャン対象を絞り込むことでスキャンデータ量を減らすことができるため、コスト削減にもつながります。
特定のサービスを指定したり、ALB ヘルスチェックといった特定のユーザーエージェントや Datadog 向け通信のテレメトリーデータを除外することも可能です。
- フィルター例
env:development service:shopping-site -@http.useragent:ELB-HealthChecker/2.0 -@peer.hostname:http-intake.logs.datadoghq.com
まとめ
Sensitive Data Scanner を使うことで、APM スパンやログに含まれる機密データを自動で検出・マスキングが可能です。
あらかじめ用意された定義済みルールがあるため、正規表現を書かなくても簡単に始められるメリットもあります。
スキャン対象の絞り込みを行うことでセキュリティ対策とコストのバランスも取りやすくなります。
特に金融や医療など、機密データを扱う機会が多い業界では、導入効果の高いのではないでしょうか。
本記事が参考になれば幸いです。
参考