Политика AWS S3 Bucket
Я создал простую политику для доступа к определенному сегменту для аутентифицированного пользователя (ключ доступа / пароль). Ниже приводится политика
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::xxxxxxx/*"
]
}
]
}
Но пользователь не может получить к нему доступ. если я заменил Resource на "arn:aws:s3:::*", он будет работать, но покажет все сегменты присоединенному пользователю.
3 ответа
Попробуйте это вместо этого:
{
"Statement": [
{
"Action": "s3:*",
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::xxxxxxx",
"arn:aws:s3:::xxxxxxx/*"
]
}
]
}
Вам необходимо предоставить доступ к корзине (/*), а затем к самой корзине, которая является той частью, которую вам не хватает.
Как предположил Э.Дж.Бреннан, вы можете добавить саму корзину в список ресурсов, но это даст пользователю право на удаление самой корзины. Если вы просто хотите, чтобы они просматривали корзину и могли изменять объекты внутри нее, вы можете предоставить список доступа к корзине в дополнение к тому, что у вас есть:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::xxxxxxx"
]
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::xxxxxxx/*"
]
}
]
}
В Nodejs вы можете сделать это так:
const policy = {
Version: '2012-10-17',
Statement: [
{
Sid: 'PublicListGet',
Effect: 'Allow',
Principal: '*',
Action: ['s3:List*', 's3:Get*', 's3:Put*'],
Resource: [`arn:aws:s3:::${bucketName}`, `arn:aws:s3:::${bucketName}/*`]
}
]
};
const bucketPolicyParams = {
Bucket: bucketName,
Policy: JSON.stringify(policy)
};
await s3.putBucketPolicy(bucketPolicyParams).promise();