VPCフローログを取得する構成
VPCフローログを確認します。
VPCフローログはVPC内のトラフィック情報を取得することができるサービスです。
VPC フローログは、VPC のネットワークインターフェイスとの間で行き来する IP トラフィックに関する情報をキャプチャできるようにする機能です。フローログデータは Amazon CloudWatch Logs または Amazon S3 に発行できます。
VPC フローログ
上記の通り、VPCフローログの出力先はCloudWatch LogsかS3が選択可能ですが、今回は両方に同様の内容を出力します。
構築する環境
VPCフローログを2つ用意します。それぞれ上記のサブネット内のトラフィック情報を取得するように設定し、その出力先をS3バケットと、CloudWatch Logsのロググループを指定します。
VPCフローログの検証方法ですが、一方のインスタンスからもう一方のインスタンスにPingを実行し、そのトラフィックをサブネットレベルでキャプチャします。
環境構築用のCloudFormationテンプレートファイル
上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置します。
https://github.com/awstut-an-r/awstut-fa/tree/main/014
テンプレートファイルのポイント解説
今回の環境を構成するための、各テンプレートファイルのポイントを取り上げます。
VPCフローログを設定する – S3バケット
fa-014-flowlog.yamlでVPCフローログ関係のリソースを定義します。
まずS3バケットにVPCフローログを保存する方法を確認します。
Resources:
FlowLogBucket:
Type: AWS::S3::Bucket
Properties:
AccessControl: Private
BucketName: !Ref Prefix
FlowLogToS3:
Type: AWS::EC2::FlowLog
DependsOn:
- FlowLogBucket
Properties:
LogDestination: !GetAtt FlowLogBucket.Arn
LogDestinationType: s3
ResourceId: !Ref PrivateSubnet
ResourceType: Subnet
TrafficType: ALL
Code language: YAML (yaml)
S3バケットの作成に関しては、特別な設定は不要です。今回はバケット名およびACLに関する設定のみ実施します。
次にS3バケットにログを配信する場合の、VPCフローログの設定を確認します。
LogDestinationTypeおよびLogDestinationプロパティで、ログの保存先を指定します。こちらのVPCフローログは先述のS3バケットに保存しますので、前者に「s3」を、後者にバケットのARNを指定します。
ResourceTypeおよびResourceIdプロパティ、VPCフローログを取得する対象を指定します。前者はVPCフローログを取得する対象のタイプを指定します。
The type of resource for which to create the flow log. For example, if you specified a VPC ID for the ResourceId property, specify VPC for this property.
Allowed values: NetworkInterface | Subnet | VPC
AWS::EC2::FlowLog
今回はインスタンスが設置されているサブネットのログを取得しますので、「Subnet」を指定します。
後者は取得する対象のリソースIDを指定します。
The ID of the subnet, network interface, or VPC for which you want to create a flow log.
AWS::EC2::FlowLog
今回はインスタンスが設置されているサブネットのログを取得しますので、組み込み関数Fn::Refを使用して、サブネットのIDを指定します。
TrafficTypeプロパティは取得するトラフィックの種類を指定します。
The type of traffic to log. You can log traffic that the resource accepts or rejects, or all traffic.
Allowed values: ACCEPT | ALL | REJECT
AWS::EC2::FlowLog
今回はVPCフローログの検証ということで、全てのログを取得することとし、「ALL」を指定します。
VPCフローログを設定する – CloudWatch Logs
続いてCloudWatch LogsにVPCフローログを保存する方法を確認します。
Resources:
FlowLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub "${Prefix}-FlowLogGroup"
FlowLogToCloudWatchLogs:
Type: AWS::EC2::FlowLog
DependsOn:
- FlowLogGroup
Properties:
DeliverLogsPermissionArn: !GetAtt DeliverLogRole.Arn
LogDestinationType: cloud-watch-logs
LogGroupName: !Sub "${Prefix}-FlowLogGroup"
ResourceId: !Ref PrivateSubnet
ResourceType: Subnet
TrafficType: ALL
DeliverLogRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: sts:AssumeRole
Principal:
Service:
- vpc-flow-logs.amazonaws.com
Policies:
- PolicyName: DeliverToCloudWatchLogPolicy
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
- logs:DescribeLogGroups
- logs:DescribeLogStreams
Resource: "*"
Code language: YAML (yaml)
CloudWatch Logsのロググループ作成に関しても、特別な設定は不要です。今回はロググループの名前のみ設定します。
次にCloudWatch Logsにログを配信する場合の、VPCフローログの設定を確認します。
LogDestinationTypeおよびLogGroupNameプロパティでログの保存先を指定します。こちらのVPCフローログは先述のCloudWatch Logsに保存しますので、前者に「cloud-watch-logs」を、後者にロググループの名前を指定します。
DeliverLogsPermissionArnプロパティに、ロググループに対してVPCフローログを配信するために必要な権限を含むIAMロールを指定します。
VPCフローログを配信するために必要な権限ですが、CloudWatch Logs へのフローログ発行のための IAM ロールを参考にして、IAMロールを作成しました。
環境構築
CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。
CloudFormationスタックを作成し、スタック内のリソースを確認する
CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- Instance1のID:i-095751cafaf667e27
- Instance2のID:i-0a0f8ccf1ddd2eead
- Instance1のIPアドレス:10.0.1.22
- Instance2のIPアドレス:10.0.1.25
- Instance1のENIのID:eni-01d89470fafe7a86b
- Instance2のENIのID:eni-0e61c483ca317dd54
- S3バケット名:fa-014
- CloudWatch Logsロググループ名:fa-014-FlowLogGroup
- サブネットのID:subnet-0d3d1285e6b822ae1
AWS Management ConsoleでVPCフローログの作成状況を確認します。
確かにサブネットに2つのVPCフローログが設定されていることがわかります。
事前準備 – SSM Session Manager経由でインスタンスにアクセス
準備が整いましたので、インスタンスにアクセスします。
SSM Session Managerを使用して、Instance1にアクセスします。
$ aws ssm start-session \
--target i-095751cafaf667e27
Starting session with SessionId: root-0ab5acb07686fac90
sh-4.2$
Code language: Bash (bash)
正常にアクセスすることができました。
SSM Session Managerに関しては、以下をご確認ください。
続いてInstance2(10.0.1.25)にPingを実行します。
sh-4.2$ ping 10.0.1.25
PING 10.0.1.25 (10.0.1.25) 56(84) bytes of data.
64 bytes from 10.0.1.25: icmp_seq=1 ttl=255 time=0.124 ms
64 bytes from 10.0.1.25: icmp_seq=2 ttl=255 time=0.157 ms
64 bytes from 10.0.1.25: icmp_seq=3 ttl=255 time=0.134 ms
64 bytes from 10.0.1.25: icmp_seq=4 ttl=255 time=0.160 ms
...
Code language: Bash (bash)
Instance2から応答がありました。これで準備が整いました。
検証1 – S3バケット内のVPCフローログを確認する
S3バケットに配信されたVPCフローログを確認します。
今回では、以下の画像のように、S3バケットにログファイルが設置されました。
このようにVPCフローログファイルはgzipで圧縮されて保管されます。
1つをダウンロードし、中身を確認します。以下がその一例です。
version account-id interface-id srcaddr dstaddr srcport dstport protocol packets bytes start end action log-status
...
2 [account-id] eni-0e61c483ca317dd54 10.0.1.22 10.0.1.25 0 0 1 57 4788 1641597879 1641597903 ACCEPT OK
2 [account-id] eni-0e61c483ca317dd54 10.0.1.25 10.0.1.22 0 0 1 57 4788 1641597879 1641597903 ACCEPT OK
...
Code language: Bash (bash)
VPCフローログの見方はフローログレコードに詳しいですが、「srcaddr」および「dstaddr」の値が2インスタンスのもののレコードがあり、「action」が「ACCEPT」とあります。両インスタンスのPingによるやり取りが、S3バケットに配信されたVPCフローログに正常に記録されていることがわかります。
検証2 – CloudWatch Logs内のVPCフローログを確認する
続いてCloudWatch Logsに配信されたVPCフローログを確認します。
まずロググループの状況を確認します。
ロググループ内にENI単位でストリームが作成されていることがわかります。
次にInstance1のENI用のストリームの中身を確認します。
こちらにも見方は同じです。CloudWatch Logsに配信されたVPCフローログに、正常に記録されていることがわかります。
まとめ
VPCフローログを取得する方法を確認しました。
VPCフローログはS3バケットまたはCloudWatch Logsに配信することが可能で、どちらも同様の内容を取得できることを確認しました。