允许 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的主要内容,如果未能解决你的问题,请参考以下文章