如何只允许一个服务角色将对象放入 Amazon S3 存储桶
How to only allow one Service Role to PutObjects to an Amazon S3 bucket
我在 AWS 帐户上有一个 Amazon S3 存储桶“my-bucket”。现在帐户上的每个人都可以下载对象并将其放入“我的桶”。但是,我希望每个人都能够从桶中 download/delete 对象,并且只有一个服务角色 (lambda) 能够放入对象到存储桶。
lambda 角色已经可以访问存储桶的 PutObjects,所以我想我想制定一个存储桶策略,只允许我的 lambda 角色访问 PutObjects,但仍然允许其他人访问 download/delete 上的对象桶。但是,我不确定该桶政策会是什么样子。我想我必须使用条件?比如?
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"MyRule",
"Effect": "Deny",
"Action":["s3:PutObject"],
"Resource": ["arn:aws:s3:::my-bucket/*", "arn:aws:s3:::my-bucket*"],
"Condition":{"NOT EQUAL TO LAMBDA ROLE???"}
}
]
}
桶策略是基于资源的策略,因此原则可用于限制对特定身份的访问
大家可以准备如下的政策让大家下载删除object
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"PublicReadDelete",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject","s3:DeleteObject"],
"Resource":["arn:aws-cn:s3:::/*"]
}
]
}
低于 lambda 放置对象的策略
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"LambdaUpload",
"Effect":"Allow",
"Principal": "<your lambda function ARN>",
"Action":["s3:PutObject"],
"Resource":["arn:aws-cn:s3:::/*"]
}
]
}
您可以在同一政策中合并这两个声明。您只需要替换您的 lambda 函数 ARN 和 S3 存储桶 ARN 或名称
您可以通过两种方式实现:
- 通过使用 Principal,您将在其中明确列出您的 Lambda 角色 arn
- 通过使用带有条件的拒绝语句(您建议的方法)。
使用选项 1,您将得到如下内容:
"Sid": "AllowPutForLambda",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::01234567890:role/my-lambda-role"
]
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
使用选项 2,它将如下所示:
{
"Sid": "DenyAllExceptMyPreciousLambda",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket"
],
"Condition": {
"StringNotLike": {
"aws:userid": [
"AROAID1GMAMBDAROLEID:*",
]
}
}
其中 "AROAID1GMAMBDAROLEID"
字符串是调用实体的 unique identifier(在本例中是 Lambda IAM 角色的 IAM UserId)。
您可以使用 get-role aws-cli 命令获取您的 lambda 角色的唯一 ID:
aws iam get-role --role-name MyLambdaRoleName
我在 AWS 帐户上有一个 Amazon S3 存储桶“my-bucket”。现在帐户上的每个人都可以下载对象并将其放入“我的桶”。但是,我希望每个人都能够从桶中 download/delete 对象,并且只有一个服务角色 (lambda) 能够放入对象到存储桶。
lambda 角色已经可以访问存储桶的 PutObjects,所以我想我想制定一个存储桶策略,只允许我的 lambda 角色访问 PutObjects,但仍然允许其他人访问 download/delete 上的对象桶。但是,我不确定该桶政策会是什么样子。我想我必须使用条件?比如?
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"MyRule",
"Effect": "Deny",
"Action":["s3:PutObject"],
"Resource": ["arn:aws:s3:::my-bucket/*", "arn:aws:s3:::my-bucket*"],
"Condition":{"NOT EQUAL TO LAMBDA ROLE???"}
}
]
}
桶策略是基于资源的策略,因此原则可用于限制对特定身份的访问 大家可以准备如下的政策让大家下载删除object
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"PublicReadDelete",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject","s3:DeleteObject"],
"Resource":["arn:aws-cn:s3:::/*"]
}
]
}
低于 lambda 放置对象的策略
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"LambdaUpload",
"Effect":"Allow",
"Principal": "<your lambda function ARN>",
"Action":["s3:PutObject"],
"Resource":["arn:aws-cn:s3:::/*"]
}
]
}
您可以在同一政策中合并这两个声明。您只需要替换您的 lambda 函数 ARN 和 S3 存储桶 ARN 或名称
您可以通过两种方式实现:
- 通过使用 Principal,您将在其中明确列出您的 Lambda 角色 arn
- 通过使用带有条件的拒绝语句(您建议的方法)。
使用选项 1,您将得到如下内容:
"Sid": "AllowPutForLambda",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::01234567890:role/my-lambda-role"
]
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
使用选项 2,它将如下所示:
{
"Sid": "DenyAllExceptMyPreciousLambda",
"Effect": "Deny",
"Principal": "*",
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::my-bucket/*",
"arn:aws:s3:::my-bucket"
],
"Condition": {
"StringNotLike": {
"aws:userid": [
"AROAID1GMAMBDAROLEID:*",
]
}
}
其中 "AROAID1GMAMBDAROLEID"
字符串是调用实体的 unique identifier(在本例中是 Lambda IAM 角色的 IAM UserId)。
您可以使用 get-role aws-cli 命令获取您的 lambda 角色的唯一 ID:
aws iam get-role --role-name MyLambdaRoleName