Assume Roleを使ってクロスアカウントアクセスを試す

AWS

こんにちは、ガウタムです。
今回はセキュリティに関するテーマで、組織内でよく使用されるAssumeRoleを使ってクロスアカウントアクセスする簡単事例を紹介します。

背景

業務上、同じ組織内や協力業者のアカウント間でリクエストの許可や承認が必要なケースがあります。また、同じアカウント内でも実行権限を持っていないユーザーが一時的な権限を取得してAPIを実行することがあります。今回は、簡単な事例として、2つの別々のアカウント間でS3データを取得する方法について説明します。別のアカウントに直接AccessKeyとSecretKeyを渡してアクセスすることは、セキュリティ上の観点から望ましくありません。そのため、AssumeRoleが活用されます。

AssumeRoleについて

AssumeRoleは、異なるアカウント間でのセキュアなアクセスやセキュリティ監査など、AWSリソースへのアクセスを管理するための強力なツールです。AssumeRoleは、AWS Identity and Access Management(IAM)サービスの機能の1つであり、異なるAWSアカウント間や同じアカウント内の異なるIAMユーザー間での一時的な信頼関係を確立するために使用されます。この機能を使用すると、アカウント間でのリソースへのアクセスをセキュアに委任できます。つまり、自身のAWSアカウントのAPI権限を第三者に委譲する仕組みです。

AssumeRoleを使用するには、信頼されるアカウントやエンティティが、IAMロールに対する適切なポリシーを持っている必要があります。AssumeRoleを使用することで、異なるAWSアカウント間でのセキュアなアクセスが可能となります。これにより、リソースの共有やクロスアカウントの管理が容易になります。AssumeRoleを使用すると、一時的なセキュリティクレデンシャル(AccessKeyId、SecretAccessKey、SessionToken)が生成されます。これらのクレデンシャルは、一定の有効期間内のみ有効です。AssumeRoleを設定する際に、信頼されるアカウントやIAMエンティティ(ユーザー、ロール)を指定することができます。信頼ポリシーにより、アクセスを受け入れるエンティティが制御されます。

検証して見る

クロスアカウントのアクセスを許可するために、AssumeRoleを使用してAccountBからAccountAのS3バケットに対してGet/Listアクションを実行する方法を説明します。

今回あらかじめAccountAのS3バケットにgautamtest-assume-role バケットを作成し、バケットにtest.xt、とtest2.txtの2つのファイルをアップロードしてます。

AccountA(S3 バケットを所有するアカウント)の設定

  • IAM ポリシーの作成:。
  • IAM ロールの作成
    • AccountAでIAMロールを作成し、先ほど作成したポリシーをアタッチします。
    • IAMロールに、AccountBからのアクセスを信頼するポリシーを設定します。今回はS3GetListRoleを作成して以下のように信頼ポリシーを設定しました。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountB_ID:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

AccountB(アクセス元アカウント)の設定

同じく、AccountBのIAMポリシーに、AssumeRoleアクションを許可するポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::AccountA_ID:role/S3GetListRole"
        }
    ]
}

これで一旦設定は完了です。次に、AccountAの権限を持たないAccountBのユーザーがAccountAのS3バケットにアクセスできるかを確認します。

aws sts assume-role --role-arn "arn:aws:iam::AccountA_ID:role/S3GetListRole" --role-session-name "S3GetListSession"

上のコマンドを実行すると、以下のように一時的なCredentialsを取得できる。

取得したクレデンシャルを使用して、AccountAのS3バケットに対してGetObjectおよびListBucketアクションを実行します。

まとめ

このように、AssumeRoleを使用することで、異なるアカウント間でのセキュアなアクセスを確立し、リソースの共有や管理を容易にすることができます。また、一時的なセキュリティ資格情報が生成されるため、セキュリティを強化することができます。クロスアカウントのアクセスを許可する際には、信頼されるアカウントやIAMエンティティに適切なポリシーを設定することが重要です。AssumeRoleを活用することで、AWSリソースへの安全なアクセスを確保し、セキュリティを向上させることができます。

無料相談実施中
AWSを使用したサーバーレスアプリケーションの構築
サーバーレス開発内製化、AWSへの移行等
様々な課題について無料でご相談お受けいたします。
最新情報をチェックしよう!