下記要件でクロスアカウントでスイッチロールしてみます。
- AWSアカウントは2つ
- IAMユーザ用アカウント
- IAMユーザ作るのは、ここだけ
- スイッチしない場合は、認証、MFA設定、パスワード変更だけできる
- 開発用アカウント
- IAMユーザなし
- 「IAMユーザ用アカウント」からスイッチロールして入る
- MFAで2段階認証した場合だけスイッチできる
- スイッチするときはユーザ名を伝える。(CloudTrailがユーザ名で検索できる)
IAMユーザ用アカウントでの作業
作成するもの
- IAMロール(スイッチ用)
- IAMグループ(ログイン用)
- IAMユーザ(ログイン用)
IAMロール作成
スイッチ用のロールを作ります。
IAMユーザでログイン後、このロールにスイッチして「IAMユーザ用アカウント」で作業するようにします。CloudFromationテンプレートのサンプルは下記のとおり。
パラメータの${AccountId} の部分には、「IAMユーザ用アカウント」のAWSアカウントIDを指定します。ConditionでスイッチするIAMユーザ名の有無をチェックしています。この条件は、Versionが 2012-10-17 より古いと使用できないようです。
ちなみに、rain は、IAMユーザ名を伝えられないようなので、rainを使いたい場合は、このConditionは削除したほうが良さそうです。
MFAを設定して、ログインし直すと、スイッチロールできます。
SwitchRoleDev: Type: AWS::IAM::Role Properties: RoleName: Blue21DemoDevRole AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: AWS: - !Sub arn:aws:iam::${AccountId}:root Action: - 'sts:AssumeRole' Condition: StringLike: sts:RoleSessionName: ${aws:username} Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonS3FullAccess - arn:aws:iam::aws:policy/AmazonEC2FullAccess - arn:aws:iam::aws:policy/IAMReadOnlyAccess Policies: - PolicyName: accesskey-fullaccess PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "iam:DeleteAccessKey" - "iam:GetAccessKeyLastUsed" - "iam:UpdateAccessKey" - "iam:CreateAccessKey" - "iam:ListAccessKeys" Resource: "arn:aws:iam::「IAMユーザ用アカウントのID」:user/${aws:username}"
「IAMユーザ用アカウント」の、このロールにはアクセスキーを作成する権限を与えます。
IAMグループ作成
IAMユーザ用のグループを作成します。
グループに設定するポリシーでは、「パスワード変更」、「MFA設定」、「スイッチロール」ができるだけの最小限の権限を与えます。
CloudFromationテンプレートのサンプルは下記のとおり。
DevGroupPolicy: Type: AWS::IAM::ManagedPolicy Properties: ManagedPolicyName: Blue21DemoDevUser Groups: - !Ref DevGroup PolicyDocument: Version: "2012-10-17" Statement: - Sid: "VisualEditor0" Effect: "Allow" Action: - "iam:ChangePassword" Resource: "arn:aws:iam::*:user/${aws:username}" - Sid: "VisualEditor1" Effect: "Allow" Action: - "iam:GenerateCredentialReport" - "iam:Get*" - "iam:List*" - "iam:SimulatePrincipalPolicy" - "iam:SimulateCustomPolicy" - "iam:GenerateServiceLastAccessedDetails" Resource: "*" - Sid: "VisualEditor2" Effect: "Allow" Action: - "iam:DeactivateMFADevice" - "iam:EnableMFADevice" - "iam:ResyncMFADevice" - "iam:ListMFADevices" Resource: "arn:aws:iam::*:user/${aws:username}" - Sid: "VisualEditor3" Effect: "Allow" Action: - "iam:DeleteVirtualMFADevice" - "iam:CreateVirtualMFADevice" Resource: "arn:aws:iam::*:mfa/${aws:username}" - Sid: "VisualEditor4" Effect: "Allow" Action: - "sts:AssumeRole" Resource: "arn:aws:iam::*:role/Blue21DemoDevRole" Condition: BoolIfExists: aws:MultiFactorAuthPresent: "true"
DevGroup: Type: AWS::IAM::Group Properties: GroupName: Blue21DemoGroupDev Path: /
IAMユーザ作成
IAMユーザを登録します。
aws-cli だと下記のとおり。
このユーザには、AWSコンソールのログインを許可します。
このユーザには、AWSコンソールのログインを許可します。
$ aws iam create-user --user-name user-dev01 $ aws iam create-login-profile --user-name user-dev01 --password P@ss20210627 --password-reset-required $ aws iam add-user-to-group --user-name user-dev01 --group-name Blue21DemoGroupDev
開発用アカウントでの作業
作成するもの
- IAMロール(スイッチ用)
IAMロール作成
スイッチ用のロールを作ります。
「IAMユーザ用アカウント」のユーザが、このロールにスイッチして「開発用アカウント」で作業するようにします。CloudFromationテンプレートのサンプルは下記のとおり。
前述の「IAM用アカウント」で作成したロールとの違いは、「アクセスキー」を操作する権限がないことだけです。
パラメータの${AccountId} の部分には、「IAMユーザ用アカウント」のAWSアカウントIDを指定します。ConditionでスイッチするIAMユーザ名の有無をチェックしています。
SwitchRoleDev: Type: AWS::IAM::Role Properties: RoleName: Blue21DemoDevRole AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: AWS: - !Sub arn:aws:iam::${AccountId}:root Action: - 'sts:AssumeRole' Condition: StringLike: sts:RoleSessionName: ${aws:username} Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonS3FullAccess - arn:aws:iam::aws:policy/AmazonEC2FullAccess
AWSコンソールで確認
AWSコンソールで「IAMユーザ用アカウント」にログインすると、初回のみパスワード変更を要求されます。
試しに、MFAを設定せずに、スイッチロールしてみるとエラーになりましました。
スイッチロールすれば、Blue21DemoDevRoleの権限で作業できます。
下図の左が「ログインしたアカウントの情報」、右が「スイッチした先のアカウントの情報」になります。
「IAMユーザ用アカウント」から「開発用アカウント」へもスイッチできます。
なお、このユーザが所属するグループは、Blue21DemoDevRoleへのスイッチしか許可していないので、他のロールにスイッチしようとするとエラーになります。
MFAの設定は下記ページ参照。
ChromeでGoogle Authenticator使うと便利です。
ChromeでGoogle Authenticator使うと便利です。
Chromeで複数アカウントを使い分けたいときは、下記ページ参照
Chromeからスイッチロールの履歴を削除したい場合は、下記ページ参照
Chromeでスイッチロールを便利に使う方法は、下記ページ参照
aws-cli で確認
まず、アクセスキーを作ります。
AWSコンソールで「IAMユーザ用アカウント」にログインします。
ログインしただけではアクセスキーを作成する権限がないので、Blue21DemoDevRoleにスイッチして、アクセスキーを作成します。
次に、aws-cli の設定をします。
~/.aws/config の設定は下記のとおり。
blue21-iam が「IAMユーザアカウント」用
[profile blue21-iam] region = us-east-1 output = json [profile blue21-dev] region = us-east-1 output = json role_arn = arn:aws:iam::「IAMユーザ用アカウントのID」:role/Blue21DemoDevRole mfa_serial = arn:aws:iam::「IAMユーザ用アカウントのID」:mfa/user-dev01 role_session_name = user-dev01 source_profile = blue21-iam [profile sandbox-dev] region = us-east-1 output = json role_arn = arn:aws:iam::「開発ユーザ用アカウントのID」:role/Blue21DemoDevRole mfa_serial = arn:aws:iam::「IAMユーザ用アカウントのID」:mfa/user-dev01 role_session_name = user-dev01 source_profile = blue21-iam
~/.aws/credentiales は下記のとおり。
[blue21-iam] aws_access_key_id = 「アクセスキー」 aws_secret_access_key = 「シークレットアクセスキー」
「IAM用アカウント」で作業したい場合は、下記のように実行します。
MFAの認証コードを聞かれるので、認証コードを入力すると実行できます。
$ aws s3 ls --profile blue21-dev Enter MFA code for arn:aws:iam::123456789012:mfa/user-dev01:
「開発用アカウント」で作業したい場合は、下記のように実行します。
MFAの認証コードを聞かれるので、認証コードを入力すると実行できます。
$ aws s3 ls --profile sandbox-dev Enter MFA code for arn:aws:iam::345678901234:mfa/user-dev01:
aws-cliでMFAする場合は、aws-mfaを使うと便利です。
下記ページ参照
下記ページ参照