複数AWSアカウントでiamのロール運用するときのまとめ


AWSで複数アカウントを運用するときのベスト・プラクティスとかでSwtich Roleすればいいんだよ、みたいなのはよく見かけるけど、じゃあ実際どんな手順で設定するのかとか具体的な内容が書いてあるのが見つからなかったので、まとめてみた。


## 1. ユーザ管理する中央アカウントを一つ決める

## 2. 中央アカウントでCloudTrailの設定をする

## 3. 中央アカウントでユーザグループを作ってポリシーを設定する
ユーザがログインするのは中央アカウントだが、ここではAWSへの操作は基本的にさせたくないので、最低限の権限だけを付与する

```XML:UserAccessPolicy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole",
                "iam:ChangePassword",
                "iam:GetAccountPasswordPolicy"
            ],
            "Resource": "*"
        }
    ]
}
```
+ sts:AssumeRole
ロールが使えるようになる

+ iam:ChangePassword
+ iam:GetAccountPasswordPolicy
初回ログイン時にパスワード変更できるようにする


これでこのユーザは中央アカウントでは

+ 初回ログイン時にパスワード変更できる
+ 他のアカウントのロールにスイッチできる

以外なにもできない

## 4. 中央アカウントでユーザを作り、ユーザグループに入れる
## 5. CloudTrailのログが保存されるS3のバケットのポリシーを設定する
他のアカウントでも個別にログの保存先を指定できるが、S3にバケットの中身を直接いじられるとログの削除・改変が可能になってしまうので、アクセス権がない中央アカウントのS3に保存する。


[参照：複数アカウントにバケットポリシーを設定する方法](http://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-set-bucket-policy-for-multiple-accounts.html)


```XML
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AWSCloudTrailAclCheck20131101",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::903692715234: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",
          "arn:aws:iam::035351147821:root"
        ]
      },
      "Action": "s3:GetBucketAcl",
      "Resource": "arn:aws:s3:::myBucketName"
    },
    {
      "Sid": "AWSCloudTrailWrite20131101",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::903692715234: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",
          "arn:aws:iam::035351147821:root"
        ]
      },
      "Action": "s3:PutObject",
      "Resource": [
        "arn:aws:s3:::myBucketName/[optional] myLogFilePrefix/AWSLogs/111111111111/*",
        "arn:aws:s3:::myBucketName/[optional] myLogFilePrefix/AWSLogs/222222222222/*"
      ],
      "Condition": { 
        "StringEquals": { 
          "s3:x-amz-acl": "bucket-owner-full-control" 
        }
      }
    }
  ]
}	
```

## 6. スイッチ先アカウントでCloudTrailを設定する
新しいS3バケットは作成せず、中央アカウントのS3バケットを指定する

## 7. スイッチ先アカウントにroleを作成する
### ロールの作成
1. ロール名の設定
2. ロールタイプの選択
 └[クロスアカウントアクセス]
　　└[所有しているAWSアカウントアカウント間のアクセスを提供します]

3. 信頼性の確立
　└[アカウントID]：ユーザ毎にロールを付与したいとしても一旦アカウントIDを入れる
4. ポリシーのアタッチ
5. 確認

### 7.1. 信頼関係の編集
#### ユーザ毎にロールを付与したい場合
最初に作成するときは、ユーザ毎の信頼関係は設定できないので、一旦ロールを作成してから、ロールを修正する

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::000000000000:user/USER_NAME01",
          "arn:aws:iam::000000000000:user/USER_NAME02"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```


### 7.2. ポリシーのアタッチ
#### Ex.PowerUserの場合
AWSで用意されているPowerUserAccessのポリシーは以下の通り

```XML:PowerUserAccess
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "NotAction": "iam:*",
      "Resource": "*"
    }
  ]
}
```

これだけだとiam関連のActionが全てNotActionになるので、サービスで必要な権限は個別に付与する

```XML:PowerUserExtendPolicy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1427160925000",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:ListInstanceProfiles",
                "iam:ListServerCertificates",
                "iam:UploadServerCertificate"
            ],
            "Resource": [
                "arn:aws:iam::111111111111:server-certificate/*"
            ]
        }
    ]
}
```
+ iam:PassRole
+ iam:ListRolePolicies
+ iam:GetRole
+ iam:GetRolePolicy
+ iam:ListInstanceProfiles

+ iam:ListServerCetificates 
これがないとELBにSSLキーを設定できない

+ iam:UploadServerCertificate
これがないとELBのSSLキーの登録・更新ができない

##