
Estou tentando criar uma política de bucket que conceda acesso de uma instância ec2 ou ecs para concedê-los a putObject em um bucket específico.
Tenho algumas perguntas básicas:
1) Uma política de bucket é a coisa certa a ser usada se tudo o que você deseja fazer é conceder acesso do ec2 a um bucket na mesma conta? Os documentos parecem referir-se muito ao acesso entre contas.
2) Qual deve ser o princípio para conseguir isso? Por exemplo, existe um princípio que eu possa definir que diria simplesmente "conceder acesso de qualquer recurso nesta conta aws"?
3) Fiz isso funcionar especificando a função IAM da instância ec2 no princípio (veja abaixo). Mas será esta a forma preferida de o fazer?
{
"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/*"
}
]
}
Agradeço antecipadamente! Acho difícil entender isso.
Responder1
Sua intuição estava certa. Se tudo o que você deseja fazer é conceder acesso a um bucket na mesma conta, provavelmente será mais simples apenasusar uma política IAM. Você anexaria tal política a umpapel, que por sua vez será anexado à instância EC2.
Uma coisa a observar é que, considerando a política do primeiro link:
{
"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/*"]
}
]
}
A primeira instrução, "ListObjectsInBucket" tem o recurso definido para o bucket. O ARN está arn:aws:s3:::bucket-name
(não *
existe). A segunda instrução tem o arn definido como arn:aws:s3:::bucket-name/*
. O /*
lá significa "todos os objetos no bucket bucket-name". Algumas ações do IAM se aplicam a buckets, outras a objetos.
Você também pode usar um prefixo, como arn:aws:s3:::bucket-name/prefix*
, que dará acesso a todos os objetos que possuem um nome começando com "prefixo". Tenha em mente que o nome de um objeto no S3 é o nome completo, incluindo marcadores de caminho ("/"), portanto "/caminho/para/objeto", não apenas "objeto". Não há diretórios no S3.
Outra coisa é que quando você atribui uma função a uma instância do EC2, você concede a qualquer pessoa que tenha acesso à instância as mesmas permissões que a função possui. Portanto, certifique-se de que qualquer usuário que possa fazer login na instância EC2 também tenha acesso ao bucket S3.
Tenha em mente que o nível de acesso que um objeto (usuário, instância ec2, função lambda, etc.) tem ao bucket é dado pelo conjunto de políticas resultante da combinação das políticas do IAM e das políticas do bucket. E as declarações Deny têm precedência. Você só precisa usar um deles quando o objeto e o bucket estiverem na mesma conta e as políticas do IAM forem provavelmente a escolha natural. No bucket de acesso entre contas, as políticas são usadas para dar acesso à outra conta do bucket, basicamente. Uma política IAM também é definida na outra conta.