我需要创建一个AWS Bucket策略,该策略可以阻止除办公室IP外的所有外部IP地址,但仍允许Lambda函数访问Bucket。
我知道如何使用AWS VPC和NAT来完成这项工作,但是由于所涉及的成本很高,客户端不希望激活它们。
到目前为止,这是我的存储桶策略的样子,但是没有用:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "GiveSESPermissionToWriteEmail",
"Effect": "Allow",
"Principal": {
"Service": "ses.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::files-dev/*"
},
{
"Sid": "SourceIP",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": "arn:aws:s3:::files-dev/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"81.111.111.111/24"
]
}
}
},
{
"Sid": "GiveLambdaPermisssion",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::6XXXXXX:role/app-backend-dev-lambdaFunctionRole-1XXXX"
],
"Service": "lambda.amazonaws.com"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::files-dev/*"
}
]
}
我认为我已经阅读了所有可以找到的与此有关的AWS文档,但找不到所需的内容。可能是因为他们的文档太混乱了,没有涵盖所有功能。而且我还在StackOverflow和其他论坛上搜索了解决方案,但没有任何效果。
答案 0 :(得分:0)
如果不让它们通过NAT网关,就无法将Lambda函数的IP地址列入白名单。为此,需要将AWS上的每个IP地址都列入白名单,这不仅是IP的极度难以管理的列表,而且由于它会将拥有AWS账户的任何人列入白名单,因此也完全不安全。
问题在于您当前拥有的"NotIpAddress"
规则将始终适用,因此它将始终拒绝您的Lambda函数。我认为解决此问题的方法是在SourceIP
规则中添加NotPrincipal子句,这样它就不适用于Lambda函数调用。类似于以下内容:
{
"Sid": "SourceIP",
"Effect": "Deny",
"NotPrincipal": {"AWS": [
"arn:aws:iam::6XXXXXX:role/app-backend-dev-lambdaFunctionRole-1XXXX"
]},
"Action": "s3:*",
"Resource": "arn:aws:s3:::files-dev/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"81.111.111.111/24"
]
}
}
},
答案 1 :(得分:0)
这在很大程度上受到 Mark B 回答的启发,但已修复为包含 assumed role principal。
请注意,假定的角色是 sts
而不是 iam
!
{
"Sid": "SourceIP",
"Effect": "Deny",
"NotPrincipal": {"AWS": [
"arn:aws:iam::6XXXXXX:role/app-backend-dev-lambdaFunctionRole-1XXXX",
"arn:aws:sts::6XXXXXX:assumed-role/app-backend-dev-lambdaFunctionRole-1XXXX/lambda-name"
]},
"Action": "s3:*",
"Resource": "arn:aws:s3:::files-dev/*",
"Condition": {
"NotIpAddress": {
"aws:SourceIp": [
"81.111.111.111/24"
]
}
}
},