AWS IAM Identity Center のアクセス許可セットで IP アドレス制限を設定する

2023.07.25

AWS IAM Identity Center のアクセス許可セットのインラインポリシーを利用して、IP アドレス制限を設定する方法を紹介します。

外部 ID プロバイダーと認証連携している場合は、外部 ID プロバイダーの機能で IP アドレス制限を実施できる場合があります。本ブログでは、cと認証連携していない場合や、外部 ID プロバイダー側で IP アドレス制限を設定できない場合などを想定して AWS IAM Identity Center で IP アドレス制限を実現してみます。


なお、外部 ID プロバイダーで IP アドレス制限を実施することで AWS アクセスポータルにアクセスする前にブロックできます。例えば、Azure AD では条件付きアクセス機能で AWS アクセスポータルへのアクセスを IP アドレスで制限できます。下記ブログでは AWS IAM Identity Center にアクセスするエンタープライズアプリケーションに条件付きアクセスを設定しています。

アクセス許可セットで IP アドレス制限

アクセス許可セットでの IP アドレス制限は IAM ポリシーと同様の方法と実現できます。今回は、IAM ポリシーのユーザーガイドを参考に設定してみます。

AWS: 送信元 IP に基づいて AWS へのアクセスを拒否する - AWS Identity and Access Management


IP アドレス制限のポリシー例

IP アドレス192.0.2.1/32からのアクセスを許可する例です。次のポリシーをアクセス許可セットのインラインポリシーに設定することが IP アドレス制限の実現方法の 1 つです。

{
	"Version": "2012-10-17",
	"Statement": {
		"Effect": "Deny",
		"Action": "*",
		"Resource": "*",
		"Condition": {
			"NotIpAddress": {
				"aws:SourceIp": [
					"192.0.2.1/32"
				]
			},
			"Bool": {
				"aws:ViaAWSService": "false"
			},
			"StringNotLike": {
				"aws:userAgent": "*aws-cli*"
			}
		}
	}
}

Condition の 14 行目は AWS サービスから操作される場合を除外しています。一部の操作はユーザーのが利用している IP アドレスではなく、AWS のサービス経由で実行されるためです。

Condition の 16 行目は AWS CloudShell を利用できるようにする設定です。上述したユーザーガイドに注記がありますが、AWS CloudShell から発生した API リクエストはユーザーの利用している IP アドレスと AWS のサービス経由のどちらでもないため、除外しています。


アクセス許可セットの設定

アクセス許可セットの設定例です。AWS マネージドポリシーで AdministratorAccess 権限を選択するのに加えて、インラインポリシー に上述した IP アドレス制限のポリシーを設定します。

本設定で作成したアクセス許可セットを関連付けたユーザーで指定した192.0.2.1/32以外の IP アドレスから AWS アカウントにアクセスした場合は、次のようにアカウントにアクセスはできますが、権限がない状態にできます。下記画像は EC2 のマネジメントコンソールの表示例です。

別の例として AWS IAM Identity Center にアクセスしたときの画面です。

次に、指定した IP アドレス192.0.2.1/32からアクセスすると、EC2 のマネジメントコンソールはエラーなく表示されました。

AWS CloudShell も実行できました。

$ aws sso-admin list-instances
{
    "Instances": [
        {
            "InstanceArn": "arn:aws:sso:::instance/ssoins-7758507c6example",
            "IdentityStoreId": "d-xxxxxxxxxx"
        }
    ]
}

IP アドレス制限が実現できていることを確認できました。


AWS CloudShell を除外しない場合

試しに AWS CloudShell を除外しない場合の下記ポリシーでも確認してみます。

{
	"Version": "2012-10-17",
	"Statement": {
		"Effect": "Deny",
		"Action": "*",
		"Resource": "*",
		"Condition": {
			"NotIpAddress": {
				"aws:SourceIp": [
					"192.0.2.1/32"
				]
			},
			"Bool": {
				"aws:ViaAWSService": "false"
			}
		}
	}
}


許可している IP アドレス192.0.2.1/32からアクセスした場合においても、次のように AWS CloudShell から実行できませんでした。

$ aws sso-admin list-instances

An error occurred (AccessDeniedException) when calling the ListInstances operation: User: arn:aws:sts::111122223333:assumed-role/AWSReservedSSO_AdministratorAccess_067748c8cexample/test-user is not authorized to perform: sso:ListInstances with an explicit deny in an identity-based policy

さいごに

AWS IAM Identity Center のアクセス許可セットで IP アドレス制限を実施する方法を紹介しました。IAM サービスで実現するのとほぼ同じ方法で実現できました。

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