こんにちはますのです。
先日、X(旧Twitter)でとある投稿を見ました。
{
"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"
}
}
}
]
}
今回の例では意味ないですが、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で許可されていればどこからでアクセス可能である
指定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されていない限りアクセスが可能となる。
運用性を考えるとS3バケットポリシーでDeny設定を行った方が扱いやすく、AWSドキュメントの設定を行うことが好ましいと考えます。