Route 53 Resolver の DNS クエリログを設定する

記事タイトルとURLをコピーする

営業部 佐竹です。
本日は、Route 53 Resolver の DNS クエリログ取得のための設定方法をご紹介します。

はじめに

aws.amazon.com

2020年に Route 53 Resolver (旧称 Amazon Provided DNS) のクエリログを取得できるようになりました。

この機能を利用することにより、VPC 内のリソースが各 VPC の Route 53 Resolver に問い合わせした名前解決のログを全て取得することが可能です。

この機能が出るまでは、Route 53 は Public Hosted Zone 単体でのクエリログしか取得できず、Private Hosted Zone のクエリログは取得できませんでした。また、Route 53 Resolver (Amazon Provided DNS) は Route 53 Hosted Zone を利用しておらずとも VPC を作成すると自動的に提供されますが、この Resolver の利用ログも取得できませんでした。

今回はこの機能を実際に設定する方法を記載していきます。なお、クエリログの出力先として選択が可能なのは現時点で以下の3つです。

  1. CloudWatch Logs log group
  2. S3 bucket
  3. Kinesis Data Firehose delivery stream

構成図

f:id:swx-satake:20211112140701p:plain

AWS 環境構成図を描くと上図のようになります。

クエリログのフォーマット

ログフォーマットについては以下の公式ドキュメントに記載がありますため、合わせてご確認ください。

docs.aws.amazon.com

クエリログの設定方法

今回は、CloudWatch Logs と S3 bucket それぞれ設定していきます。

f:id:swx-satake:20211111141558p:plain

AWS マネジメントコンソールから Route 53 の「Query logging」を選択します。その後、「Configure query logging」を押下し設定画面を開きます。

Query logging configuration name

f:id:swx-satake:20211111141832p:plain

利用する機能によって別々の設定となるため、今回は名前を Resolver-logging-for-CWLogs としてみました。

Query logs destination

「CloudWatch Logs log group」を選択します。

CloudWatch Logs log groups は「Create log group」とし、New log group name を「querylogging」としました。

VPCs to log queries for

f:id:swx-satake:20211111163117p:plain

「Add VPC」を押下して対象としたい VPC を選択した後、「Add」で設定を完了します。

f:id:swx-satake:20211111165355p:plain

Tags

最後の Tags(タグ)設定は任意です。

「Configure query logging」を押下して設定を完了します。

CloudWatch Logs への出力設定完了

f:id:swx-satake:20211111142512p:plain

設定が完了すると、一覧に表示されます。

「Destination type」が「CloudWatch Logs」とした設定が完了しましたので、次に S3 Bucket への出力設定を追加します。

S3 Bucket への出力設定

Resolver-logging-for-S3 Bucket という名前で設定を進めます。

Query logs destination (S3)

f:id:swx-satake:20211111170049p:plain

今度は「S3 bucket」を選択します。

Amazon S3 bucket は作成済の Bucket を入力します。Bucket の URL は少し特殊です。arn:aws:s3:::route53-querylogging の場合は s3://route53-querylogging/ と修正する必要があり、Arn のまま利用ができません。

また、この設定を行うと、対象の S3 Bucket へ以下の Bucket Policy が書き込まれます。

{
    "Version": "2012-10-17",
    "Id": "AWSLogDeliveryWrite20150319",
    "Statement": [
        {
            "Sid": "AWSLogDeliveryWrite",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::route53-querylogging/AWSLogs/123456789012/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceAccount": "123456789012"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:ap-northeast-1:123456789012:*"
                }
            }
        },
        {
            "Sid": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::route53-querylogging",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "123456789012"
                },
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:logs:ap-northeast-1:123456789012:*"
                }
            }
        }
    ]
}

もし S3 Bucket のクロスアカウントアクセスを行う場合は、以下の公式ドキュメントに記載されている Bucket Policy をご参考ください。

docs.aws.amazon.com

Forbidden. (AccessDenied 403: Access Denied)

f:id:swx-satake:20211111142936p:plain

なお、S3 Bucket を Browse すると何故か「Error occurred Forbidden. (AccessDenied 403: Access Denied)」となってしまうため、先にバケットを作成しておき URL で指定するほうが良いでしょう。

後は同様に対象としたい VPC を追加して「Configure query logging」を押下し設定を完了します。

f:id:swx-satake:20211111143325p:plain

CloudWatch、S3 共に設定が完了しました。

動作確認

指定した VPC の内部に構築された EC2 インスタンスから以下の通り nslookup を行ってどのようにログが記録されるのか確認します。

PS C:\Users\Administrator> nslookup 2012r2.satake1.local
サーバー:  ip-192-168-64-2.ap-northeast-1.compute.internal
Address:  192.168.64.2

権限のない回答:
名前:    2012r2.satake1.local
Address:  192.168.64.91

なお問い合わせ先となる satake1.local は Route 53 Private Hosted Zone となります。

CloudWatch Log groups

以下の値が確認できました。

{
    "version": "1.100000",
    "account_id": "123456789012",
    "region": "ap-northeast-1",
    "vpc_id": "vpc-0cec1869",
    "query_timestamp": "2021-11-11T05:38:20Z",
    "query_name": "2012r2.satake1.local.ap-northeast-1.compute.internal.",
    "query_type": "A",
    "query_class": "IN",
    "rcode": "NXDOMAIN",
    "answers": [],
    "srcaddr": "192.168.64.91",
    "srcport": "51695",
    "transport": "UDP",
    "srcids": {
        "instance": "i-0acb4edec031ddcbe"
    }
}

{
    "version": "1.100000",
    "account_id": "123456789012",
    "region": "ap-northeast-1",
    "vpc_id": "vpc-0cec1869",
    "query_timestamp": "2021-11-11T05:38:20Z",
    "query_name": "2012r2.satake1.local.",
    "query_type": "A",
    "query_class": "IN",
    "rcode": "NOERROR",
    "answers": [
        {
            "Rdata": "192.168.64.91",
            "Type": "A",
            "Class": "IN"
        }
    ],
    "srcaddr": "192.168.64.91",
    "srcport": "51697",
    "transport": "UDP",
    "srcids": {
        "instance": "i-0acb4edec031ddcbe"
    }
}

S3 Bucket

route53-querylogging/AWSLogs/123456789012/vpcdnsquerylogs/vpc-0cec1869/2021/11/11/ 配下に gz 形式でクエリログが出力されていました。

S3 Select で JSON として確認した結果以下の通りでした。

{
  "version": "1.100000",
  "account_id": "123456789012",
  "region": "ap-northeast-1",
  "vpc_id": "vpc-0cec1869",
  "query_timestamp": "2021-11-11T05:40:08Z",
  "query_name": "ec2messages.ap-northeast-1.amazonaws.com.",
  "query_type": "A",
  "query_class": "IN",
  "rcode": "NOERROR",
  "answers": [
    {
      "Rdata": "54.240.225.173",
      "Type": "A",
      "Class": "IN"
    }
  ],
  "srcaddr": "192.168.64.91",
  "srcport": "55518",
  "transport": "UDP",
  "srcids": {
    "instance": "i-0acb4edec031ddcbe"
  }
}
{
  "version": "1.100000",
  "account_id": "123456789012",
  "region": "ap-northeast-1",
  "vpc_id": "vpc-0cec1869",
  "query_timestamp": "2021-11-11T05:40:55Z",
  "query_name": "monitoring.ap-northeast-1.amazonaws.com.",
  "query_type": "A",
  "query_class": "IN",
  "rcode": "NOERROR",
  "answers": [
    {
      "Rdata": "52.119.221.177",
      "Type": "A",
      "Class": "IN"
    }
  ],
  "srcaddr": "192.168.64.91",
  "srcport": "58165",
  "transport": "UDP",
  "srcids": {
    "instance": "i-0acb4edec031ddcbe"
  }
}

内容としては同じものですので、保存コスト(S3 の方が低コスト)や利便性(CloudWatch Logs の方が閲覧しやすい)の点からどちらに出力するのか選択されると良いでしょう。

まとめ

f:id:swx-satake:20211112140701p:plain
AWS 環境構成図の再掲

今回のブログでは、Route 53 Resolver の DNS クエリログ取得のための設定方法をご紹介しました。

AWS マネジメントコンソールから比較的簡単に設定できるようになっています。

DNS のクエリログは、セキュリティ監査やコンプライアンス上これが求められることもありますため、そのような場合には漏れなく設定されるのが良いでしょう。

以上で説明を終わりにします。

では、またお会いしましょう。

佐竹 陽一 (Yoichi Satake) エンジニアブログの記事一覧はコチラ

マネージドサービス部所属。AWS資格全冠。2010年1月からAWSを利用してきています。2021-2022 AWS Ambassadors/2023 Japan AWS Top Engineers/2020-2023 All Certifications Engineers。AWSのコスト削減、最適化を得意としています。