【问题标题】:How to limit access to an S3 bucket to a specific VPC while allowing console access如何将 S3 存储桶的访问权限限制为特定 VPC,同时允许控制台访问
【发布时间】:2019-06-12 23:03:26
【问题描述】:

我正在设置一组 S3 存储桶,并希望限制对 VPC 的访问,同时仍允许从 AWS 控制台访问这些存储桶。

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

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

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

{
"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 用户登录并删除策略才能重新获得对存储桶的访问权限。

【问题讨论】:

  • 当您说您要允许从控制台访问时,您是真的意思还是您的意思是您希望特定 IAM 用户可以访问 S3 存储桶(无论使用何种机制,是控制台、SDK、AWSCLI)?您尝试的政策建议后者。
  • 具体来说,我想让使用 AWS 控制台的管理 (IAM) 用户可以使用 S3 存储桶。这意味着直接在控制台中编辑存储桶 c 配置、更改策略等。目前这是不可能的。通过 SDK 和 AWSCLI 访问也很好,尽管我目前不知道如何实现。在 SDK/CLI 方面,我会为此使用角色(同样,我需要弄清楚这样做的正确方法是什么)
  • 您能否测试仅包含第一个“拒绝”语句的策略(删除您当前拥有的“允许”语句)并将条件修改为:“StringNotEquals”:{“aws:sourceVpce”: “vpc-01c9d66c12345”、“aws:用户名”:“user1”、“aws:用户名”:“user2”}。最好在您不关心的新存储桶上进行测试,以防万一。
  • 我试过了。似乎这会导致 AND 语句,而不是 OR。据我了解,您可以对单个键具有多个值,这些值被评估为“或”。另一方面,两个键被评估为 AND。因此,上述要求“aws:sourceVpce”=“vpc-01c9d66c12345”和“aws:username”=“user1”两个语句都为真。
  • 是的,它是一个 AND。但是,我提出的策略无论如何都行不通,因为您不能在同一条件下拥有多个 aws:username 元素。

标签: amazon-web-services amazon-s3 policy


【解决方案1】:

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

{
    "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 字符串或用户名与条件中列出的一致。

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

【讨论】:

  • 请注意,此策略允许来自 vpc-01c9d66c12345 的访问,但不会阻止来自其他 VPC 的访问。因此,从这个意义上说,它不会“限制对 VPC 的 [S3 存储桶] 的访问”,这是您声明的要求之一。这可能是可以接受的,除非您确实需要阻止来自其他 VPC 的访问 - 如所写,任何拥有 s3:* 的人都可以从不同的 VPC 访问此存储桶。
  • 嗯,那不是本意。什么向您表明可以从其他 VPC 访问存储桶?这应该只在您是指定用户之一时才有效,不是吗?因此,如果您在上述 VPC 中,或者您是用户 1 或用户 2,则您有权访问,否则您不能...对吗?
  • 运行时有效的策略是 S3 存储桶策略和客户端拥有的任何 IAM 策略的组合。例如,如果客户端具有允许 s3:* 针对资源:* 的 IAM 策略,那么他们可以写入此 S3 存储桶 - 存储桶策略中的任何内容都不会拒绝 IAM 访问。 S3 存储桶策略没有明确允许它,但它也没有明确拒绝它,IAM 策略将允许它。策略评估是显式拒绝 > 显式允许 > 隐式拒绝。默认情况下,在没有策略的情况下,一切都是隐式拒绝,正如您所期望的那样。
【解决方案2】:

此政策已经过测试,可提供您所需要的内容:

 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 端点才能正常工作。

【讨论】:

    【解决方案3】:

    诀窍似乎是拒绝一切,除非它来自用户或来自 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"
                }
            }
        }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-21
      • 2020-03-19
      • 2018-05-07
      • 2018-05-29
      • 2018-12-05
      • 1970-01-01
      • 2023-03-19
      • 2021-10-09
      相关资源
      最近更新 更多