SOS AWS S3存储桶策略

时间:2018-08-02 14:23:33

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

我正在尝试限制对我的AWS S3存储桶的访问,以便只有少数域,1个IP地址和AWS Lambda函数可以访问它。

这是我写的,但是没有用:-(

{
    "Version": "2012-10-17",
    "Id": "httpRefererPolicy",
    "Statement": [
        {
            "Sid": "AllowRequestsReferred",
            "Effect": "Allow",
            "Principal": "*",
            "Action": ["s3:GetObject","s3:GetObjectAcl"],
            "Resource": "arn:aws:s3:::example/*",
            "Condition": {
                "StringLike": {
                    "aws:Referer": [
                        "https://www.example.com/*",
                        "https://example.com/*",
                        "https://example.herokuapp.com/*",
                        "https://dfgdsfgdfg.cloudfront.net/*"
                    ]
                },
                "IpAddress": {
                    "aws:SourceIp": "219.77.225.296"
                }
            }
        },
        {
            "Sid": "DenyRequestsReferred",
            "Effect": "Deny",
            "NotPrincipal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": ["s3:GetObject","s3:GetObjectAcl"],
            "Resource": "arn:aws:s3:::example/*",
            "Condition": {
                "StringNotLike": {
                    "aws:Referer": [
                        "https://www.example.com/*",
                        "https://example.com/*",
                        "https://example.herokuapp.com/*",
                        "https://dfgdsfgdfg.cloudfront.net/*"
                    ]
                },
                "NotIpAddress": {
                    "aws:SourceIp": "219.77.225.296"
                }
            }
        }

    ]
}

我写错了什么?

1 个答案:

答案 0 :(得分:0)

您的政策规定:

如果请求是从某些网站引用的,则从(无效)IP地址进行

允许 GetObject的访问。

如果请求不是来自Lambda的 not 并且是 not 一个(无效的)IP地址并且是< 。

因此,第一件事是GetObject必须使用CIDR表示法,因此您应该使用:

IpAddress

第二,此策略中没有任何东西可以授予对Lambda函数的访问权限(因为ALLOW语句的IP地址上的 not 不是)。另外,您授予访问权限的方法似乎不太可行。我建议准予访问由Lambda函数使用的IAM角色

我建议您仅创建"aws:SourceIp": "219.77.225.296/32" 语句,并独立地访问每个源。如果您要基于ALLOWreferer或Lambda授予访问权限,则需要:

  • 基于IpAddress的ALLOW
  • 基于referer的ALLOW
  • 基于IpAddress的ALLOW(您需要通过允许Lambda函数使用的IAM角色进行访问来实现此目的)

仅在需要覆盖先前通过ALLOW授予的权限时使用DENY。最好尽可能避免DENY,以使事情更容易理解。