$30 off During Our Annual Pro Sale. View Details »

AssumeRole(スイッチロール)を理解して、AWSへのデプロイを少しでも安全に実施しよう

Genki Fujii
October 14, 2021

 AssumeRole(スイッチロール)を理解して、AWSへのデプロイを少しでも安全に実施しよう

CloudFormationをデプロイするユーザのアクセスキーが漏れてしまったら?と心配するあなたへ。 AssumeRoleを活用すれば、アクセスキーが漏洩しても被害が最小限になるIAMユーザでデプロイできます。

■YouTube
https://www.youtube.com/watch?v=LbZj68v4k8I

■URL紹介
GitHub ActionsでAWSの永続的なクレデンシャルを渡すことなくIAM Roleが利用できるようになったようです
https://dev.classmethod.jp/articles/github-actions-without-permanent-credential/

【実録】アクセスキー流出、攻撃者のとった行動とその対策
https://dev.classmethod.jp/articles/accesskey-leak/

[AssumeRole] アクセスキーが漏洩しても被害が最小限になるIAMユーザでCloudFormationにデプロイする方法
https://dev.classmethod.jp/articles/assume-role-deploy-iam-user-and-role/

Genki Fujii

October 14, 2021
Tweet

More Decks by Genki Fujii

Other Decks in Technology

Transcript

  1. 50 AssumeRoleを活⽤したデプロイ(全体像) AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    IAMロール (デプロイ⽤) IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole CloudFormation
  2. 53 AssumeRoleを活⽤したデプロイ(全体像) AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole
  3. 54 AssumeRoleを活⽤したデプロイ(全体像) AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole
  4. 55 AssumeRoleを活⽤したデプロイ(全体像) AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    IAMロール (デプロイ⽤) IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole CloudFormation
  5. 56 AssumeRoleを活⽤したデプロイ(全体像) AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    IAMロール (デプロイ⽤) IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole CloudFormation
  6. 57 IAMユーザとIAMロール IAMロール (CloudFormation⽤) IAMロール (デプロイ⽤) IAMユーザ IAM ポリシー アクセスキーを利⽤する

    AssumeRoleのみ可能な権限 CloudFormtaionでデプロイする権限 S3バケット作成とオブジェクトPut権限等 (必要に応じて) AWSの各サービスに対する権限
  7. 66 IAMユーザがAssumeRoleするコマンド例 AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole
  8. 67 IAMユーザがAssumeRoleするコマンド例 AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole AssumeRoleします!!
  9. 68 IAMユーザがAssumeRoleするコマンド例 AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole $ aws sts assume-role ¥ --role-arn arn:aws:iam::1234567890:role/deploy-iam-sample-deploy-role-for-user ¥ --role-session-name deploy-test ¥ --duration-seconds 900 { "Credentials": { "AccessKeyId": "xxxxxx", "SecretAccessKey": "yyyyyy", "SessionToken": "zzzzzz", "Expiration": "2019-09-06T12:31:37Z” }, "AssumedRoleUser": { "AssumedRoleId": "hoge:deploy-test", "Arn": "arn:aws:sts::1234567890:assumed-role/deploy-iam-sample-deploy-role-for-user/deploy-test” } }
  10. 69 IAMユーザがAssumeRoleするコマンド例 AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole $ aws sts assume-role ¥ --role-arn arn:aws:iam::1234567890:role/deploy-iam-sample-deploy-role-for-user ¥ --role-session-name deploy-test ¥ --duration-seconds 900 { "Credentials": { "AccessKeyId": "xxxxxx", "SecretAccessKey": "yyyyyy", "SessionToken": "zzzzzz", "Expiration": "2019-09-06T12:31:37Z” }, "AssumedRoleUser": { "AssumedRoleId": "hoge:deploy-test", "Arn": "arn:aws:sts::1234567890:assumed-role/deploy-iam-sample-deploy-role-for-user/deploy-test” } } ↑ 「IAMロール(デプロイ⽤)」の ARNを指定する
  11. 70 IAMユーザがAssumeRoleするコマンド例 AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole $ aws sts assume-role ¥ --role-arn arn:aws:iam::1234567890:role/deploy-iam-sample-deploy-role-for-user ¥ --role-session-name deploy-test ¥ --duration-seconds 900 { "Credentials": { "AccessKeyId": "xxxxxx", "SecretAccessKey": "yyyyyy", "SessionToken": "zzzzzz", "Expiration": "2019-09-06T12:31:37Z” }, "AssumedRoleUser": { "AssumedRoleId": "hoge:deploy-test", "Arn": "arn:aws:sts::1234567890:assumed-role/deploy-iam-sample-deploy-role-for-user/deploy-test” } } 得られた3つの情報で、AssumeRoleする AccessKeyId / SecretAccessKey / SessionToken ↑ 「IAMロール(デプロイ⽤)」の ARNを指定する
  12. 71 IAMユーザがAssumeRoleするコマンド例 AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole export AWS_ACCESS_KEY_ID=xxxxxx export AWS_SECRET_ACCESS_KEY=yyyyyy export AWS_SESSION_TOKEN=zzzzzz
  13. 73 デプロイするコマンド例 AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    CloudFormation 「IAMロール(CloudFormtaion⽤)」を使って デプロイしてね〜
  14. 74 デプロイするコマンド例 AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    CloudFormation $ aws cloudformation deploy ¥ --template-file any.yaml ¥ --stack-name Sample-App-Stack ¥ --capabilities CAPABILITY_IAM ¥ --role-arn arn:aws:iam::1234567890:role/deploy-iam-sample-deploy-role-for-cloudformation 「IAMロール(CloudFormation⽤)」の ARNを指定する ↓
  15. 75 デプロイするコマンド例 AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    CloudFormation 「IAMロール(CloudFormtaion⽤)」を使って デプロイしてね〜
  16. 77 少しでも安全にデプロイできる理由(まとめ) AWS Identity and Access Management (IAM) IAMユーザ IAM

    ポリシー アクセスキー IAMユーザは、AssumeRoleの権限だけ ↓ 漏洩したアクセスキーを使っても、 AssumeRoleするIAMロールのARNが不明なら、 何もできない
  17. 78 少しでも安全にデプロイできる理由(まとめ) AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    アクセスキー (⼀時的) STS AssumeRole IAMロール(デプロイ⽤)の ARNがバレてる ↓ AssumeRoleしても、 最⼩限の権限だけ (DB等のReadはできない)
  18. 79 少しでも安全にデプロイできる理由(まとめ) AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    アクセスキー (⼀時的) STS AssumeRole CloudFormation IAMロール(CloudFormation⽤)がバレてないなら、 IAMロール(デプロイ⽤)の権限でデプロイする ↓ ほぼ何もできない
  19. 80 少しでも安全にデプロイできる理由(まとめ) AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    アクセスキー (⼀時的) STS AssumeRole CloudFormation IAMロール(CloudFormation⽤)がバレてないなら、 IAMロール(デプロイ⽤)の権限でデプロイする ↓ ほぼ何もできない (※スタック削除とかは可能)
  20. 81 少しでも安全にデプロイできる理由(まとめ) AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

    アクセスキー (⼀時的) STS AssumeRole CloudFormation Resourceでスタック名を 制限していれば、 他のスタックには影響なし
  21. 83 少しでも安全にデプロイできる理由(まとめ) AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    IAMロール (CloudFormation⽤)は 強い権限を持ってるが、 ユーザは直接使えない
  22. 86 assume_role.sh CI/CDの流れでデプロイするとき、 簡単にAssumeRoleしたい #!/usr/bin/env bash set -xeuo pipefail aws

    sts_credentials="$(aws sts assume-role ¥ --role-arn "$AWS_DEPLOY_IAM_ROLE_ARN" ¥ --role-session-name "$ROLE_SESSION_NAME" ¥ --duration-seconds 900 ¥ --query "Credentials" ¥ --output "json")" cat <<EOT > "aws-env.sh” export AWS_ACCESS_KEY_ID="$(echo $aws_sts_credentials | jq -r '.AccessKeyId’)” export AWS_SECRET_ACCESS_KEY="$(echo $aws_sts_credentials | jq -r '.SecretAccessKey’)” export AWS_SESSION_TOKEN="$(echo $aws_sts_credentials | jq -r '.SessionToken’)” EOT