特定のIPまたはVPCからのみ許可するS3バケットポリシーの設定

  • 2023年10月30日
  • 2023年10月30日
  • AWS, IT
AWS

こんにちはますのです。
先日、X(旧Twitter)でとある投稿を見ました。

AWSドキュメントのS3バケットポリシー制御で、IP制限にDeny使ってるけど、Allow条件入ってないからアクセス出来ないのでは??
{
    "Version": "2012-10-17",
    "Id": "S3PolicyId1",
    "Statement": [
        {
            "Sid": "IPAllow",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": "192.0.2.0/24"
                }
            }
        }
    ]
}

引用:バケットポリシーの例(特定の IP アドレスに基づくアクセス管理)

日頃利用していた条件ではありましたがアクセス出来る理由を説明出来ないことに気が付いたため、バケットポリシーの仕様確認も含めて整理しようと思います。

目指す構成:特定のIP or VPCからのみアクセス許可とする

S3バケットポリシーへの許可設定として、「特定のIP or VPCからのみアクセス許可」を実現したいと思います。

S3バケットポリシー構成

以下のS3バケットポリシーを設定することで「vpc-abc1234」もしくは「192.x.x.x/32」に該当する場合に限定することが可能です。

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Deny",
			"Principal": "*",
			"Action": "s3:*",
			"Resource": [
				"arn:aws:s3:::bbbb-bucket",
				"arn:aws:s3:::bbbb-bucket/*"
			],
			"Condition": {
				"NotIpAddress": {
					"aws:SourceIp": "192.x.x.x/32"
				},
				"StringNotEquals": {
					"aws:sourceVpc": "vpc-abc1234"
				}
			}
		}
	]
} 

上記例はグローバルIPからのアクセス制限であり、VPCに付与されているIPアドレスでの制限では無い点に注意です。
今回の例では意味ないですが、VPCのプライベートIPアドレスを指定する場合は「aws:VpcSourceIp」を利用します。

Allow条件が不要な理由

S3バケットポリシーに「Allow」を明示的に記載しなくてもアクセス可能な理由は「IAMポリシーでS3アクセスが許可」されているからです。

AWS ポリシーの評価理論に基づく

AWSではポリシーの評価理論が設定されています。

優先度 評価理論 内容
1 明示的な拒否(Deny) ポリシーでDenyが設定されている場合。
IAMやS3などのポリシーで明示的なAllow条件が設定されていても、明示的なDenyが優先される。
2 明示的な許可(Allow) ポリシーでAllowが設定されている場合。
IAMやS3などのポリシーで明示的なDenyが設定されていなければ、明示的なAllowが適用される。
3 暗黙的な拒否(Deny) ポリシーにDenyもAllowも設定されていない場合(デフォルト)
暗黙のDenyとして通信は遮断される。

実際にフローで追うと下図のようになります。

引用:ポリシーの評価理論(アカウント内でのリクエストの許可または拒否の決定)

❶「192.x.x.x/32」or「vpc-abc1234」以外の通信

・S3バケットポリシーの明示的なDenyが適用される

❷「192.x.x.x/32」or「vpc-abc1234」の通信

・S3バケットポリシー:Deny設定無し
・IAMポリシー:明示的なAllowが適用
※IAMポリシーにAllow設定が入っていない場合は暗黙のDenyが適用される。

IP制御時に「Allow」のみとした場合

特定のIPやVPCからのアクセス制御をしたい場合に、DenyではなくAllowのみで良いのでは?と考えました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "192.0.2.0/24"
                }
            }
        }
    ]
}

IAMポリシーで該当のS3バケットに対して明示的にDenyを設定していない場合どうなるか考えてみます

IAMで許可されていればどこからでアクセス可能である

指定IP以外からS3バケットポリシーへアクセスをしてみます。
IAMポリシーでS3バケットへのAllowが設定されていた場合に「明示的なAllow」が適用されます。

  • S3バケットポリシーでDenyが設定されていない
  • IAMポリシーで明示的なAllowが設定されている
    • S3アクセスが許可されているIAMであれば、場所に限定されないでアクセスが可能となる。

S3で許可された場所ならアクセス可能である

続いて、IAMポリシーでS3バケットに対して「Allow」も「Deny」も設定されていない場合で、S3バケットポリシーの許可IP拠点からアクセスをしてみます。

  • S3バケットポリシーでAllowが設定されている
  • IAMポリシーでDenyが設定されていない
    • S3バケットポリシーで許可したIPであれば、IAMでDenyされていない限りアクセスが可能となる。
IPやVPCに限定したアクセスとしたい場合、IAM側でDenyの設定がされていない限り許可となってしまいます。
運用性を考えるとS3バケットポリシーでDeny設定を行った方が扱いやすく、AWSドキュメントの設定を行うことが好ましいと考えます。
以上、ポリシーの評価理論が重要であり、S3バケットポリシー単体で見るのではなくIAMポリシーも含めて考える必要があることが分かりました。

参考資料

最新情報をチェックしよう!