【AWS】IAM ~ クロスアカウント ~

■ はじめに

https://dk521123.hatenablog.com/entry/2017/02/26/231046

の続き。

今回は、クロスアカウント周辺の知識 について
ちょこちょこ、まとめる。

目次

【1】クロスアカウント
【2】STS (Security Token Service)
 1)sts:AssumeRole
 2)AWS CLIコマンド
【3】外部ID(External ID)
 1)イメージ
【4】別アカウントを受け入れる例
 1)シナリオ
 2)手順

【1】クロスアカウント

* クロスアカウントにより、別アカウントのリソースを操作できる

https://dev.classmethod.jp/articles/signin-with-cross-account-access/

【2】STS (Security Token Service)

*  一時的な認証情報を発行

1)sts:AssumeRole

* STS を通じて、 IAM ロールと同じ権限を一時的に得る
 => 「sts」「AssumeRole」と分解して考えるといいかも

AssumeRole

*  IAM ロールに設定された権限を引き受けることができる

cf. Assume (アシューム) = 引き受ける

2)AWS CLIコマンド

[a] aws sts assume-role

* IAMロールを引き受ける(Assumeする)

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/assume-role.html

# コマンド例
aws sts assume-role \
  --role-arn "arn:aws:iam::123456789012:role/example-role" \
  --role-session-name AWSCLI-Session

[b] aws sts get-caller-identity

* AWS Account情報(Account、User ID、ARN)の取得
 => IAM ロールを引き受けたことを確認すること等に使える

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sts/get-caller-identity.html

# コマンド例
aws sts get-caller-identity

【3】外部ID(External ID)

* 外部アカウントからクロスアカウントするために利用するID
 => AssumeRoleで「許可する側」から「許可される側」
  に割り振る一意のID

1)イメージ

[許可される側] ---------------> [許可する側]
        Role + 外部ID

CloudFormation での 外部IDを利用したロールの作成

Resources:
  DemoRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            AWS: arn:aws:iam::123456780123:root
          Action: sts:AssumeRole
          # 外部ID「ExternalId123」と一致したらAssumeRoleする
          Condition:
            StringEquals:
              sts:ExternalId: "ExternalId123"

【4】別アカウントを受け入れる例

* 以下の公式サイトを参考に整理する

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html

1)シナリオ

 自分の会社(許可する側。My Com)のアカウントが、
第三者企業(許可される側。Example Corp) のアカウントを
受け入れる場合

2)手順

[1] 許可される側 (Example Corp) は、
 アクセスする AWS アカウント番号および
 外部IDを作成し、許可する側(My Com)に提供

[2] 許可する側(My Com)は、
 許可される側 (Example Corp) に付与する IAM ロールを作成
 => 上記「1)イメージ」のようにCondition 要素を追加し
  外部ID に一致するようにする

 [3] [2]のIAMロールに対するポリシーに、
  どのAWSサービスに何を許可するかを設定する
 => 【例】S3バケットに対して、ファイルのReadのみを許可

[4] [2]のロールの Amazon リソースネーム(ARN)を
 許可される側 (Example Corp) に提供

[5] 許可される側 (Example Corp) が許可する側(My Com)の
 AWS環境にアクセスする場合、sts:AssumeRole API を呼び出す
 => 一時的なセキュリティ認証情報(Credentials)がレスポンス
  として返ってくるので、それらを使ってアクセスする

sts:AssumeRole API実行例

$ aws sts assume-role \
    --role-arn arn:aws:iam::1234567890123:role/externalid-demo \ ([4]のARN)
    --role-session-name demo-session \ (セッション名(なんでもいい))
    --external-id abcd12345678 (外部ID)
{
    "Credentials": {
        "AccessKeyId": "XXXXXXXXXXXX",
        "SecretAccessKey": "XXXXXXXXXXXX",
        "SessionToken": "XXXXXXXXXXXX",
        "Expiration": "2022-05-23T03:31:44Z"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "XXXXXXXXXXXX:demo-session",
        "Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/externalid-demo/demo-session"
    }
}

参考文献

https://dev.classmethod.jp/articles/iam-role-passrole-assumerole/

関連記事

IAM ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2017/02/26/231046
IAM ~ IAM Policy 編 ~
https://dk521123.hatenablog.com/entry/2020/09/30/133123