允许 lambda 函数访问 S3 存储桶但阻止外部 IP

Posted

技术标签:

【中文标题】允许 lambda 函数访问 S3 存储桶但阻止外部 IP【英文标题】:Allow lambda function to access S3 bucket but block external IPs 【发布时间】:2020-05-11 02:49:00 【问题描述】:

我正在尝试借助 lambda 函数写入 S3 存储桶,但希望 S3 存储桶仅可供办公网络内的 IP 访问。

我使用了这个存储桶策略,但是这不允许我的 lambda 写入 S3 存储桶,当我删除 IP 阻塞部分时,lambda 函数可以正常工作。

如何更改此存储桶策略,使其允许 lambda 写入但不允许外部 IPS 访问 S3 存储桶?

谢谢!




"Version": "2012-10-17",

    "Id": "",
    "Statement": [
        
            "Sid": "AllowSESPuts",
            "Effect": "Allow",
            "Principal": 
                "Service": "ses.amazonaws.com"
            ,
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::mybucket.net/*",
            "Condition": 
                "StringEquals": 
                    "aws:Referer": "230513111850"
                
            
        ,
        
            "Sid": "AllowECSPuts",
            "Effect": "Allow",
            "Principal": 
                "Service": "ecs-tasks.amazonaws.com"
            ,
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::mybucket.net/*"
        ,
        
            "Sid": "",
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation",
                "s3:PutObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::abc.net/*",
                "arn:aws:s3:::abc.net"
            ],
            "Condition": 
                "StringNotLike": 
                    "aws:userId": [
                        "AROAJIS5E4JXTWB4RTX3I:*",
                        "230513111751"
                    ]
                ,
                "NotIpAddress": 
                    "aws:SourceIp": [
                      "81.111.111.111/24" --dummy IP
                    ]
                
            
        

    ]

【问题讨论】:

"81.111.111.111/24" 是您办公室的 IP 地址,您会拒绝,对吧? 不,我只想允许办公室 IP 并阻止外部 IP 地址,上面代码 sn-p 中的那个只是一个虚拟 IP。 【参考方案1】:

作为一般规则,如果您可以避免在策略中使用Deny 语句,那么生活会更轻松。

因此,您可以配置:

具有存储桶策略的 Amazon S3 存储桶,允许从所需的 CIDR 范围进行访问 Lambda 函数的 IAM 角色,允许访问 Amazon S3 存储桶

存储桶策略中应该不需要Deny 语句,因为默认情况下拒绝访问。

【讨论】:

非常感谢。但问题是我想拒绝访问办公室网络之外的所有 IP 地址,并且在我的情况下 IAM 角色确实可以访问 Amazon S3 存储桶。 因为 S3 默认是私有的,所以如果一开始没有被允许,就没有必要拒绝。拒绝的困难在于它总是会否决允许,这使得很难制定 OR 类型的策略(例如,允许 SES OR Office IP 范围 OR Admins)。对于 Lambda 函数,您只需通过 Lambda 函数使用的 IAM 角色授予其访问 S3 存储桶的权限,而不必将其放入存储桶策略中。【参考方案2】:

一种典型的方法是将 lambda 函数放置在私有 VPC 子网中。然后将 S3 网关 VPC 终端节点附加到它,并将相应的 S3 存储桶策略设置为仅允许从 VPC 终端节点执行某些操作。 [ref]

【讨论】:

我也尝试将 lambda 放入 VPC,但它会减慢 lambda,并且在 900 秒后出现超时错误。 您可以更改超时时间。但请记住,如果您有一段时间不使用 VPC 中的 lambda 函数,第一次运行时会引发错误。您应该为案例添加重试逻辑。 另外,您需要增加函数的反向并发计数。目前不支持 VPC 中的 lambda 使用池中的并发。 @grnc 谢谢!但是 lambda 函数在 15 分钟后超时,我将超时持续时间保持在最大值,即 15 分钟,不能超过该时间 Lambda 函数在尝试通过 VPC Endpoint 访问 S3 时是否挂起?如果是这样,它要么是由 VPC 端点上的策略引起的,要么是由路由表配置(实际上应该是自动的)引起的。或者,Lambda 函数是否尝试访问 Internet?

以上是关于允许 lambda 函数访问 S3 存储桶但阻止外部 IP的主要内容,如果未能解决你的问题,请参考以下文章

允许从特定 VPC 或控制台访问 S3 存储桶

尝试使用基于S3资源的策略允许Lambda访问S3,为什么它不起作用?

使用 Amazon S3 阻止公有访问

允许 Lambda 的 S3 策略

Amazon S3 存储桶策略只允许访问特定的 http

S3 拒绝管理员访问