[JAWS-UG CLI] IAM:#6 CloudTrail構築用グループとユーザを作成する

http://jawsug-cli.doorkeeper.jp/events/18569 でのハンズオン資料です。

AWS CLIを利用して、CloudTrailの初期構築に必要なIAMグループとIAMユーザを作成してみます。

前提条件
========

## IAMへの権限

* IAMに対してフル権限があること。

## AWS CLIのバージョン

以下のバージョンで動作確認済

* AWS CLI 1.7.0


0. 事前準備
===========

0.1. IAMグループの決定
---------------------------------

```bash:コマンド::
IAM_GROUP_NAME="cloudtrail-builder"
```

IAMグループの重複確認

同じ名前のIAMグループが存在しないことを確認します。

```bash:コマンド::
aws iam get-group --group-name ${IAM_GROUP_NAME} --query 'Group'
```

```text:結果:
A client error (NoSuchEntity) occurred when calling the GetGroup operation: The group with name cloudtrail-builder cannot be found.
```

0.2. IAMユーザの決定
---------------------------------

```bash:コマンド::
IAM_USER_NAME='cloudtrail-builder'
```


IAMユーザの重複確認

同じ名前のIAMユーザが存在しないことを確認します。

```bash:コマンド:
aws iam get-user --user-name ${IAM_USER_NAME}
```

```text:結果:
A client error (NoSuchEntity) occurred when calling the GetUser operation: The user with name cloudtrail-builder cannot be found.
```


1. グループの作成
==================


1.1. IAMグループの作成
-----------------------

IAMグループを作成します。

```bash:コマンド:
aws iam create-group --group-name ${IAM_GROUP_NAME}
```

```json:結果:
{
    "Group": {
        "Path": "/", 
        "CreateDate": "2015-01-17T11:33:25.902Z", 
        "GroupId": "AGPAXXXXXXXXXXXXXXXXX", 
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/cloudtrail-builder", 
        "GroupName": "cloudtrail-builder"
    }
}
```

1.2. IAMグループの確認
-----------------------

```bash:コマンド:
aws iam get-group --group-name ${IAM_GROUP_NAME}
```

```json:結果:
{
    "Group": {
        "Path": "/", 
        "CreateDate": "2015-01-19T06:36:27Z", 
        "GroupId": "AGPAXXXXXXXXXXXXXXXXX", 
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/cloudtrail-builder", 
        "GroupName": "cloudtrail-builder"
    }, 
    "Users": []
}
```

2. グループポリシーの適用
==========================

2.1. IAMグループポリシーの作成
---------------------------------

```bash:コマンド::
FILE_IAM_POLICY='cloudtrail-builder.json'
S3_BUCKET_PREFIX='trail-'
```

ポリシーファイルを作成します。

```bash:コマンド::
cat << EOF > ${FILE_IAM_POLICY}
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "sns:AddPermission",
        "sns:CreateTopic",
        "sns:GetTopicAttributes",
        "sns:ListTopics",
        "sns:ListSubscriptionsByTopic",
        "sns:Subscribe",
        "sns:SetTopicAttributes"
      ],
      "Resource": "arn:aws:sns:*:*:*"
    },
    {
      "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:::${S3_BUCKET_PREFIX}*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "cloudtrail:CreateTrail",
        "cloudtrail:DescribeTrails",
        "cloudtrail:GetTrailStatus",
        "cloudtrail:StartLogging",
        "cloudtrail:UpdateTrail"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iam:GetUser"
      ],
      "Resource": "arn:aws:iam::*"
    }
  ]
}
EOF
```


JSONファイルを作成したら、フォーマットが壊れてないか必ず確認します。

```bash:コマンド::
$ cat ${FILE_IAM_POLICY} | json_verify
```

```text:結果:
JSON is valid
```

json_verifyでエラーが出たときはjsonlintでチェックします。

```bash:コマンド::
$ cat ${FILE_IAM_POLICY} | jsonlint
```




2.2. IAMグループポリシーの適用
------------------------------

グループポリシーをIAMグループに適用します。

```bash:コマンド:
aws iam put-group-policy --group-name ${IAM_GROUP_NAME} --policy-name "${IAM_GROUP_NAME}" --policy-document file://${FILE_IAM_POLICY}
```

```text:結果:
(戻り値なし)
```

2.3. IAMグループポリシーの確認
------------------------------

IAMグループのグループポリシーを確認します。

```bash:コマンド:
aws iam get-group-policy --group-name ${IAM_GROUP_NAME} --policy-name "${IAM_GROUP_NAME}" 
```

```json:結果:
{
    "GroupName": "cloudtrail-builder", 
    "PolicyDocument": {
        "Version": "2012-10-17", 
        "Statement": [
            {
                "Action": [
                    "sns:AddPermission", 
                    "sns:CreateTopic", 
                    "sns:GetTopicAttributes", 
                    "sns:ListTopics", 
                    "sns:ListSubscriptionsByTopic", 
                    "sns:Subscribe", 
                    "sns:SetTopicAttributes"
                ], 
                "Resource": "arn:aws:sns:*:*:*", 
                "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-*", 
                "Effect": "Allow"
            }, 
            {
                "Action": [
                    "cloudtrail:CreateTrail", 
                    "cloudtrail:DescribeTrails", 
                    "cloudtrail:GetTrailStatus", 
                    "cloudtrail:StartLogging", 
                    "cloudtrail:UpdateTrail"
                ], 
                "Resource": "*", 
                "Effect": "Allow"
            }, 
            {
                "Action": [
                    "iam:GetUser"
                ], 
                "Resource": "arn:aws:iam::*", 
                "Effect": "Allow"
            }
        ]
    }, 
    "PolicyName": "cloudtrail-builder"
}
```


3. ユーザの作成
==================

3.1. 作成
-------------

IAMユーザを作成します。

```bash:コマンド:
aws iam create-user --user-name ${IAM_USER_NAME}
```

```json:結果:
{
    "User": {
        "UserName": "cloudtrail-builder", 
        "Path": "/", 
        "CreateDate": "2015-01-18T02:03:54.449Z", 
        "UserId": "AIDAIxxxxxxxxxxxxxxxx", 
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/cloudtrail-builder"
    }
}
```



3.2. IAMユーザの確認
-----------------------

作成したIAMユーザが存在することを確認します。

```bash:コマンド:
aws iam get-user --user-name ${IAM_USER_NAME}
```

```json:結果:
{
    "User": {
        "UserName": "cloudtrail-builder", 
        "Path": "/", 
        "CreateDate": "2015-01-18T02:03:01Z", 
        "UserId": "AIDAxxxxxxxxxxxxxxxxxx", 
        "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/cloudtrail-builder"
    }
}
```


4. グループへのユーザ追加
==========================

4.1. 追加
---------------------------------

IAMユーザに権限を付与するために、IAMグループに追加します。

```bash:コマンド:
aws iam add-user-to-group \
  --group-name ${IAM_GROUP_NAME} \
  --user-name ${IAM_USER_NAME}
```

```text:結果:
(戻り値なし)
```


4.2. ユーザのグループ所属確認
---------------------------------

IAMユーザが、IAMグループに所属していることを確認します。

```bash:コマンド::
aws iam list-groups-for-user --user-name ${IAM_USER_NAME} |\
  jq -r --arg group_name ${IAM_GROUP_NAME} '.Groups[] | select( .GroupName == $group_name )'
```

```json:結果:
{
  "Path": "/", 
  "CreateDate": "2015-01-18T02:03:09Z", 
  "GroupId": "AGPAxxxxxxxxxxxxxxxxx", 
  "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/operators", 
  "GroupName": "operators"
}
```


4.3. グループへのユーザ所属確認
---------------------------------

IAMグループにIAMユーザが所属していることを確認します。


```bash:コマンド::
aws iam get-group --group-name ${IAM_GROUP_NAME} |\
  jq -r --arg user_name ${IAM_USER_NAME} '.Users[] | select( .UserName == $user_name )'
```

```json:結果:
{
  "UserName": "cloudtrail-builder", 
  "Path": "/", 
  "CreateDate": "2015-01-18T02:03:07Z", 
  "UserId": "AIDAxxxxxxxxxxxxxxxxx", 
  "Arn": "arn:aws:iam::XXXXXXXXXXXX:user/cloudtrail-builder"
}
```




5. ユーザのAPIアクセス設定
==========================

5.1. access keyの作成と取得
------------------------------

```bash:コマンド::
aws iam create-access-key --user-name ${IAM_USER_NAME} > ${IAM_USER_NAME}.json \
  && cat ${IAM_USER_NAME}.json
```

```json:結果:
{
    "AccessKey": {
        "UserName": "cloudtrail-builder", 
        "Status": "Active", 
        "CreateDate": "2015-01-18T03:57:05.919Z", 
        "SecretAccessKey": "XXxxxxxXXXxXXXXxXXxXxXXXXXxxxXxXxXXXXXXX", 
        "AccessKeyId": "AKIAxxxxxxxxxxxxxxxx"
    }
}
```

5.2. 認証情報の作成
---------------------

rcファイル

```bash:コマンド:
cat ${IAM_USER_NAME}.json |\
  jq '.AccessKey | {AccessKeyId, SecretAccessKey}' |\
  sed '/[{}]/d' | sed 's/[\" ,]//g' | sed 's/:/=/' |\
  sed 's/AccessKeyId/aws_access_key_id/' |\
  sed 's/SecretAccessKey/aws_secret_access_key/' \
  > ${IAM_USER_NAME}.rc \
  && cat ${IAM_USER_NAME}.rc
```

```bash:結果
aws_access_key_id=AKIAxxxxxxxxxxxxxxxx
aws_secret_access_key=XXxxxxxXXXxXXXXxXXxXxXXXXXxxxXxXxXXXXXXX
```

credentialsファイル

```bash:コマンド::
echo "" >> ~/.aws/credentials
echo "[${IAM_USER_NAME}]" >> ~/.aws/credentials
cat ${IAM_USER_NAME}.rc >> ~/.aws/credentials
```

configファイル

```bash:コマンド::
cat << EOF >> ~/.aws/config

[profile ${IAM_USER_NAME}]
region = us-west-2
EOF
```


6. ユーザの切り替え
==========================

```bash:コマンド::
export AWS_DEFAULT_PROFILE=${IAM_USER_NAME}
```

```bash:コマンド::
aws cloudtrail describe-trails 
```

```json:結果
{
    "trailList": []
}
```


完了
======

次にCloudTrailのログ保存用S3バケットを作成します。
http://qiita.com/tcsh/items/0ecbb828d3476449891c