[JAWS-UG CLI] IAM:#31 AssumeRole利用者グループの作成 (ユーザ管理ポリシ)

AWS CLIを利用して、AssumeRoleへのフルアクセスが可能なIAMグループを作成してみます。
あわせてReadOnlyポリシも適用します。

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


IAMへの権限
-----------

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


AWS CLIのバージョン
-------------------

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

  * AWS CLI 1.10.0
  * AWS CLI 1.9.11

```bash:コマンド:
aws --version
```

```text:結果(例):
aws-cli/1.10.0 Python/2.7.5 Darwin/13.4.0 botocore/1.3.22
```


0. 準備
=======


変数の確認
----------

プロファイルが想定のものになっていることを確認します。

```bash:変数の確認:
aws configure list
```

```text:結果(例):
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile       iamFull-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region                us-west-2      config-file    ~/.aws/config
```


1. 事前作業
===========


IAMグループ名の決定
-------------------

```bash:変数の設定:
IAM_GROUP_NAME="assumeRoleFull"
```

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

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

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


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


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

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

```bash:変数の確認:
cat << ETX

        IAM_GROUP_NAME: ${IAM_GROUP_NAME}

ETX
```

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

```json:結果:
      {
        "Group": {
          "Path": "/",
          "CreateDate": "2015-04-06T08:47:22.756Z",
          "GroupId": "AGPAIRBWX5F7GBWA5W5YS",
          "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/assumeRoleFull",
          "GroupName": "assumeRoleFull"
        }
      }
```


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

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

```json:結果:
      {
        "Group": {
          "Path": "/",
          "CreateDate": "2015-04-06T08:47:22Z",
          "GroupId": "AGPAIRBWX5F7GBWA5W5YS",
          "Arn": "arn:aws:iam::XXXXXXXXXXXX:group/assumeRoleFull",
          "GroupName": "assumeRoleFull"
        },
        "Users": []
      }
```


3. グループポリシーの適用 (カスタムポリシー)
============================================


3.1. IAMポリシーの決定
----------------------

存在するユーザ管理ポリシーを確認します。

```bash:コマンド:
aws iam list-policies \
        --scope Local \
        --query 'Policies[].PolicyName' \
        --max-items 1000
```

利用するIAMポリシーを決めます。

```bash:変数の設定:
IAM_POLICY_NAME='assumeRoleFull'
```

ARNを取得します。

```bash:変数の設定:
IAM_POLICY_ARN=$( \
        aws iam list-policies \
          --scope Local \
          --max-items 1000 \
          --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].Arn" \
          --output text \
      ) \
        && echo "${IAM_POLICY_ARN}"
```

```text:結果(例):
arn:aws:iam::XXXXXXXXXXXX:policy/assumeRoleFull
```

3.2. IAMポリシーの確認
----------------------

ポリシのバージョンを取得します。

```bash:変数の設定:
IAM_POLICY_VERSION=$( \
        aws iam list-policies \
          --scope Local \
          --max-items 1000 \
          --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].DefaultVersionId" \
          --output text \
      ) \
        && echo ${IAM_POLICY_VERSION}
```

```text:結果(例):
v1
```

ポリシの内容を見てみましょう。

```bash:コマンド:
aws iam get-policy-version \
        --policy-arn ${IAM_POLICY_ARN} \
        --version-id ${IAM_POLICY_VERSION}
```

```json:結果(例):
      {
        "PolicyVersion": {
          "CreateDate": "2015-12-06T14:03:54Z",
          "VersionId": "v1",
          "Document": {
              "Version": "2012-10-17",
              "Statement": [
                  {
                      "Action": [
                          "sts:AssumeRole"
                      ],
                      "Resource": "*",
                      "Effect": "Allow"
                  }
              ]
          },
          "IsDefaultVersion": true
        }
      }
```


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

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

```bash:コマンド:
aws iam list-attached-group-policies \
        --group-name ${IAM_GROUP_NAME}
```

```json:結果(例):
      {
          "AttachedPolicies": [], 
      }
```


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

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

```bash:変数の確認:
cat << ETX

        IAM_GROUP_NAME: ${IAM_GROUP_NAME}
        IAM_POLICY_ARN: ${IAM_POLICY_ARN}

ETX
```

```bash:コマンド:
aws iam attach-group-policy \
        --group-name ${IAM_GROUP_NAME} \
        --policy-arn ${IAM_POLICY_ARN}
```

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


4. グループポリシーの適用 (AWS定義ポリシ)
=========================================


4.1. IAMポリシーの決定
----------------------

存在するユーザ管理ポリシーを確認します。

```bash:コマンド:
aws iam list-policies \
        --scope AWS \
        --max-items 1000 \
        --query 'Policies[].PolicyName'
```

利用するIAMポリシーを決めます。

```bash:変数の設定:
IAM_POLICY_NAME='ReadOnlyAccess'
```

ARNを取得します。

```bash:変数の設定:
IAM_POLICY_ARN=$( \
        aws iam list-policies \
          --scope AWS \
          --max-items 1000 \
          --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].Arn" \
          --output text \
      ) \
        && echo "${IAM_POLICY_ARN}"
```

```text:結果(例):
arn:aws:iam::aws:policy/ReadOnlyAccess
```

4.2. IAMポリシーの確認
----------------------

ポリシのバージョンを取得します。

```bash:変数の設定:
IAM_POLICY_VERSION=$( \
        aws iam list-policies \
          --scope AWS \
          --max-items 1000 \
          --query "Policies[?PolicyName==\`${IAM_POLICY_NAME}\`].DefaultVersionId" \
          --output text \
      ) \
        && echo ${IAM_POLICY_VERSION}
```

```text:結果(例):
v9
```

ポリシの内容を見てみましょう。

```bash:コマンド:
aws iam get-policy-version \
        --policy-arn ${IAM_POLICY_ARN} \
        --version-id ${IAM_POLICY_VERSION}
```

```json:結果(例):
      {
          "PolicyVersion": {
              "CreateDate": "2015-11-02T23:13:14Z", 
              "VersionId": "v6", 
              "Document": {
                  "Version": "2012-10-17", 
                  "Statement": [
                      {
                          "Action": [
                              "appstream:Get*", 
                              "autoscaling:Describe*", 
                              "cloudformation:DescribeStackEvents", 
                              "cloudformation:DescribeStackResource", 
                              "cloudformation:DescribeStackResources", 
                              "cloudformation:DescribeStacks", 
                              "cloudformation:GetTemplate", 
                              "cloudformation:List*", 
                              "cloudfront:Get*", 
                              "cloudfront:List*", 
                              "cloudsearch:Describe*", 
                              "cloudsearch:List*", 
                              "cloudtrail:DescribeTrails", 
                              "cloudtrail:GetTrailStatus", 
                              "cloudwatch:Describe*", 
                              "cloudwatch:Get*", 
                              "cloudwatch:List*", 
                              "codecommit:BatchGetRepositories", 
                              "codecommit:Get*", 
                              "codecommit:GitPull", 
                              "codecommit:List*", 
                              "codedeploy:Batch*", 
                              "codedeploy:Get*", 
                              "codedeploy:List*", 
                              "config:Deliver*", 
                              "config:Describe*", 
                              "config:Get*", 
                              "datapipeline:DescribeObjects", 
                              "datapipeline:DescribePipelines", 
                              "datapipeline:EvaluateExpression", 
                              "datapipeline:GetPipelineDefinition", 
                              "datapipeline:ListPipelines", 
                              "datapipeline:QueryObjects", 
                              "datapipeline:ValidatePipelineDefinition", 
                              "directconnect:Describe*", 
                              "dynamodb:BatchGetItem", 
                              "dynamodb:DescribeTable", 
                              "dynamodb:GetItem", 
                              "dynamodb:ListTables", 
                              "dynamodb:Query", 
                              "dynamodb:Scan", 
                              "ec2:Describe*", 
                              "ec2:GetConsoleOutput", 
                              "ecs:Describe*", 
                              "ecs:List*", 
                              "elasticache:Describe*", 
                              "elasticache:List*", 
                              "elasticbeanstalk:Check*", 
                              "elasticbeanstalk:Describe*", 
                              "elasticbeanstalk:List*", 
                              "elasticbeanstalk:RequestEnvironmentInfo", 
                              "elasticbeanstalk:RetrieveEnvironmentInfo", 
                              "elasticloadbalancing:Describe*", 
                              "elasticmapreduce:Describe*", 
                              "elasticmapreduce:List*", 
                              "elastictranscoder:List*", 
                              "elastictranscoder:Read*", 
                              "firehose:Describe*", 
                              "firehose:List*", 
                              "iam:GenerateCredentialReport", 
                              "iam:Get*", 
                              "iam:List*", 
                              "inspector:Describe*", 
                              "inspector:Get*", 
                              "inspector:List*", 
                              "inspector:LocalizeText", 
                              "inspector:PreviewAgentsForResourceGroup", 
                              "iot:Describe*", 
                              "iot:Get*", 
                              "iot:List*", 
                              "kinesis:Describe*", 
                              "kinesis:Get*", 
                              "kinesis:List*", 
                              "kms:Describe*", 
                              "kms:Get*", 
                              "kms:List*", 
                              "lambda:List*", 
                              "lambda:Get*", 
                              "logs:Describe*", 
                              "logs:Get*", 
                              "logs:TestMetricFilter", 
                              "opsworks:Describe*", 
                              "opsworks:Get*", 
                              "rds:Describe*", 
                              "rds:ListTagsForResource", 
                              "redshift:Describe*", 
                              "redshift:ViewQueriesInConsole", 
                              "route53:Get*", 
                              "route53:List*", 
                              "route53domains:CheckDomainAvailability", 
                              "route53domains:GetDomainDetail", 
                              "route53domains:GetOperationDetail", 
                              "route53domains:ListDomains", 
                              "route53domains:ListOperations", 
                              "route53domains:ListTagsForDomain", 
                              "s3:Get*", 
                              "s3:List*", 
                              "sdb:GetAttributes", 
                              "sdb:List*", 
                              "sdb:Select*", 
                              "ses:Get*", 
                              "ses:List*", 
                              "sns:Get*", 
                              "sns:List*", 
                              "sqs:GetQueueAttributes", 
                              "sqs:ListQueues", 
                              "sqs:ReceiveMessage", 
                              "storagegateway:Describe*", 
                              "storagegateway:List*", 
                              "swf:Count*", 
                              "swf:Describe*", 
                              "swf:Get*", 
                              "swf:List*", 
                              "tag:Get*", 
                              "trustedadvisor:Describe*", 
                              "waf:Get*", 
                              "waf:List*"
                          ], 
                          "Resource": "*", 
                          "Effect": "Allow"
                      }
                  ]
              }, 
              "IsDefaultVersion": true
          }
      }
```


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

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

```bash:変数の確認:
cat << ETX

        IAM_GROUP_NAME: ${IAM_GROUP_NAME}
        IAM_POLICY_ARN: ${IAM_POLICY_ARN}

ETX
```

```bash:コマンド:
aws iam attach-group-policy \
        --group-name ${IAM_GROUP_NAME} \
        --policy-arn ${IAM_POLICY_ARN}
```

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


5. IAMグループポリシーの確認
============================

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

```bash:コマンド:
aws iam list-attached-group-policies \
        --group-name ${IAM_GROUP_NAME}
```

```json:結果:
      {
        "AttachedPolicies": [
          {
              "PolicyName": "ReadOnlyAccess",
              "PolicyArn": "arn:aws:iam::aws:policy/ReadOnlyAccess"
          },
          {
              "PolicyName": "assumeRoleFull",
              "PolicyArn": "arn:aws:iam::XXXXXXXXXXXX:policy/assumeRoleFull"
          }
        ]
      }
```


完了
====