我正在尝试创建一个存储桶策略,该策略将授予来自 ec2 或 ecs 实例的访问权限,以便授予它们将对象放在特定存储桶上的权限。
我有几个基本问题:
1) 如果您只想授予从 ec2 到同一帐户内存储桶的访问权限,那么存储桶策略是否正确? 文档似乎多次提到跨帐户访问。
2) 为了实现这一目标,应该遵循什么原则?例如,我可以设置一个原则,简单地说“授予此 aws 帐户中任何资源的访问权限”吗?
3) 我通过在原则中指定 ec2 实例的 IAM 角色来实现这一点(见下文)。但这是首选方法吗?
{
"Version": "2012-10-17",
"Id": "Policy1563569774763",
"Statement": [
{
"Sid": "Stmt1563569772515",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::XXXX:role/S3_Read_All"
]
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::some-test-bucket-12345/*"
}
]
}
提前谢谢您!我很难理解这一点。
答案1
你的直觉是对的。如果你只想授予对同一账户中存储桶的访问权限,那么可能更简单的是使用 IAM 策略。您可以将此类政策附加到角色,然后它会附加到 EC2 实例。
需要注意的一点是,考虑第一个链接中的政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListObjectsInBucket",
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::bucket-name"]
},
{
"Sid": "AllObjectActions",
"Effect": "Allow",
"Action": "s3:*Object",
"Resource": ["arn:aws:s3:::bucket-name/*"]
}
]
}
第一条语句“ListObjectsInBucket”将资源设置为存储桶。ARN 为arn:aws:s3:::bucket-name
(没有*
there)。第二条语句将 arn 设置为arn:aws:s3:::bucket-name/*
。there/*
表示“存储桶 bucket-name 中的所有对象”。一些 IAM 操作适用于存储桶,其他操作适用于对象。
您还可以使用前缀,例如arn:aws:s3:::bucket-name/prefix*
,这将允许访问名称以“前缀”开头的所有对象。请记住,S3 中对象的名称是全名,包括路径标记(“/”),因此是“/path/to/object”,而不仅仅是“object”。S3 中没有目录。
另一件事是,当您将角色附加到 EC2 实例时,您会为有权访问该实例的任何人提供与该角色相同的权限。因此,请确保任何可以登录 EC2 实例的用户也应该有权访问 S3 存储桶。
请记住,对象(用户、ec2 实例、lambda 函数等)对存储桶的访问级别由结合 IAM 策略和存储桶策略而产生的策略集决定。并且拒绝语句具有优先权。当对象和存储桶都在同一个帐户中时,您只需使用其中之一,并且 IAM 策略可能是自然选择。在跨帐户访问中,存储桶策略基本上用于授予其他帐户对存储桶的访问权限。另一个帐户中也设置了 IAM 策略。