繁体   English   中英

如何在允许控制台访问的同时将 S3 存储桶的访问权限限制为特定 VPC

[英]How to limit access to an S3 bucket to a specific VPC while allowing console access

我正在设置一系列 S3 存储桶,并希望将它们的访问权限限制在 VPC 上,同时仍允许从 AWS 控制台访问存储桶。

正如此处所建议的我创建了一个 S3 端点并将其添加到主路由表中。 端点上的策略允许完全访问所有资源。

我创建了一个 S3 策略(见下文)并将其添加到存储桶中。 一旦我保存了策略,就无法再从控制台访问存储桶。

我还尝试以“aws:username”:“user1”的形式将用户专门添加到条件“StringNotEquals”中,但无济于事。

{
"Version": "2012-10-17",
"Id": "Policy-S3-Bucket-myBucket",
"Statement": [

    {
        "Sid": "Access-via-VPC-only",
        "Principal": "*",
        "Action": "s3:*",
        "Effect": "Deny",
        "Resource": [
            "arn:aws:s3:::myBucket",
            "arn:aws:s3:::myBucket/*"
        ],
        "Condition": {
            "StringNotEquals": {
                "aws:sourceVpc": "vpc-01c9d66c12345"
            }
        }
    },
    {
        "Sid": "Allow-console-access",
        "Action": [
          "s3:*"
        ],
        "Effect": "Allow",
        "Resource": [
          "arn:aws:s3:::myBucket",
          "arn:aws:s3:::myBucket/*"
      ],
        "Principal": {
          "AWS": [
            "arn:aws:iam::<account-id>:user/user1", "arn:aws:iam::<account-id>:user/user2"
          ]
        }
      }
]
}

预期的结果是 S3 存储桶只能由上述 VPC 和 AWS 控制台访问。

实际结果是:

存储桶概览显示“错误:拒绝访问”,权限页面(公共访问设置)显示:“您无权查看此配置。请联系您的帐户管理员请求访问。”

我必须使用 root 用户登录并删除策略以重新获得对存储桶的访问权限。

我找到了一个似乎有效的解决方案。 我已经在策略模拟器中对其进行了测试,它似乎在实时环境中也能正常工作。 以下策略可以解决问题:

{
    "Version": "2012-10-17",
    "Id": "Policy-S3-Bucket-myBucket",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:username": ["user1", "user2"]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::myBucket"],
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpc": "vpc-01c9d66c12345"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": ["s3:ListBucket"],
            "Resource": ["arn:aws:s3:::myBucket"],
            "Condition": {
                "StringEquals": {
                    "aws:username": ["user1", "user2"]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": ["arn:aws:s3:::myBucket/*"],
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpc": "vpc-01c9d66c12345"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": ["arn:aws:s3:::myBucket/*"],
            "Condition": {
                "StringEquals": {
                    "aws:username": ["user1", "user2"]
                }
            }
        }
    ]
}

该策略要求 sourceVpc 字符串或用户名与条件中列出的一样。

诚然,该策略是冗长的,并且有大量的复制。 如果有人有更有效地解决这个问题的想法,我会全力以赴。

该政策已经过测试,可准确满足您的需求:

 Statement": {        
        "Sid": "Allow-anonymous-access-from-specific-VPC",
        "Effect": "Allow",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::bucket_name/*",
        "Condition": {
            "StringEquals": {
                "aws:SourceVpc": "some-vpc-id"
            }
        }
    }

这将允许来自“some-vpc-id”的请求匿名访问,同时允许从 AWS 控制台访问。

您的 VPC 必须配置 S3 端点才能工作。

诀窍似乎是拒绝一切,除非它来自用户或来自 VPC,但它必须处于相同的条件。 策略的工作方式是拒绝规则优先于其他所有规则,因此如果您拒绝,则不能允许后续规则; 它已经被拒绝了,就是这样。

顺便说一下,root 用户的 aws:userid 是 Account Id。 使用此用户可能是一种不好的做法,但是很好:P

所以我的存储桶现在只接受来自 VPC 和我通过 AWS Web 控制台登录的用户的流量(所以我不会在 Web 控制台中收到拒绝访问的错误)

{
"Version": "2012-10-17",
"Id": "Policy154336817545456388",
"Statement": [
    {
        "Sid": "Block-if-not-from-VPC-or-Me",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:*",
        "Resource": [
            "arn:aws:s3:::bucket-name",
            "arn:aws:s3:::bucket-name/*"
        ],
        "Condition": {
            "StringNotEquals": {
                "aws:SourceVpce": "vpce-4598ujfjrhc",
                "aws:userid": "576767373466"
            }
        }
    }
    ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM