IAMでクロスアカウントスイッチロール設定メモ

最近は複数アカウント丸っと管理できるorganizationsというのが出てるようなのでそちらも要チェックです。
複数アカウントが含まれるグループ作って丸っとロールを割り当てるような管理ができるようですが、既存に変更かけるときは注意したほうがよいようです。

https://aws.amazon.com/jp/organizations/

軽くテストしたので個人的な備忘録です。

### ★クロスアカウントスイッチロールすると嬉しいこと

複数のAWSアカウント間を認証画面介さず行き来できる
個人用IAMアカウント作るのは一か所でよくアカウント毎でなくなる
SDKつかってるような一部のツールではスイッチできないものもあるがawscliくらいならスイッチロールでいける
スイッチ先で権限を限定してスイッチ元でアカウントの増減を制御できるので
別会社間のメンバーの増減のアカウント管理のやり取りが生じなくてたぶんべんり

アカウント番号はサポート画面の右上に出てる。

### ★参考
[Swith Roleで複数のAWSアカウント間を切替える - Qiita](http://qiita.com/yoshidashingo/items/d13a9b17f111d5d91a2e)
[超簡単！今すぐ使える「クロスアカウントアクセス」 ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/signin-with-cross-account-access/)
[AWS Black Belt Techシリーズ AWS IAM](https://www.slideshare.net/AmazonWebServicesJapan/20150617-aws-blackbeltiam)
[ロールの切り替え（AWS マネジメントコンソール） - AWS Identity and Access Management](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)
[【小ネタ】複数のSwitch Roleでのクロスアカウントアクセスをブラウザのブックマークで管理する ｜ Developers.IO](http://dev.classmethod.jp/cloud/aws/bookmarking-switch-roles/)

一番したのやつ履歴が5こくらいまでできえることに憤慨している人は幸せになれそう。

### ★実際のクロスアカウントスイッチロール実装手順の簡易なメモ

#### ０．テストするアカウントを2つようい
アカウント１
※スイッチ元
Account Number 1234zzzzzzzz

アカウント２
※スイッチ先
アカウント番号 5678xxxxxxxx


#### １．スイッチ先でロールを作成する

※お客様先にスイッチする場合お客様作業

IAMサービスを選択してロールを作る

```
新しいロールの作成
　＞ロールの選択（クロスアカウントアクセスのロールで外部IDの使用を許可しないほうを選択）
　　（※外部ID許可とはldapやadなどのIAMクレデンシャルでないID連携を許可するものと思われ）
　　＞このアカウントにアクセスできる IAM ユーザーの AWS アカウントの ID を入力（スイッチ元のIDを入力）
　　　（MFAが必要にチェックはデバイスやアプリの用意が可能な場合に入れる）
　　　＞ポリシーのアタッチ（既存から選ぶのでカスタムにしたいならあらかじめ調べておく）
　　　　（とりあえず試験用なので適当な権限にする（arn:aws:iam::aws:policy/AdministratorAccess ））
　　　　＞ロール名を入力：mygroup-admin
```

#### ２．スイッチ元でロールを設定する

とりあえずユーザとグループを作る

グループ：mygroup
ユーザ：とりあえず二人くらいを作成

グループのインラインポリシーを作成しスイッチ先のアカウントとロールを設定する
ポリシー名：switch-to-otheraccount-name

```
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": [
        "arn:aws:iam::5678xxxxxxxx:role/mygroup-admin",
        "arn:aws:iam::3456xxxxxxxx:role/mygroup-admin",
        "arn:aws:iam::6789xxxxxxxx:role/mygroup-admin"
    ]
  }
}
```

#### ３．スイッチ元で自分のユーザで入りなおしてから右上からスイッチロールを選択してスイッチする

アカウント：5678xxxxxxxx
ロール：mygroup-admin


お客様先にスイッチする場合、
・スイッチ元のアカウントIDをお伝えする
・作成したロール名とわたる先のアカウント名とアカウントIDを聞いて設定
・スイッチロールしてみる
・スイッチ履歴は5個くらいしか残らないので便利なリンクを作っておく

ということになります。

### ★証跡を追えるようにするためにスイッチ元でCloudTrailの設定

見た感じすでに設定済みな模様でござったのでリンク先をどうぞ。S3もみたところ数年前からログがあった。
[Amazon Web Services ブログ: 【AWS発表】 AWS CloudTrail - AWS APIコールの記録を保存](http://aws.typepad.com/aws_japan/2013/11/aws-cloudtrail-capture-aws-api-activity.html)
[AWSの操作履歴を記録するCloudTrailを試してみた « サーバーワークス エンジニアブログ](http://blog.serverworks.co.jp/tech/2013/11/14/cloudtrail/)

### ★アカウントのエイリアスの設定

あんまり関係ないがIDだと視認性が微妙なので設定したほうがよさそう（なくてもいい）

[AWS アカウント ID とその別名 - AWS Identity and Access Management](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/console_account-alias.html)

変えたたらサブドメインがアカウント番号からエイリアス名になる（アカウント番号でもアクセスできるまま）
`https://my-alias.signin.aws.amazon.com/console`

### ★アカウント設定（パスワードポリシー）

ISMS的なアレ（または顧客要望）にのっとって適宜。
Account settingsから実施。

Minimum password length: x（x文字を要する）
Require at least one non-alphanumeric character(記号を要する）
Allow users to change their own password （自分で更新する）
Enable password expiration 
Password expiration period (in days): xx（xx(日)で期限がきれる）
等

### ★ルートアカウントでアクセスしない

スイッチロールの設定時にrootアカウントにアクセスできるように設定しなければ
メニューにスイッチロールでないので物理的にルートアカウントにアクセスは不可能。
（[クラスメソッドのリンク](http://dev.classmethod.jp/cloud/aws/signin-with-cross-account-access/)が詳しい（rootでも設定するといけるけどやらないほうがいい））
単に運用上パスワード変えて限定共有する、クレデンシャル無効化する、MFAデバイス用意等。
あとCloudTrail的に個人IAMで操作したほうが証跡が追いやすい。

### ★クレデンシャルの書き方

たぶん以下のようになる。

```
[account2]
role_arn = arn:aws:iam::5678xxxxxxxx:role/mygroup-admin
source_profile = account1
region=us-xxxx-x
```

### ★スイッチロールのポリシーアタッチされてるグループにいるユーザをcliでだす

```
$ aws iam get-group --group-name mygroup --profile account1|jq -c -r '.Users[].UserName'
```


以上