http://jawsug-cli.doorkeeper.jp/events/18569 でのハンズオン資料です。
AWS CLIを利用して、CloudTrailのログ保存用のバケットを作成してみます。
前提条件
S3への権限
概ね以下の権限が必要です。
{
"Effect": "Allow",
"Action": [
"s3:CreateBucket",
"s3:GetBucketAcl",
"s3:GetBucketLocation",
"s3:GetBucketNotification",
"s3:GetBucketPolicy",
"s3:GetObject",
"s3:ListAllMyBuckets",
"s3:ListBucket",
"s3:PutBucketPolicy"
],
"Resource": "arn:aws:s3:::trail-*"
}
AWS CLIのバージョン
以下のバージョンで動作確認済
- AWS CLI 1.7.0
- 事前作業
=======================
0.1. リージョンの指定
リージョンを指定します。
export AWS_DEFAULT_REGION='ap-northeast-1'
このハンズオンでは、AWS標準のリージョン変数を利用していますが、regionオプションでコマンド毎に指定しても同様の結果になります。
( 「オペミスを回避するために明示的に実行する」という意味ではregionオプションの方が良いです。)
0.2. AWSアカウントIDの取得
バケットポリシー作成のときに必要となります。
AWS_ID=`aws iam get-user --query 'User.Arn' --output text | sed 's/^.*:://' | sed 's/:.*$//'` \
&& echo ${AWS_ID}
- バケットの作成
====================
1.1. S3バケット名の決定
バケット名を決めます。
ここでは、trail-${AWS_DEFAULT_REGION}-${組織名}をバケット名とします。
ORG_NAME='example-jp'
S3_BUCKET_NAME="trail-${AWS_DEFAULT_REGION}-${ORG_NAME}" && echo ${S3_BUCKET_NAME}
1.2. バケット名の未使用確認
バケット名が空いていることを確認します。
aws s3 ls s3://${S3_BUCKET_NAME}
A client error (NoSuchBucket) occurred when calling the ListObjects operation: The specified bucket does not exist
1.3. バケットの作成
S3バケットを作成します。
aws s3 mb s3://${S3_BUCKET_NAME}
make_bucket: s3://trail-ap-northeast-1-example-jp/
- バケットポリシーファイルの作成
=================================
バケットポリシーファイルを作成します。
FILE_S3_BUCKET_POLICY='BucketPolicy-CloudTrail-ap-northeast-1.json'
cat << EOF > ${FILE_S3_BUCKET_POLICY}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSCloudTrailAclCheck20131101",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::903692715234:root",
"arn:aws:iam::035351147821:root",
"arn:aws:iam::859597730677:root",
"arn:aws:iam::814480443879:root",
"arn:aws:iam::216624486486:root",
"arn:aws:iam::086441151436:root",
"arn:aws:iam::388731089494:root",
"arn:aws:iam::284668455005:root",
"arn:aws:iam::113285607260:root"
]
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::${S3_BUCKET_NAME}"
},
{
"Sid": "AWSCloudTrailWrite20131101",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::903692715234:root",
"arn:aws:iam::035351147821:root",
"arn:aws:iam::859597730677:root",
"arn:aws:iam::814480443879:root",
"arn:aws:iam::216624486486:root",
"arn:aws:iam::086441151436:root",
"arn:aws:iam::388731089494:root",
"arn:aws:iam::284668455005:root",
"arn:aws:iam::113285607260:root"
]
},
"Action": "s3:PutObject", "Resource": "arn:aws:s3:::${S3_BUCKET_NAME}/AWSLogs/${AWS_ID}/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
EOF
JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。
$ cat ${FILE_S3_BUCKET_POLICY} | json_verify
JSON is valid
json_verifyでエラーが出たときはjsonlintでチェックします。
$ cat ${FILE_S3_BUCKET_POLICY}| jsonlint
- バケットポリシーの適用
==============================
S3バケットにバケットポリシーを適用します。
aws s3api put-bucket-policy \
--bucket ${S3_BUCKET_NAME} \
--policy file://${FILE_S3_BUCKET_POLICY}
(戻り値なし)
- バケットポリシーの確認
============================
aws s3api get-bucket-policy --bucket ${S3_BUCKET_NAME}
{
"Policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"AWSCloudTrailAclCheck20131101\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"arn:aws:iam::903692715234:root\",\"arn:aws:iam::035351147821:root\",\"arn:aws:iam::859597730677:root\",\"arn:aws:iam::814480443879:root\",\"arn:aws:iam::216624486486:root\",\"arn:aws:iam::086441151436:root\",\"arn:aws:iam::388731089494:root\",\"arn:aws:iam::284668455005:root\",\"arn:aws:iam::113285607260:root\"]},\"Action\":\"s3:GetBucketAcl\",\"Resource\":\"arn:aws:s3:::trail-ap-northeast-1-example-jp\"},{\"Sid\":\"AWSCloudTrailWrite20131101\",\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"arn:aws:iam::903692715234:root\",\"arn:aws:iam::035351147821:root\",\"arn:aws:iam::859597730677:root\",\"arn:aws:iam::814480443879:root\",\"arn:aws:iam::216624486486:root\",\"arn:aws:iam::086441151436:root\",\"arn:aws:iam::388731089494:root\",\"arn:aws:iam::284668455005:root\",\"arn:aws:iam::113285607260:root\"]},\"Action\":\"s3:PutObject\",\"Resource\":\"arn:aws:s3:::trail-ap-northeast-1-example-jp/AWSLogs/XXXXXXXXXXXX/*\",\"Condition\":{\"StringEquals\":{\"s3:x-amz-acl\":\"bucket-owner-full-control\"}}}]}"
}
完了
次に、CloudTrail通知用のSNSトピックを作成します。
http://qiita.com/tcsh/items/8e86e021acbe80d85138