在我的AWS项目中,我有一个lambda函数,由API Gateway中的API调用,该函数在S3存储桶中获取文件。
我尝试尽可能地保护我的S3存储桶,并在阅读this和this之后,这是我在CloudFormation模板中所做的事情:
- Effect: 'Allow'
Action:
- "s3:GetObject"
Resource: 'arn:aws:s3:::exampleS3Bucket/*'
- Effect: "Deny"
Action:
- "s3:*"
Principal: "*"
Resource:
- 'arn:aws:s3:::exampleS3Bucket'
- 'arn:aws:s3:::exampleS3Bucket/*'
Condition:
StringNotLike:
aws:userId:
- "<API_IAM_ROLE_ID>"
根据文档,您可以通过调用以下AWS CLI命令API_IAM_ROLE_ID
来检索aws iam get-role --role-name <YOUR_IAM_ROLE>
。
但是我面临两个问题:
Access Denied
错误编辑
我还尝试了以下S3存储桶策略:
- Effect: "Deny"
Action:
- "s3:*"
NotPrincipal:
AWS:
- "arn:aws:iam::123456789012:root"
- "arn:aws:iam::123456789012:role/my-api-role"
Resource:
- 'arn:aws:s3:::exampleS3Bucket'
- 'arn:aws:s3:::exampleS3Bucket/*'
但是当我调用我的API时,即调用了调用S3.GetObject()的lambda时,我仍然遇到“访问被拒绝”异常。
我该如何解决?
谢谢。
答案 0 :(得分:1)
拒绝访问特定存储桶可能很棘手。
例如,管理员可能具有修改角色和存储桶策略的能力,因此他们将能够重新获得对存储桶的访问。
一种常见的做法是将敏感信息放入另一个AWS账户中的存储桶中,然后仅向“主”账户中的特定用户提供对存储桶的访问权限。这样,默认设置是主帐户中没有人可以访问。由于不需要应用Deny
策略,因此也简化了权限设计。
一个例子是存储敏感的HR信息,只有少数用户可以访问该数据。
答案 1 :(得分:0)
这是我最近的做法。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::MyExampleBucket",
"arn:aws:s3:::MyExampleBucket/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AROAEXAMPLEID:*",
"ACCOUNT NUMBER"
]
}
}
}
]
}
这是它的工作方式。
获取角色的用户ID:
aws iam get-role --role-name ROLE-NAME