話題の記事

【新機能】VPC Flow LogsでVPC内のIPトラフィックを監視することができるようになりました!

2015.06.11

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

こんにちは、せーのです。今日は障害監視やネットワークの不通時などに非常に役立ちそうな新機能をご紹介します。

VPC Flow Logs

システムを構築する場合、特に業務サービスを展開する場合はネットワーク内部のフロー通信ログを監視、分析してネットワーク内に異常なアクセスがないか、通信すべき経路が不通なことは無いかを確認しておくことは運用上非常に重要な要件となります。今回の新機能となるVPC Flow LogsでVPC内のNetwork Interface間のIPトラフィックをキャプチャすることができるようになりました!

VPC Flow Logs データはCloudWatch Logsに格納され、自由に可視化することが出来ます。CloudWatch Logsに格納される、ということはあらかじめ特定のトラフィックを設定しておくことでアラートを発生させることもできるわけです。Lambdaを組み合わせて緊急的にトラフィックを遮断したり、管理者に対してWarningメールを投げたりとあらゆるセキュリティ施策と組み合わせる事もできます。 セキュリティ以外にもカスタムメトリクスを設定することでどういう通信が多いのか、それによってどのようにアプリケーションやAWSインフラの構成を変えるべきなのかを判断する条件として利用することもできます。これは夢が広がりますね!

VPC FLow Logsの中身

VPC Flow Logsにはこのようなデータが含まれます。

フィールド 内容
version VPC Flow Logsのバージョン
account-id アカウントID
interface-id 対象となるNetwork Interface ID
srcaddr 送信元IPアドレス(プライベートIP)
dstaddr 宛先IPアドレス(プライベートIP)
srcport 送信元ポート
dstport 宛先ポート
protocol プロトコル番号
packets 転送パケット数
bytes 転送バイト数
start キャプチャ開始時刻(Unix)
end キャプチャ終了時刻(Unix)
action アクション(ACCEPT:許可 / REJECT:拒否)
log-status ステータス(OK:正常 / NODATA:トラフィックなし / SKIPDATA:エラーやキャパシティ制限によりスキップ)

制限事項

VPC FLow Logsの制限事項は

  • EC2 Classicには使えない
  • VPC Peeringには使えない
  • タグ付けはできない
  • 一度Flow Logsを作成したら変更はできない(IAMロールの変更等)。変更する場合は一度削除してから作り直す
  • リソースレベルのアクセス許可はできない。Flow Logsを使用する際は全てのリソースに対してワイルドカードにてLogsに対して権限を付与する必要がある

記録されないログパターン

VPC Flow Logsはこれらのトラフィックは記録しません。

  • インスタンスからAmazon DNSに対して生成されるトラフィック(独自DNSサーバーを使用する場合は記録される)
  • WindowsインスタンスからWindowsアクティベートの為に生成されるトラフィック
  • インスタンスmetaデータ(169.254.169.254)へのトラフィック
  • DHCPトラフィック

やってみた

では早速やってみましょう。まずFlow Logsを格納するCloudWatch Logsのグループを作成しておきます。

VPCFlowLogs5

それではVPCを一つ作成します。作成したVPCを選択しActionsボタンから[Create Flow Log]をクリックします。

VPCFlowLogs1

Flow Logsの作成画面がポップアップされますので適用するIAM Roleを選択します。今回は[Set Up Permissions]リンクから新規に作成します。

VPCFlowLogs2

IAM Roleの作成画面です。このようなポリシーが自動生成されていますのでそのまま許可してみましょう。ポイントはResource全てに対してLogsアクションが許可されているところですね。

VPCFlowLogs3

IAM Roleの作成後にFlow Logsの作成画面に戻ると先程作ったIAM Roleが選択できるようになっています。

VPCFlowLogs4

次に最初に作ったCloudWatch LogsのグループをFlow Logsの格納先として選択します。これで作成ボタンを押せば選択したVPCに対してFlow Logsが作成されます。

VPCFlowLogs6

ではその他のリソースをサクッと作ってみましょう。今回はサブネットを2つ作成し、そこにEC2を1つずつ立てました。セキュリティグループとしてはSSH(22)とHTTP(80)を許可し、EC2の中にApacheを立ててみます。SSHでのログイン、ping通信、外部からそれぞれのEC2へのアクセスを行います。Flow Logsは約15分後に作成されます。

    $ ssh ec2-user@52.68.30.223 -i ~/dev/key/cm_experimentation.pem
    Warning: Permanently added '52.68.30.223' (RSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

    https://aws.amazon.com/amazon-linux-ami/2015.03-release-notes/
    [ec2-user@ip-10-0-0-147 ~]$ sudo yum update -y
    [ec2-user@ip-10-0-0-147 ~]$ sudo yum install httpd -y
    [ec2-user@ip-10-0-0-147 ~]$ sudo /etc/init.d/httpd start
    httpd を起動中: httpd: apr_sockaddr_info_get() failed for ip-10-0-0-147
    httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                              [  OK  ]
    [ec2-user@ip-10-0-0-147 ~]$ ping 10.0.1.12
    PING 10.0.1.12 (10.0.1.12) 56(84) bytes of data.
    64 bytes from 10.0.1.12: icmp_seq=52 ttl=64 time=2.36 ms
    64 bytes from 10.0.1.12: icmp_seq=53 ttl=64 time=2.41 ms
    64 bytes from 10.0.1.12: icmp_seq=54 ttl=64 time=2.32 ms
    64 bytes from 10.0.1.12: icmp_seq=55 ttl=64 time=2.32 ms
    64 bytes from 10.0.1.12: icmp_seq=56 ttl=64 time=2.39 ms
    64 bytes from 10.0.1.12: icmp_seq=57 ttl=64 time=2.32 ms

    --- 10.0.1.12 ping statistics ---
    61 packets transmitted, 10 received, 83% packet loss, time 60634ms
    rtt min/avg/max/mdev = 2.284/2.362/2.427/0.059 ms

VPCFlowLogs8

ではCloudWatch Logsを見てみましょう。

VPCFlowLogs9

VPCFlowLogs10

おお、入っていますね。ブラウザアクセスの80番もキッチリ記録されています。これは色々つかえそうですね!

まとめ

いかがでしたでしょうか。トラフィック監視はかなり重要な機能となります。恐らく構築時のスタンダードとなるのではないでしょうか。是非とも設定方法を覚えてしまいましょう!

参考サイト