【发布时间】:2018-06-22 12:01:10
【问题描述】:
我想做什么
拥有我拥有的特定存储桶的 Lambda 函数访问权限(具有读取和写入权限)。
虽然只有一个 Bucket,它不需要访问其他任何东西。
我做了什么
- 我设置了一个公共 Bucket(实际上是对的,我实际上希望任何人都可以访问它的内容),命名为
orca-resources - 我创建了一个名为
lamba-s3-orca-resources的 IAM 角色。它设置为供 Lambda 服务使用。 - 我创建了一个最终将由 API Gateway 触发的 Lambda 函数
- 我编写了尽可能少的代码来尝试破坏我的策略:我正在访问我的 另一个存储桶,我的
lamba-s3-orca-resourcesIAM 角色未明确允许访问该存储桶李>
测试函数实际上会产生我希望不可用的 Bucket 的内容。此外,s3:listObjects 甚至不在我的 Allowed 操作中。
我忽略了什么?
Lambda 函数
它的代码:
'use strict';
const aws = require('aws-sdk');
const s3 = new aws.S3();
exports.handler = (event, context, callback) => {
s3.listObjects({Bucket: 'orca-exe'}, callback);
};
它的执行角色:
{
"roleName": "lamba-s3-orca-resources",
"policies": [
{
"document": {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:GetObjectTagging",
"s3:ListBucket",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::orca-resources/*",
"arn:aws:s3:::orca-resources"
]
}
]
},
"name": "orca-resources-only",
"type": "inline"
}
]
}
【问题讨论】:
-
我们看不到你的回调函数做了什么,但大概你 100% 确定它正在列出对象。仔细检查为 Lambda 函数配置的角色,然后仔细检查与该角色关联的策略列表。 PS 你应该授予你的 Lambda 函数对 CloudWatch Logs (logs:*) 的权限,否则它将无法写入日志。
-
执行角色中的
Allow效果不会将您在函数中可以做的事情限制为仅限于那些事情。Allow是附加的,不是排他的。如果存储桶策略或存储桶 ACL 允许某个操作,则 Lambda 函数可以执行此操作,而无需执行角色策略中的特定引用。 -
还要注意没有
s3:ListObjects这样的操作。文档中提到了它,但这是未来的功能或文档错误。s3:ListBucket是允许在存储桶中列出对象的操作。 -
@Michael-sqlbot 不知何故,NodeJS 的 aws-sdk 只知道
s3.listObjects,那里没有listBucket。此外,here 文档似乎非常清楚地确实否认没有明确允许的内容。另外,Policy Simulator 确实给了我我期望的行为。 -
@Michael-sqlbot 实际上,我必须明确拒绝一切。
"Action": "*", "NotResource": [ "arn:aws:s3:::orca-resources/*", "arn:aws:s3:::orca-resources" ]。你是对的。我认为您必须通过 Role 的策略 THEN Bucket 的策略,但系统似乎比我想象的要宽松!
标签: amazon-web-services amazon-s3 aws-lambda