新サービス『AWS CloudTrail』のユーザーガイドを読んでみた / ログファイルの取得とAmazon S3バケットへの集約

2013.11.16

シリーズ第5弾は『ログファイルの取得とAmazon S3バケットへの集約』です。実際にどのようにログファイルが生成され、また取得集約が可能なのか、見て行きましょう。

目次

 

CloudTrailログファイルの取得

CloudTrailでは、ログファイルを指定のAmazon S3バケットに生成します。一般的には、ログファイルはAPIを呼び出してから15分以内にバケットに生成されます。そしてログファイルは以後5分毎に公開される形となります。

 

ログファイルを見つける

CloudTrailはログをバケット内にgzipアーカイブ形式で生成します。ログファイルの完全なURLは以下要素を用いて構成されます。

  • Amazon S3コンソールのルートURL
  • 指定のバケット名
  • Trail(証跡)に指定したプレフィックス
  • AWSリージョン名(例:us-west-2)
  • 年(yyyy)
  • 月(mm)
  • 日(DD)
  • ログファイル内の最も古いイベント時刻を示すタイムスタンプ:このタイムスタンプはISO8601の基本的な形式を使用。
  • 同じ時刻をカバーしている他のファイルとの区別をする為の英数文字

以下URLはバケットとプレフィックスが指定されている完全な例です。

https://s3-us-west-2.amazonaws.com/<bucket_name>/<prefix_name>/AWSLogs/<AccountID>/CloudTrail/
us-west-2/2013/10/25/<AccountID>_CloudTrail_us-west-2_2013-10-25T22:25Z_bPlKAoJtDqSWWlTT.json.gz

実際に生成されたログファイルのバケット構成を見てみます。

cloudtrail-log

 

ログファイルを扱う

ログファイルはJSON形式で書かれています。詳細な内容は以下リファレンスページをご参照ください。

ちなみに上記バケットに生成されていたログファイルの内容はこんな感じでした。

{"Records":[
{
  "eventVersion":"1.0",
  "userIdentity":{
    "type":"IAMUser",
    "principalId":"XXXXXXXXXXXXX",
    "arn":"arn:aws:iam::XXXXXXXXXXXX:user/xxxxxxxxxxxx",
    "accountId":"XXXXXXXXXXXXX",
    "userName":"xxxxxxxxxxxxxx",
    "invokedBy":"signin.amazonaws.com"
  },
  "eventTime":"2013-11-14T17:15:36Z",
  "eventSource":"sts.amazonaws.com",
  "eventName":"GetSessionToken",
  "awsRegion":"us-east-1",
  "sourceIPAddress":"signin.amazonaws.com",
  "userAgent":"signin.amazonaws.com",
  "requestParameters":{
    "durationSeconds":43200
  },
  "responseElements":{
    "credentials":{
      "sessionToken":"XxXxXxxX(中略)xxxXXx",
      "accessKeyId":"XXXXXXXXXXXXXX",
      "expiration":"Nov 15, 2013 5:15:36 AM"
    }
  }
 },
 :
 :
]}

 

Amazon S3バケットへのログファイルの集約

AWS CloudTrailでは、複数のリージョン/アカウントから単一のAmazon S3バケットにログファイルを集約させる事が出来ます。このセクションでは複数の地域やアカウント全体でCloudTrailログファイルを集約する手順について、3つのシナリオに分けて見て行きます。

 

シナリオ1. 単一アカウント/複数リージョンでのリソース集約

CT1-OneAccount-ManyRegions

構築には以下の手順が必要となるようです。

  • 1.アカウント内でCloudTrailを有効化。1つの地域でのみ行う事を確認。
  • 2.対象となるバケットにクロスリージョンのCloudTrailへのアクセス許可が設定されている事を確認。CloudTrailでバケットを作成していた場合はこの権限は既に付与されています。
  • 3.リソースを持っている他のリージョンでもCloudTrailを有効化、CloudTrailの設定で前項で定めたものと同じバケットを指定。アカウント内でCloudTrailを有効化する際は、新しいAmazon S3バケットを作成する事がオススメのようです。これは推奨される形であり、クロスリージョンアクセスに関連した権限が自動的に付与されたものになり、追加のCloudTrailを有効にすると全ての地域からのログファイルが単一のバケットに集約されるようになります。

既存のバケットを使用する場合やCloudTrailのログファイル配信先となるAmazon S3バケットを変更した場合はバケットポリシーを変更する必要があります。以下例はバケットに適用するポリシーの一例です。(これまでのエントリで作成したCloudTrailで生成されているS3バケットの内容を参照してみました)

Principal/AWSの中にあるAWS IAMのARN、086441151436はus-east-1リージョン(N.ヴァージニア)のCloudTrailアカウントナンバー、113285607260はus-west-2リージョン(オレゴン)のCloudTrailアカウントナンバーになります。

$ aws s3api get-bucket-policy --bucket cm-cloudtrail-demo
{
    "Version": "2008-10-17", 
    "Statement": [
        {
            "Action": "s3:GetBucketAcl", 
            "Principal": {
                "AWS": [
                    "arn:aws:iam::086441151436:root", 
                    "arn:aws:iam::113285607260:root"
                ]
            }, 
            "Resource": "arn:aws:s3:::cm-cloudtrail-demo", 
            "Effect": "Allow", 
            "Sid": "AWSCloudTrailAclCheck20131101"
        }, 
        {
            "Resource": "arn:aws:s3:::cm-cloudtrail-demo/cm-cloudtrail-/AWSLogs/xxxxxxxxxxxxxxx/*", 
            "Effect": "Allow", 
            "Sid": "AWSCloudTrailWrite20131101", 
            "Action": "s3:PutObject", 
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }, 
            "Principal": {
                "AWS": [
                    "arn:aws:iam::086441151436:root", 
                    "arn:aws:iam::113285607260:root"
                ]
            }
        }
    ]
}

 

シナリオ2. 複数アカウント/単一リージョンでのリソース集約

CT2-many-accounts-oneregion

多くの組織でそうであるように、複数アカウントを所有しているケースでひとつのバケットにログ内容をまとめる場合のシナリオです。一方のアカウントのみにCloudTrail設定をONにし、クロスアカウントのアクセスを許可するバケットポリシーを更新。他アカウントで先行したアカウントで作成したバケットを指定する事で実現出来るようです。28行目にクロスアカウント経由の情報が追記される、という訳ですね。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSCloudTrailAclCheck20131101",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::086441151436:root",
          "arn:aws:iam::113285607260:root"
        ]
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::myBucketName"
    },
    {
      "Sid": "AWSCloudTrailWrite20131101",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::086441151436:root",
          "arn:aws:iam::113285607260:root"
        ]
      },
      "Action": "s3:PutObject",
      "Resource": [
        "arn:aws:s3:::myBucketName/myLogFilePrefix/AWSLogs/MyAccountNumber_1/*",
        "arn:aws:s3:::myBucketName/myLogFilePrefix/AWSLogs/MyAccountNumber_2/*"
      ],
      "Condition": {
        "StringEquals": {
          "s3:x-amz-acl": "bucket-owner-full-control"
        }
      }
    }
  ]
}

 

シナリオ3. 複数アカウント/複数リージョンでのリソース集約

複数のリージョン内のAWSリソースを操作する複数のAWSアカウントのCloudTrailログファイル集約を記述する事で前2つのシナリオを拡張したものです。ポリシーファイルの内容的にはシナリオ2のものと変わらない内容で行ける模様。

CT3-many-accounts-many-regions

まとめ

CloudTrailのTrail(証跡)設定同様、リージョン間のバケット共有設定等についてもIAM情報・バケットポリシーの設定で比較的簡潔に行えそうです。ログをどのように活用・利用して行くかはこれからの検討課題ではありますが、Trailの設定・ログ出力内容については早急に対応を進めてしまっても良さそうですね!