Jump アカウント構成で ABAC を使って EC2 インスタンスの起動・停止許可を与える

2024.02.17

Jump アカウント構成で ABAC を試してみました。

イメージ図は下記となります。スイッチロール先の IAM ロールに ABAC に利用するタグを付与して実現します。複数の IAM ロールには同じ IAM ポリシーをアタッチしています。青のタグの IAM ロールは青のタグの EC2 インスタンスのみ操作できます。

複数のプロジェクトや環境が混在している際のアクセス制御に活用できます。

なお、ABAC の基本的な内容については下記ブログが参考になります。

Jump アカウント構成の ABAC 設定

Jump アカウントの設定とスイッチロール先のアカウントに分けて記載します。

Jump アカウントの設定

次の名前で IAM ユーザーを作成します。

  • IAM ユーザー名 test-user

作成した IAM ユーザーもしくは IAM ユーザーが所属するグループに次のポリシーをアタッチします。

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "*"
    }
}


今回は ABAC の動作確認がメインなので割愛しますが、MFA の設定許可やパスワードの変更許可もアタッチすることが多いです。


スイッチロール先アカウントの設定

下表の設定で 2 つの IAM ロールを作成します。アタッチするカスタマー管理ポリシーは同じものです。

項目 IAM ロール 1 IAM ロール 2
IAM ロール名 project-aaa-role project-bbb-role
許可 - カスタマー管理ポリシー project-abac-policy project-abac-policy
信頼ポリシー 下記参照 下記参照
タグ (Key : Value) Project : AAA Project : BBB

カスタマー管理ポリシーは次の通りです。

project-abac-policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:StartInstances",
                "ec2:StopInstances",
                "ec2:RebootInstances"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/Project": "${aws:PrincipalTag/Project}"
                }
            }
        }
    ]
}

信頼ポリシーは次の通りです。Principal には Jump アカウントのアカウント ID を指定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:user/test-user"
            },
            "Action": "sts:AssumeRole",
            "Condition": {}
        }
    ]
}


操作対象となる EC2 インスタンスは次の設定で作成します。

項目 EC2 インスタンス 1 EC2 インスタンス 2
EC2 インスタンス名 project-aaa-instance project-bbb-instance
タグ (Key : Value) Project : AAA Project : BBB

動作確認

Jump アカウントにtest-userでサインインして、スイッチロール先アカウントにproject-aaa-roleでスイッチロールします。

事前に作成した 2 つの EC2 インスタンスに対して停止を試したところ、「Project : AAA」タグを付与しているインスタンスは停止できました。

一方で、「Project : BBB」タグを付与しているインスタンスは停止できませんでした。想定通りの動作です。

次に、スイッチロール先アカウントにproject-bbb-roleでスイッチロールして同様にインスタンス停止を試してみます。

「Project : AAA」タグを付与しているインスタンスは停止できませんでした。

「Project : BBB」タグを付与しているインスタンスは停止できました。

以上で動作確認は終わりです。IAM ロールに付与しているタグと EC2 インスタンスに付与しているタグの一致によるアクションの制御ができました。

さいごに

Jump アカウント構成で ABAC を試してみました。1 つのアカウント内に複数のプロジェクトや環境がある場合のアクセス制御に活用できると思います。また、スイッチロール先の IAM ロールにアタッチするポリシーは 1 つのものを複数のロールにアタッチして利用できることも確認できました。管理の手間は少なくできそうです。

以上、このブログがどなたかのご参考になれば幸いです。