見出し画像

アプリログとWAFのログを紐づけしたい! X-Amzn-Trace-Idの紹介

はじめに

こんにちは、SHIFT DAAE部の栗山です。不正アクセスが疑われる場合などに「WAFのログとアプリ側で出すログを紐づけしたい」そんなことありませんか?

本日はそんな場合に使用できる「X-Amzn-Trace-Id」を紹介します。

X-Amzn-Trace-Idとは?

Application Load Balancer(ALB)がHTTPリクエストを受けた際に、HTTPリクエストのヘッダーに付加する情報です。

これを使用して、ALBにアタッチするWAF(Web Application Firewall)やALBのログと、アプリケーションのログを紐づけすることができます。

WAFのログにはIPアドレスなどのアクセス元情報が出力されるので、不正アクセスの調査などに活用できます。

参考:X-Amzn-Trace-Id を使用して Application Load Balancer リクエストをトレースする方法を教えてください

実際にどのような値が出力されるのか?

WAF側のログ

"requestId": "1-63d8a30a-6d9acea84564126555b80f49"

WAFのログには「requestId"」という項目で出力されます。

アプリ側のログ

"x-amzn-trace-id": "Root=1-63d8a30a-6d9acea84564126555b80f49",

アプリ側ではHeader情報の一部になります。
冒頭に「Root=」という文字列が付加されます。

NestJSでX-Amzn-Trace-Idを取得する方法

X-Amzn-Trace-Idはヘッダーに付加されるため、通常のHeader情報を取得する場合と同様に取得することができます。
NestJsのコントローラーで取得する場合のコード例を以下に記します。

@Post()
async postApi(
  @Headers('x-amzn-trace-id') xAmznTraceId: string,
){
  // デバッグ出力
  debug(`xAmznTraceId:[${xAmznTraceId}].`);
}

参考:NestJS Overview Controllers

[参考]WAFでの実際のログ

参考のため、WAFで実際のログがどのように出力されるのかを記します。
下部の方に「requestId」という項目があります。WAFのログではHeaderには含まれませんし、「requestId」という名前になります。
※一部省略します。

2023-01-31T14:11:38.128+09:00
{
    "timestamp": 1675141898128,
    "formatVersion": 1,
    "webaclId": "arn:aws:wafv2:ap-northeast-1:...",
    "terminatingRuleId": "Default_Action",
    "terminatingRuleType": "REGULAR",
    "action": "ALLOW",
    "terminatingRuleMatchDetails": [],
    "httpSourceName": "ALB",
    "httpSourceId": "...",
    "ruleGroupList": [
        {
            "ruleGroupId": "AWS#AWSManagedRulesBotControlRuleSet",
            "terminatingRule": null,
            "nonTerminatingMatchingRules": [],
            "excludedRules": null,
            "customerConfig": null
        },
        // 省略
    ],
    "rateBasedRuleList": [],
    "nonTerminatingMatchingRules": [],
    "requestHeadersInserted": null,
    "responseCodeSent": null,
    "httpRequest": {
        "clientIp": "....",
        "country": "JP",
        "headers": [
            {
                "name": "host",
                "value": "..."
            },
            //省略
        ],
        "uri": "...",
        "args": "",
        "httpVersion": "HTTP/2.0",
        "httpMethod": "POST",
        "requestId": "1-63d8a30a-6d9acea84564126555b80f49"
    },
    "labels": [
        {
            "name": "awswaf:managed:token:absent"
        }
    ]
}

最後に

アプリケーションやWAFのログをCloudWatchで出力すれば、CloudWatchの検索機能を使ったり、CloudWatchAlarmと連携したりできるので、該当するログを探す作業にも対応できそうです。

以上になります。
とても役に立つ情報だと思いますのでぜひ活用して頂けたらと思います。

\もっと身近にもっとリアルに!DAAE公式Twitter/


執筆者プロフィール:Kuriyama Akira
DAAE開発エンジニア。筋トレが趣味なのですが、最近ムキムキですねと言われました(うれしい)

お問合せはお気軽に
https://service.shiftinc.jp/contact/

SHIFTについて(コーポレートサイト)
https://www.shiftinc.jp/

SHIFTのサービスについて(サービスサイト)
https://service.shiftinc.jp/

SHIFTの導入事例
https://service.shiftinc.jp/case/

お役立ち資料はこちら
https://service.shiftinc.jp/resources/

SHIFTの採用情報はこちら
https://recruit.shiftinc.jp/career/