[アップデート] Route53 Resolver で DNS クエリをログ出力できるようになりました!

Route 53 Resolver で DNS クエリのログ出力がサポートされました。なお、Route 53 Resolver は、 従来の Amazon Provided DNS のことで、今は Route 53 Resolver に名称が変わってます!
2020.08.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Route53 Resolver で DNS クエリのログ出力がサポートされ、VPC 内の AWS リソースが、どのドメインに接続しているかわかるようになりました。

なにが嬉しいのか

Route 53 Resolver は、VPC作成時にデフォルトで備わっているDNSサーバー(フォワーダー+フルサービスリゾルバー)で、VPC 内からパブリック DNS への名前解決をしたり、VPC 内部に閉じた DNS の名前解決を行います。昔から AWS を使われている方には Amazon Provided DNS と表現するほうが馴染み深いかもしれません。

これまで Route53 のパブリックホストゾーンへ行われるの DNS クエリはログ出力が可能でしたが、VPC 内部から発信される DNS クエリやレスポンスをロギングできませんでした。
アップデートで VPC の DNS クエリをログ出力できるようになったので、セキュリティ強化やコンプライアンス上 DNS クエリの記録取得を求められるケースに対応できるようになったり、また、インシデント調査で役立つことが期待できます。

ログ内容

Route53 リゾルバーのクエリログでは以下が記録されます。

項目名 内容 サンプル
version クエリログ形式のバージョン番号 1.000000
account_id VPCを作成したAWSアカウントのID 111122223333
region VPCを作成したAWSリージョン us-west-2
vpc_id クエリが発生したVPCのID vpc-7example
query_timestamp クエリが送信された日時、ISO 8601形式、UTC表記 2020-07-27T16:32:20Z
query_name クエリで指定されたドメイン名またはサブドメイン名 api.example.com.
query_type リクエストで指定されたDNSレコードタイプ A
query_class クエリのクラス IN
rcode DNSクエリに応答してリゾルバーが返したDNSレスポンスコード
レスポンスコードの一覧は、DNS RCODEを参照
NOERROR
answer_type クエリへの応答としてResolverが返す値のDNSレコードタイプ(A、MX、CNAMEなど) A
rdata クエリへの応答としてResolverが返した値 192.0.2.44
answer_class クエリに対するリゾルバー応答のクラス IN
srcaddr クエリが発生したインスタンスのIPアドレス 192.0.2.15
srcport クエリが発生したインスタンスのポート 50637
transport DNSクエリの送信に使用されるプロトコル UDP
srcids DNSクエリが発信または通過したソースのIDのリスト
instance クエリが発生したインスタンスのID i-0d15cd0d3example
resolver-endpoint DNSクエリをオンプレミスDNSサーバーに渡すリゾルバーエンドポイントのID rslvr-out-2345678dfghexample
EDNS client subnet DNSリゾルバーから取得できる場合の、発信元のクライアントの部分的なIPアドレス

Values that appear in Resolver query logs

ログ出力先

ログ出力先としては、以下のサービスが対応しております。

  • Amazon CloudWatch Logs
  • Amazon S3
  • Kinesis Data Firehose

パブリック DNS のログ出力先では、CloudWatch Logsのみでしたが、Route53 Resolver では S3 がサポートされてコスト面で嬉しいです。 また、Firehose もサポートされているので、他の分析基盤に連携をしやすくなってます。

AWS resources that you can send Resolver query logs to

やってみた

ログ出力設定

Route 53 Resolver の クエリログの記録 で、 [クエリログの記録を設定] をクリックします。

クエリログ設定の名前を入れます。

クエリログの送信先を設定します。ここでは CloudWatch Logs を送信先にしています。

クエリログを記録する VPC を設定します。[VPC を追加] から VPC を選択して、追加します。

設定が完了しました。

ログ確認

設定した VPC から DNS クエリを投げながらログを確認してみました。 ロググループではクエリ送信元ごとにログストリームがわかれております。

EC2 のプライベートDNSの名前解決

設定した VPC 上の EC2 から、自身のプライベート DNS の名前解決をしてみます。

$ dig +short ip-10-0-1-120.ap-northeast-1.compute.internal
10.0.1.120
{
    "version": "1.000000",
    "account_id": "123412341234",
    "region": "ap-northeast-1",
    "vpc_id": "vpc-0f9264846a994a537",
    "query_timestamp": "2020-08-27T22:49:53Z",
    "query_name": "ip-10-0-1-120.ap-northeast-1.compute.internal.",
    "query_type": "A",
    "query_class": "IN",
    "rcode": "NOERROR",
    "answers": [
        {
            "Rdata": "10.0.1.120",
            "Type": "A",
            "Class": "IN"
        }
    ],
    "srcaddr": "10.0.1.120",
    "srcport": "57163",
    "transport": "UDP",
    "srcids": {
        "instance": "i-036b008ddf436585a"
    }
}

ソース(i-036b008ddf436585a, 10.0.1.120)から、EC2 のプライベート DNS(ip-10-0-1-120.ap-northeast-1.compute.internal)の名前解決を行い、10.0.1.120 が返ってきたことがわかります。

パブリック DNS の名前解決

EC2 上からパブリック DNS を名前解決時のログを確認してみます。

$ dig +short www.amazon.co.jp
tp.4d5ad1d2b-frontier.amazon.co.jp.
dtioykqj1u8de.cloudfront.net.
13.249.160.20
{
    "version": "1.000000",
    "account_id": "123412341234",
    "region": "ap-northeast-1",
    "vpc_id": "vpc-0f9264846a994a537",
    "query_timestamp": "2020-08-27T23:01:06Z",
    "query_name": "www.amazon.co.jp.",
    "query_type": "A",
    "query_class": "IN",
    "rcode": "NOERROR",
    "answers": [
        {
            "Rdata": "tp.4d5ad1d2b-frontier.amazon.co.jp.",
            "Type": "CNAME",
            "Class": "IN"
        },
        {
            "Rdata": "dtioykqj1u8de.cloudfront.net.",
            "Type": "CNAME",
            "Class": "IN"
        },
        {
            "Rdata": "13.249.160.20",
            "Type": "A",
            "Class": "IN"
        }
    ],
    "srcaddr": "10.0.1.120",
    "srcport": "44465",
    "transport": "UDP",
    "srcids": {
        "instance": "i-036b008ddf436585a"
    }
}

フォーワーディングしている DNS クエリもログ出力されることがわかりました。

さいごに

Route 53 Resolver で DNS クエリのログを出力できるようになりました。 VPCフローログのトラフィックはIPで表示なので、どこに対する通信なのかわかりにくかったところがあります。DNS クエリのログではドメインがわかるので、ログを可視化することによってトラフィックの分析やセキュリティインシデントの調査で役立ちそうです。

お恥ずかしながら、Amazon Provided DNS は現在使われておらず、Route 53 Resolver に名称が変わっていることをアップデートで知りました。従来 Route 53 Resolver と言うとオンプレからの AWS の名前解決するためのエンドポイントで使われてましたが、今は Route 53 Resolver for Hybrid Clouds という名称になっています。認識齟齬が生まれるかもしれないので、会話する際は気をつけましょう!

参考