Slide 1

Slide 1 text

CloudShellで スイッチロール 2022/4/7(木)JAWS-UG CLI専門支部 #253R EC2基礎 (VPC)

Slide 2

Slide 2 text

自己紹介 • 名前 • emi(木谷映見) • 業務 • 2016/4~SIer勤務5年 • NW機器設定 • オンプレサーバ構築(ほぼWindows) • Azureインフラ環境構築 • 2022/2~株式会社サーバーワークス • AWSリフト済システムの改善など お手伝いしています

Slide 3

Slide 3 text

おひとりさまOrganizations始めました! • https://speakerdeck.com/opelab/20210826-jawsug-asa- organizations-region?slide=4

Slide 4

Slide 4 text

スイッチロールのおさらい

Slide 5

Slide 5 text

マルチアカウントでシステム運用 AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account

Slide 6

Slide 6 text

マルチアカウントでシステム運用 AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account

Slide 7

Slide 7 text

マルチアカウントでシステム運用 AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account AWS Account

Slide 8

Slide 8 text

スイッチロールとは Account A Account B AccountB_role スイッチ元アカウント アカウントAのユーザは、 アカウントBに スイッチロールしたい。 アカウントAのユーザは、 アカウントBに作成された ロールを引き受ける。 スイッチ元先アカウント AccountA_user

Slide 9

Slide 9 text

参照 スイッチロールとは Account A Account B スイッチ元アカウント スイッチ元先アカウント アカウントBのロールを引き受けた アカウントAのユーザは、アカウントB内の リソースの操作が可能になる。 AccountB_role AccountA_user

Slide 10

Slide 10 text

スイッチする前の権限確認 Account A Account B ユーザーベースのポリシー "Action": "sts:AssumeRole“ “Resource”:今回はAccountB_role ユーザーベースのポリシー "Action": roleができること (今回はReadOnlyAccess) 信頼ポリシー "Action": "sts:AssumeRole", "Principal": roleをかぶっていいよ、 と信頼している相手 (今回はAccountA_user) スイッチ元アカウント スイッチ元先アカウント AccountB_role AccountA_user

Slide 11

Slide 11 text

{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource":"arn:aws:iam::アカウントBのアカウントID:role/AccountB_role" } } スイッチする前の権限確認 スイッチ元アカウントAのユーザ AccountA_user

Slide 12

Slide 12 text

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<スイッチ元(アカウントA)AWSアカウントID>:user/AccountA_user" }, "Action": "sts:AssumeRole", "Condition": {} } ] } スイッチする前の権限確認 { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "a4b:Get*", "a4b:List*", : : "xray:BatchGet*", "xray:Get*" ], "Resource": "*" } ] } AWS管理のReadOnlyAccess スイッチ先アカウントBのロール AccountB_role

Slide 13

Slide 13 text

CloudShell でスイッチロール

Slide 14

Slide 14 text

aws sts assume-role でスイッチロールに 必要な情報を確認する [cloudshell-user@ip-10-0-162-90 ~]$ aws sts assume-role ¥ > --role-arn "arn:aws:iam:::role/AccountB_role" ¥ > --role-session-name session-name { "Credentials": { "AccessKeyId": "xxxxxxxxxxxxxxxxxxxx", "SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "SessionToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "Expiration": "2022-04-02T17:36:16+00:00" }, "AssumedRoleUser": { "AssumedRoleId": "xxxxxxxxxxxxxxxxxxxxx: session-name ", "Arn": "arn:aws:sts:::assumed-role/AccountB_role/session-name" } } [cloudshell-user@ip-10-0-162-90 ~]$ ① ② ③

Slide 15

Slide 15 text

環境変数を設定する準備 • aws sts assume-role の表示結果を変数role_credentialsに格納する $ role_credentials=$(aws sts assume-role ¥ --role-arn "arn:aws:iam::アカウントBのアカウントID:role/AccountB_role" ¥ --role-session-name session-name)

Slide 16

Slide 16 text

環境変数を設定する ①AccountB_roleのアクセスキーを環境変数AWS_ACCESS_KEY_IDに格納する $ export AWS_ACCESS_KEY_ID=$(echo $role_credentials | ¥ jq -r '.Credentials.AccessKeyId') ②AccountB_roleのシークレットアクセスキーを環境変数 AWS_SECRET_ACCESS_KEYに格納する $ export AWS_SECRET_ACCESS_KEY=$(echo $role_credentials | ¥ jq -r '.Credentials.SecretAccessKey') ③セッショントークンを環境変数AWS_SESSION_TOKENに格納する $ export AWS_SESSION_TOKEN=$(echo $role_credentials | ¥ jq -r '.Credentials.SessionToken')

Slide 17

Slide 17 text

スイッチしたロールの情報を確認する [cloudshell-user@ip-10-0-132-110 ~]$ aws sts get-caller-identity { "UserId": “xxxxxxxxxxxxxxxxxxxxx:session-name", "Account": "", "Arn": "arn:aws:sts:::assumed-role/AccountB_role/session-name" } [cloudshell-user@ip-10-0-132-110 ~]$ • aws sts get-caller-identity を実行し、スイッチした現在のロール の情報を確認する

Slide 18

Slide 18 text

スイッチ先のアカウントリソースを 見てみる • この状態で AWS CLI コマンドを普通に実行すれば、 スイッチ先(アカウントB)のリソースを操作することができる [cloudshell-user@ip-10-0-132-110 ~]$ aws s3 ls 2022-03-26 09:36:37 emiki-bucket1 2022-03-26 09:37:07 emiki-bucket2 [cloudshell-user@ip-10-0-132-110 ~]$ アカウントBのS3 バケット 一覧が見えています

Slide 19

Slide 19 text

スイッチバックする • スイッチバックは以下のコマンドを入力し、環境変数を削除す る。(もしくはctr+dでセッションを切断する) unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN • aws sts get-caller-identity を実行すると、アカウントAのユーザに スイッチバックしているしていることが確認できる。 [cloudshell-user@ip-10-0-47-62 ~]$ aws sts get-caller-identity { "UserId": "AxxxxxxxxxxxxxxxxxxH", "Account": "アカウントAのアカウントID", "Arn": "arn:aws:iam::アカウントAのアカウントID:user/AccountA_user" } [cloudshell-user@ip-10-0-47-62 ~]$

Slide 20

Slide 20 text

注意 • 最大セッション時間に注意!

Slide 21

Slide 21 text

注意 • 最大セッション時間に注意!

Slide 22

Slide 22 text

参考 • AWS CLIでスイッチロール • https://qiita.com/emiki/items/2f45f080d77c31613ec5 • ヤマムギ - AWS CLIを使用したIAMロールの引き受けコマンドのメモ • https://www.yamamanx.com/aws-cli-iamrole-assumerole/ • AWS CLI を使用して IAM ロールを引き受けるにはどうすればよいですか? • https://aws.amazon.com/jp/premiumsupport/knowledge-center/iam-assume-role-cli/ • AWS Command Line Interface バージョン 2 のユーザーガイド - 設定の基本 • https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html • AWS CloudShell ユーザーガイド • https://docs.aws.amazon.com/ja_jp/cloudshell/latest/userguide/limits.html