Help us understand the problem. What is going on with this article?

[JAWS-UG CLI] S3:#7 CloudTrail用バケットの作成

More than 5 years have passed since last update.

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. 事前作業

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.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/

2. バケットポリシーファイルの作成

バケットポリシーファイルを作成します。

コマンド
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

3. バケットポリシーの適用

S3バケットにバケットポリシーを適用します。

コマンド
aws s3api put-bucket-policy \
  --bucket ${S3_BUCKET_NAME} \
  --policy file://${FILE_S3_BUCKET_POLICY}
結果
(戻り値なし)

4. バケットポリシーの確認

コマンド
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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away