クロスアカウントロールを使用したAWSアカウント間のアクセス権限の委任

クロスアカウントでAWSアカウント間のアクセス権限の委任

クロスアカウントロールを使用して、AWSアカウント間でアクセス権限を委任する

特定のAWSリソースに、別のAWSアカウントからアクセスすることをクロスアカウントアクセスと言います。

特定のアカウントにあるリソースを別のアカウントのユーザーと共有します。このようにクロスアカウントアクセスを設定することで、お客様はアカウントごとに IAM ユーザーを作成する必要がなくなります。

IAM チュートリアル: AWS アカウント間の IAM ロールを使用したアクセスの委任

本ページでは、以下のページを参考に、クロスアカウントアクセスの方法を確認します。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html

構築する環境

Diagram of delegate access rights across AWS accounts using IAM roles.

2つのAWSアカウントを使用します。

1つ目のアカウントは2つのリソースを作成します。

1つ目はSSMパラメータストアにパラメータを作成します。
2つ目はIAMロールを作成します。
このIAMロールは、先述のSSMパラメータストアにアクセスするための権限を有しています。

2つ目のアカウントはこのIAMロールを引き受けます。
ロールを引き受けた後、SSMパラメータストアにアクセスできることを確認します。

環境構築用のCloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しました。

https://github.com/awstut-an-r/awstut-dva/tree/main/02/002

テンプレートファイルのポイント解説

(参考)SSMパラメータストア

Resources:
  Parameter:
    Type: AWS::SSM::Parameter
    Properties:
      Name: !Sub "${Prefix}-Parameter"
      Type: String
      Value: Test Parameter
Code language: YAML (yaml)

検証用のリソースとして、SSMパラメータを作成します。
特別な設定は行いません。

IAMロール

Resources:
  SSMParameterRole:
    Type: AWS::IAM::Role
    DeletionPolicy: Delete
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              AWS: !Ref CrossAccountId
      Policies:
        - PolicyName: !Sub "${Prefix}-GetParameterPolicy"
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - ssm:DescribeParameters
                Resource: "*"
              - Effect: Allow
                Action:
                  - ssm:GetParameter
                Resource:
                  - !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${Parameter}"
Code language: YAML (yaml)

ポイントは信頼ポリシーです。
PrincipalプロパティにクロスアカウントアクセスするアカウントのIDを指定します。

インラインポリシーでは、SSMパラメータストアへのアクセス権限を定義します。
こちらについては、以下のページを参考に設定しました。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-paramstore-access.html

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

https://awstut.com/2021/12/02/cloudformation-nested-stacks

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • SSMパラメータ:dva-02-002-Parameter
  • IAMロール:dva-02-002-IAMStack-3A259XLV4A28-SSMParameterRole-1E0267AH90Z9O

AWS Management Consoleから各リソースを確認します。

SSMパラメータを確認します。

Detail of SSM 1.

確かにパラメータが作成されています。

IAMロールを確認します。

Detail of IAM 1.
Detail of IAM 2.

権限を見ると、先述のSSMパラメータにアクセスするための権限が設定されていることがわかります。

信頼関係を見ると、クロスアカウントアクセスするアカウントのID(のrootユーザ)がプリンシパルとして設定されています。

動作確認

準備が整いましたので、クロスアカウントアクセスします。

クロスアカウントアクセスするアカウントで、マネージメントコンソールを開き、「Switch role」を押下します。

Detail of IAM 3.

引き受けるロールの情報を入力し、「Switch Role」を押下します。

Detail of IAM 4.

正常にロールが引き受けられますと、右上にそのロールが表示されます。

Detail of IAM 5.

試しにEC2のページに開きます。

Detail of IAM 6.

全ての項目でエラーが表示されています。
現在引き受けているロールでは、EC2に関する権限は許可されていないためです。

改めてSSMパラメータストアを確認します。

Detail of SSM 2.

先ほど確認したパラメータが表示されました。

詳細を確認します。

Detail of SSM 3.

パラメータの値についても確認できます。

このようにクロスアカウントロールを引き受けることによって、別アカウントのリソースにアクセスすることができます。

まとめ

クロスアカウントロールを使用して、AWSアカウント間でアクセス権限を委任する方法を確認しました。