AWS re:Invent2013参加レポート #6 AWS CloudTrailを使ってサーバーを起動した時刻と接続元を確認する

reinvent-logo

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

AWS CloudTrailでどんなデータが取得できるのか?

先ほど、AWS re:Inventのキーノートで発表されていたAWS CloudTrailですが、実際に使えるようになったので試してみました。今回は、EC2インスタンスを起動したのは、誰がいつどこからアクセスして起動したのか確認したいと思います。

セットアップ

メニューに追加されていますね。

screenshot_2013-11-13_13.25.36-4

追加・更新画面です。

screenshot 2013-11-13 13.29.25

Amazon SNSのトピックを指定します。指定したトピックを購読すればイベント駆動でメールを飛ばしたりできますね。

screenshot 2013-11-13 13.23.29

しばらく待つとS3バケットにオブジェクトが追加されました!

screenshot_2013-11-13_13.21.23-4

中身の確認をする

それではオブジェクトを取得して解析してみましょう

$ aws s3 ls s3://satoshidemo
PRE AWSLogs/

$ aws s3 ls s3://satoshidemo/AWSLogs/************/CloudTrail/us-east-1/2013/11/13/
2013-11-13 13:25:31       2263 ************_CloudTrail_us-east-1_20131113T2115Z_kFqMBiiOHK6pWPrc.json.gz

$ gunzip -d ************_CloudTrail_us-east-1_20131113T2115Z_kFqMBiiOHK6pWPrc.json,gz
$ mv ************_CloudTrail_us-east-1_20131113T2115Z_kFqMBiiOHK6pWPrc.json sample.json

jsonファイルをパースします。ここではjqを使って実行されたコマンドを全て列挙してみましょう。

$ cat sample.json | jq '.[]' | jq '.[]' | jq '.eventName'
"DescribeNetworkAcls"
"DescribeTrails"
"DescribeInternetGateways"
"DescribeNetworkAcls"
"DescribeVolumeStatus"
"DescribeVpcs"
"DescribeTrails"
"DescribeTrails"
"DescribeCustomerGateways"
"DescribePlacementGroups"
"DescribeTrails"
"DescribeSecurityGroups"
"DescribeAvailabilityZones"
"RunInstances"
"CreateSecurityGroup"
"DescribeAddresses"
"DescribeSecurityGroups"
"DescribeVpnConnections"
"DescribeInstanceStatus"
"DescribeRouteTables"
"DescribeVpnGateways"
"DescribeInstances"
・・・

$ cat sample.json | jq '.[]' | jq '.[]' | jq '.eventName' | grep 'RunInstance'
"RunInstances"

EC2インスタンスが起動された時間を取得する

ちょっと応用編としてやってみたいと思います。以下は、AWS管理コンソールからEC2を起動した時刻と接続元IPアドレスを抽出しています。

$ cat sample.json | jq '.[]' | jq '.[] | select(.eventName== "RunInstances")'| jq '.userAgent, .eventName, .eventTime ,.sourceIPAddress'

"EC2ConsoleBackend"
"RunInstances"
"2013-11-13T21:21:00Z"
"65.160.18.XXX"

まとめ

リリースしたばかりのAWS CloudTrailですが、アウトプットはS3バケット内にJSONファイルが置かれるだけですので、実際の運用では、そのままデータベースに入れるとか、EMRで集計するとか何かしらの処理を行って利用者にとって分かりやすい形にする必要がありますね。かなり細かいデータが取れますので、エンタープライズ利用においてクラウド利用のガバナンスのためには必須な機能になりそうです。