AWSのEC2でDNSに関するログを取得する方法

# はじめに
本記事はAWSのEC2使用時に、DNSに関するログを取得する方法について記載しています。

セキュリティインシデント発生時に、調査を行うために重要になってくるのが**証跡**です。
例えばインシデント対応で、DNSのクエリが行われたかどうかについて確認したい場合、リアルタイムならEC2インスタンスにログインして、tcpdumpコマンドなどを用いて通信をキャプチャすることは容易です。

しかし、事後検証の場合はOS及びMWでログを取得していない限り、立証が難しくなります。

本記事では、AWSで利用可能なDNSに関するログを取得する方法と、留意点についてまとめています。

## VPCフローログ
**VPCフローログ**は、VPCのネットワークインターフェイス間のIPトラフィックに関する情報をキャプチャすることができるVPCの機能です。

VPC、サブネット、またはネットワークインターフェイス毎にフローログを作成することができます。
また取得したVPCフローログをCloudWatch Logsに送信することもできます。

**留意点**としては、フローログに関する全てのIPトラフィックはキャプチャされません。
公式ドキュメントより、以下の通信はフローログの制限事項となっています。

>フローログですべての IP トラフィックはキャプチャされません。以下のトラフィックの種類は記録されません。
>- Amazon DNS サーバーに接続したときにインスタンスによって生成されるトラフィック。独自の DNS サーバーを使用する場合は、その DNS サーバーへのすべてのトラフィックが記録されます。
>- Amazon Windows ライセンスのアクティベーション用に Windows インスタンスによって生成されたトラフィック。
>- インスタンスメタデータ用に 169.254.169.254 との間を行き来するトラフィック。
>- Amazon Time Sync Service の 169.254.169.123 との間でやり取りされるトラフィック。
>- DHCP トラフィック。
>- ミラートラフィック。
>- デフォルト VPC ルーターの予約済み IP アドレスへのトラフィック。
>- エンドポイントのネットワークインターフェイスと Network Load Balancer のネットワークインターフェイスの間のトラフィック。

::: note warn
従ってDNSクライアントにAWSのDNSサーバを用いて名前解決を行う場合は、記録されません。
[Google Public DNS](https://ja.wikipedia.org/wiki/Google_Public_DNS)の`8.8.8.8`などに対するDNSサーバの通信は記録できます。
:::

### VPCフローログの設定
取得対象のEC2インスタンスが起動していることを前提に、VPCフローログ（ネットワークインターフェース）の設定方法を以下に記載します。

マネジメントコンソールから作業する場合は以下の手順で実施します。
詳細は[CloudWatch Logs へのフローログの発行](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs-cwl.html)をご参照ください。

1. ロール及びポリシーの作成
1. CloudWatch logsのロググループの作成
1. VPCフローログの作成

#### ロール及びポリシーの作成
CloudWatch Logsに、フローログを発行するためには、適切なアクセス権が必要です。
IAMロールにアタッチするIAMポリシーには、少なくとも以下のアクセス許可が含まれている必要があります。

- 許可ポリシー
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams"
            ],
            "Resource": "*"
        }
    ]
}
```

またロールに対して、以下の信頼ポリシーを設定します。

- 信頼関係

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "Service": "vpc-flow-logs.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

#### CloudWatch logsのロググループの作成
CloudWatchからロググループを選択し、任意のロググループを作成します。

#### VPCフローログの作成
ネットワークインターフェースのフローログを取得する場合は、以下の設定を行います。

EC2の「ネットワークインターフェース」ペインから、取得するEC2インスタンスのネットワークインターフェースの「フローログ」のタブを選択し、「フローログの作成」を押します。

![スクリーンショット 2022-12-27 17.19.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/158245d2-0e3e-c98a-1df6-fb005ad0417a.png)

「フローログの作成」画面に遷移します。
「フローログの設定」の「Name」を入力します。

![スクリーンショット 2022-12-27 16.55.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/45451ea3-84c7-5845-e863-c01ae9fc32cf.png)

上記で作成したロググループとIAMロールを選択し、「フローログの作成」を押します。
その他の設定は便宜上、デフォルトとしています。

![スクリーンショット 2022-12-27 16.56.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/711e86c7-0562-9d7c-1ff5-cb792efca46e.png)

しばらくすると、ステータスが「アクティブ」に変わったことが確認できます。

![スクリーンショット 2022-12-27 16.38.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/4a8c4b09-57b8-a3c9-b7ec-6ca2475b7bd3.png)

:::note warn
ロールに適切な権限がない場合、ステータスはエラーになります。
:::

### フローログ動作確認
EC2インスタンスのOSイメージは、Amazon Linuxです。

デフォルトの場合、クライアントのリゾルバは以下の設定です。
`nameserver`については、公式ドキュメントの[Amazon DNS サーバー](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-dns.html#AmazonDNS)から詳細が確認できます。

- /etc/resolv.conf

```
options timeout:2 attempts:5
; generated by /usr/sbin/dhclient-script
search ap-northeast-1.compute.internal
nameserver 10.0.0.2
```

上記設定の場合は、DNSに関する通信についてフローログでは記録できないため、設定を変更します。

```conf
options timeout:2 attempts:5
; generated by /usr/sbin/dhclient-script
search ap-northeast-1.compute.internal
nameserver 8.8.8.8
```

EC2インスタンスから名前解決が行われた場合、ログイベントを参照すると、以下の通りに8.8.8.8は記録できることが確認できます。

![スクリーンショット 2022-12-27 17.12.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a5caa93e-aeb5-1520-732c-5a949b2b3bbc.png)

## DNSクエリログ
**DNSクエリログ**は、指定したVPCで発生するAWSのDNSサーバに対するDNSクエリを記録することができます。

設定はRoute 53から行います。

::: note warn
DNSクエリログでは、DNSクライアントに外部のDNSサーバを用いて名前解決を行う場合は、記録されません。
記録できるのはAWSのDNSサーバの通信のみです。
:::

### DNSクエリログの設定
「Route 53」の「クエリのログ記録」ペインから、「クエリログ記録の設定」を押します。

![スクリーンショット 2022-12-27 17.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/e4243939-afee-9ea6-88ba-0e003ef1b7be.png)

「名前」と、「CloudWatch Logs のロググループ」を入力します。

![スクリーンショット 2022-12-27 17.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/d011a0cb-b649-8a7f-b77c-8d126667e326.png)

「VPCを追加」を押して、VPCを追加した後に、「クエリログの設定」を押します。

![スクリーンショット 2022-12-27 17.30.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/3e04ca9e-c344-7ac5-08c4-a1cd5d8e2196.png)

「クエリログの設定」が完了しました。

![スクリーンショット 2022-12-27 17.33.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/a836b36e-b463-2eac-5110-3d4679939713.png)

「クエリがログに記録される VPC」を見ると、ログ記録のステータスがACrtiveになっていることが確認できます。

![スクリーンショット 2022-12-27 17.35.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/dcac0201-2409-0497-67eb-cdcf537c9b4e.png)

### クエリログ動作確認
DNSリゾルバの設定は以下の通りに、デフォルトの状態（AWSのDNSサーバ）です。

- /etc/resolv.conf

```
options timeout:2 attempts:5
; generated by /usr/sbin/dhclient-script
search ap-northeast-1.compute.internal
nameserver 10.0.0.2
```

EC2インスタンスから名前解決が行われた場合、ログイベントを参照すると、以下の通りにAWSのDNSサーバは記録できることが確認できます。

![スクリーンショット 2022-12-27 17.41.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/f2ed8e12-ee26-03c7-f77c-d8803d379d6c.png)

またレコードをクリックすると、詳細についてJSON形式で確認することができます。

![スクリーンショット 2022-12-27 17.41.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221759/eea82104-627c-adc9-2f7c-0e250bf9b0be.png)

# おわりに
セキュリティインシデントに備えて、必要に応じて証跡を取得することは、クラウドを利用する場合も変わりません。

## 参考
- [CloudWatch Logs へのフローログの発行](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs-cwl.html)
- [VPC フローログを使用した IP トラフィックのログ記録](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/flow-logs.html)
- [リゾルバーでのクエリのログ記録](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resolver-query-logs.html)