Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

73ceba4e609fe802cd38d6403d741faf?s=47 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/

73ceba4e609fe802cd38d6403d741faf?s=128

Genki Fujii

October 14, 2021
Tweet

Transcript

  1. AssumeRole(スイッチロール)を理解して、 AWSへのデプロイを少しでも安全に実施しよう 2021/10/14 IoT事業部 藤井元貴

  2. 2 この動画で分かること ‧IAM について ‧AssumeRole について ‧AssumeRole をする理由 ‧AssumeRole を活⽤して、

    AWSにデプロイする⽅法
  3. 3 GitHub ActionsでAWSにデプロイしたい⽅ https://dev.classmethod.jp/articles/github-actions-without-permanent-credential/

  4. 4 IAM について

  5. 5 IAMについて ‧IAMポリシー ‧IAMロール ‧IAMユーザ & IAMグループ

  6. 6 IAMポリシーは、権限を定義する ‧権限を定義する ‧⼤きく2種類ある ‧AWS管理 ‧カスタマー管理

  7. 7 IAMポリシーの例(AWS管理)

  8. 8 IAMポリシーの例(カスタマー管理)

  9. 9 IAMポリシーの権限例(AdministratorAccess)

  10. 10 IAMポリシーの権限例(KinesisReadOnlyAccess)

  11. 11 IAMロールは、役割を定義する ‧役割を定義する ‧開発する⼈ ‧データ分析する⼈ ‧請求関連の⼈ ‧役割に応じた権限を持たせる ‧IAMポリシーを紐付ける

  12. 12 IAMロールには、IAMポリシーを紐付ける IAMポリシー (カスタマー管理) IAMポリシー (AWS管理) IAMロール IAMロール

  13. 13 IAMロールに紐づくIAMポリシーの例

  14. 14 IAMユーザは、ユーザを管理する ‧ユーザを管理する ‧1⼈1ユーザが基本 ‧権限は、どちらかで管理する ‧IAMポリシー ‧IAMグループ → ⼈の増減時に楽

  15. 15 IAMユーザには、IAMポリシー or IAMグループを紐付ける IAMポリシー (カスタマー管理) IAMポリシー (AWS管理)

  16. IAMグループ 16 IAMユーザには、IAMポリシー or IAMグループを紐付ける IAMポリシー (カスタマー管理) IAMポリシー (AWS管理)

  17. IAMグループ 17 IAMユーザには、IAMポリシー or IAMグループを紐付ける IAMポリシー (カスタマー管理) IAMポリシー (AWS管理)

  18. 18 ここまでのまとめ ‧IAMポリシー 権限を管理する ‧IAMロールは 役割を管理する 役割に応じた権限を持つ ‧IAMユーザ ユーザを管理する

  19. 19 AssumeRole について

  20. 20 AssumeRole は、役割を引き受ける機能 役割(Role)を 引き受ける(Assume) --- 役割(に紐づく権限)を 引き受ける(Assume)

  21. 21 2つのAssumeRoleについて、説明します ‧ユーザがAssumeRoleする ‧AWSサービスがAssumeRoleする

  22. 22 役割を引き受ける例(ユーザの場合) AssumeRoleする権限だけ持ってるよ!

  23. 23 役割を引き受ける例(ユーザの場合) AssumeRoleする権限だけ持ってるよ! DynamoDBにアクセスできない……

  24. 24 役割を引き受ける例(ユーザの場合) IAMロール (開発者) AmazonDynamoDBFullAccess AmazonS3ReadOnlyAccess 「IAMロール(開発者)」があるぞ?

  25. 25 役割を引き受ける例(ユーザの場合) IAMロール (開発者) AmazonDynamoDBFullAccess AmazonS3ReadOnlyAccess 「IAMロール(開発者)」に AssumeRoleするよ!

  26. 26 役割を引き受ける例(ユーザの場合) IAMロール (開発者) AmazonDynamoDBFullAccess AmazonS3ReadOnlyAccess DynamoDBにアクセスできた!!!

  27. 27 役割を引き受ける例(AWSサービスの場合) IAMロール (Lambda⽤) AmazonDynamoDBFullAccess AmazonS3ReadOnlyAccess

  28. 28 役割を引き受ける例(AWSサービスの場合) IAMロール (Lambda⽤) AmazonDynamoDBFullAccess AmazonS3ReadOnlyAccess

  29. 29 役割を引き受ける例(AWSサービスの場合) IAMロール (Lambda⽤) AmazonDynamoDBFullAccess AmazonS3ReadOnlyAccess DynamoDBにアクセスできた!!!

  30. 30 ⼤事なこと: IAMロールには、信頼先がある

  31. 31 実は、普段から AssumeRole を活⽤しているのです Lambda EC2 Chatbot IoT Core IAMロール

    IAMロール IAMロール IAMロール
  32. 32 LambdaのIAMロール

  33. 33 EC2のIAMロール

  34. 34 ChatbotのIAMロール

  35. 35 IoT CoreのIAMロール

  36. 36 他の活⽤例: スイッチロール IAMユーザが、IAMロールに切り替える (IAMロールの権限を引き受ける)

  37. 37 他の活⽤例: スイッチロール IAMユーザが、IAMロールに切り替える (IAMロールの権限を引き受ける)

  38. 38 他の活⽤例: スイッチロール(同アカウント) AWSアカウント: 111111111111 IAMロール (開発者) IAMロール (管理者)

  39. 39 他の活⽤例: スイッチロール(別アカウント)

  40. 40 ここまでのまとめ ‧AssumeRole 役割(Role)を引き受ける(Assume) ‧AWSサービスで、いつも使っている ‧ユーザも使える(スイッチロール)

  41. 41 AssumeRole をする理由 (ユーザ利⽤の場合)

  42. 42 アクセスキーの管理が楽になる AWSアカウントが複数でも、 IAMユーザが1つなので、 アクセスキーも1つだけ!!

  43. 43 アクセスキーの管理 ‧プログラム等のAWSアクセスで使う ‧漏洩の可能性はゼロではない

  44. 44 もし、アクセスキーが漏洩したら……(直接被害) ‧S3 / RDS / DynamoDB等のデータ漏洩 個⼈情報、顧客情報、業務情報、etc ‧EC2で仮想通貨マイニング💸 💸

    💸 💸 など
  45. 45 もし、アクセスキーが漏洩したら……(間接被害) ‧不正利⽤の調査(全リージョン) ‧再発防⽌策の検討と実施 ‧報告書の作成 ‧関係各所への報告 ‧全アクセスキーの再発⾏ ‧全IAMユーザのパスワード変更 など

  46. 46 もし、アクセスキーが漏洩したら…… https://dev.classmethod.jp/articles/accesskey-leak/

  47. 47 ここまでのまとめ ‧AssumeRoleで、IAMユーザ管理が楽に ‧アクセスキー漏洩は、いろいろ⼤変 ‧被害を最⼩限に抑えることは可能 最⼩限の権限のみを付与 AssumeRoleを活⽤(このあと)

  48. 48 AssumeRole を活⽤して AWSにデプロイする⽅法

  49. 49 AssumeRole を活⽤して、AWSにデプロイする https://dev.classmethod.jp/articles/assume-role-deploy-iam-user-and-role/

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

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

    ポリシー アクセスキー
  52. 52 AssumeRoleを活⽤したデプロイ(全体像) AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

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

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

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

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

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

    AssumeRoleのみ可能な権限 CloudFormtaionでデプロイする権限 S3バケット作成とオブジェクトPut権限等 (必要に応じて) AWSの各サービスに対する権限
  58. 58 IAMユーザとIAMポリシー IAMユーザ IAM ポリシー arn:aws:iam::057885367821:user/deploy-user AssumeRoleのみ可能な権限

  59. 59 IAMロール(デプロイ⽤) arn:aws:iam::057885367821:role/deploy-role-for-user IAMロール (デプロイ⽤) さきほどのIAMユーザのみを信頼している ↓ さきほどのIAMユーザのみが使える

  60. 60 IAMロール(デプロイ⽤) arn:aws:iam::057885367821:role/deploy-role-for-user IAMロール (デプロイ⽤) CloudFormtaionでデプロイする権限

  61. 61 IAMロール(デプロイ⽤) arn:aws:iam::057885367821:role/deploy-role-for-user IAMロール (デプロイ⽤) スタック名を指定すれば、 異なるスタックの操作も防げる ↓ CloudFormtaionでデプロイする権限

  62. 62 IAMロール(デプロイ⽤) arn:aws:iam::057885367821:role/deploy-role-for-user IAMロール (デプロイ⽤) S3バケット作成とオブジェクト作成の権限 (必要なら)

  63. 63 IAMロール(デプロイ⽤) arn:aws:iam::057885367821:role/deploy-role-for-user IAMロール (デプロイ⽤) CloudFormtaionに 「IAMロール(CloudFormtaion⽤)」を 渡すための権限

  64. 64 IAMロール(CloudFormation⽤) arn:aws:iam::057885367821:role/deploy-role-for-cloudformation IAMロール (CloudFormation⽤) IAMロール(CloudFormation⽤)は、 CloudFormation のみが使える

  65. 65 IAMロール(CloudFormation⽤) arn:aws:iam::057885367821:role/deploy-role-for-cloudformation IAMロール (CloudFormation⽤)

  66. 66 IAMユーザがAssumeRoleするコマンド例 AWS Identity and Access Management (IAM) IAMロール (デプロイ⽤)

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

    IAMユーザ IAM ポリシー アクセスキー アクセスキー (⼀時的) STS AssumeRole AssumeRoleします!!
  68. 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” } }
  69. 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を指定する
  70. 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を指定する
  71. 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
  72. 72 デプロイするコマンド例 AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    CloudFormation
  73. 73 デプロイするコマンド例 AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    CloudFormation 「IAMロール(CloudFormtaion⽤)」を使って デプロイしてね〜
  74. 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を指定する ↓
  75. 75 デプロイするコマンド例 AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    CloudFormation 「IAMロール(CloudFormtaion⽤)」を使って デプロイしてね〜
  76. 76 少しでも安全にデプロイできる理由(まとめ)

  77. 77 少しでも安全にデプロイできる理由(まとめ) AWS Identity and Access Management (IAM) IAMユーザ IAM

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

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

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

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

    アクセスキー (⼀時的) STS AssumeRole CloudFormation Resourceでスタック名を 制限していれば、 他のスタックには影響なし
  82. 82 少しでも安全にデプロイできる理由(まとめ) DeletionPolicyを 使えば、 Table⾃体は残るので、 データ喪失は防げる

  83. 83 少しでも安全にデプロイできる理由(まとめ) AWS Identity and Access Management (IAM) IAMロール (CloudFormation⽤)

    IAMロール (CloudFormation⽤)は 強い権限を持ってるが、 ユーザは直接使えない
  84. 84 AssumeRoleを⾏うスクリプト CI/CDの流れでデプロイするとき、 簡単にAssumeRoleしたい

  85. 85 AssumeRoleを⾏うスクリプト https://dev.classmethod.jp/articles/assume-role-deploy-iam-user-and-role/

  86. 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
  87. 87 AssumeRole CI/CDの流れでデプロイするとき、 簡単にAssumeRoleしたい ./assume_role.sh source aws-env.sh

  88. 88 最後に、まとめ AssumeRoleを活⽤して、 少しでも安全にデプロイしよう

  89. None