LoginSignup
1
1

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-01-19

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1