AWS S3 запрещает любой доступ, кроме 1 политики пользователя
Я настроил ведро в AWS S3. Я предоставил доступ к корзине для своего пользователя IAM с помощью политики ALLOW (с помощью редактора политик корзины). Я был в состоянии сохранить файлы в ведро с пользователем. Я работал с корзиной для медиаобслуживания и раньше, так что, похоже, по умолчанию действие - дать публичное разрешение на просмотр файлов (изображений), что хорошо для большинства веб-сайтов.
В моем новом проекте я хочу иметь доступ к корзине S3 с пользователем IAM, но хочу запретить любой другой доступ. Нет открытого доступа для чтения, нет доступа вообще, кроме пользователя IAM, который должен иметь полный доступ для сохранения / удаления чего бы то ни было.
То, что я должен сделать, я читал здесь. Он говорит, чтобы создать Deny
политика с использованием NotPrincipal
атрибут, и таким образом он все еще будет позволять этому пользователю, но запретить всем остальным. Для хорошей меры я также добавил Allow
политика только для пользователя, которого я хочу:
{
"Version": "2012-10-17",
"Id": "Policy**********",
"Statement": [
{
"Sid": "Stmt**********",
"Effect": "Deny",
"NotPrincipal": {
"AWS": "arn:aws:iam::*********:user/my_user"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::my_bucket/*"
},
{
"Sid": "Stmt*************",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::**********:user/my_user"
},
"Action": "s3:*",
"Resource": "arn:aws:s3:::my_bucket/*"
}
]
}
Но это лишает доступа всех, даже my_user
, Снова я могу подтвердить, что у меня был доступ, когда я только использовал Allow
часть политики выше, но затем публика также имеет доступ для чтения, который я пытаюсь отключить.
Как я могу настроить свою политику сегментов памяти, чтобы предоставить полный доступ только уникальному пользователю IAM и запретить любой доступ любому другому пользователю?
Благодарю.
3 ответа
Все довольно просто:
- По умолчанию корзины не имеют публичного доступа
- НЕ добавляйте Bucket Policy, так как вы не хотите предоставлять публичный доступ
- Вместо этого добавьте политику для пользователя IAM, предоставляя ему доступ
Главное понять, что пользователь IAM не может получить доступ к контенту через неаутентифицированные URL-адреса (например, s3.amazonaws.com/bucket/file.jpg
) потому что S3 не знает, кто они. Когда пользователь IAM получает доступ к контенту, ему необходимо использовать аутентифицированный доступ, чтобы S3 знал, кто он такой, например:
- Доступ через Консоль управления AWS с использованием имени пользователя и пароля
- Доступ через интерфейс командной строки AWS (CLI) с использованием ключа доступа + секретного ключа
Политика для пользователя IAM будет выглядеть примерно так:
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my_bucket",
"arn:aws:s3:::my_bucket/*"
]
}
Получить идентификатор вызывающего абонента пользователя
aws sts get-caller-identity
Теперь изменитеPrincipalArn
в Политическом документе ниже, чтобы сделать исключение.
Замените здесь пользователя/группу/пользователя SSO Arn. Вы также можете сопоставить шаблон, как в примере ниже.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:DeleteObject",
"Resource": [
"arn:aws:s3:::s3-test-bucket",
"arn:aws:s3:::s3-test-bucket/*"
],
"Condition": {
"StringNotEquals": {
"aws:PrincipalArn": ["arn:aws:iam::<account-id>:role/aws-reserved/sso.amazonaws.com/AWSReservedSSO_test_abcdef","**devops**"],
"aws:PrincipalServiceName": "cloudtrail.amazonaws.com"
}
}
}
]
}
Вышеприведенное заявление означает запрет на удаление доступа для всех, кроме пользователя единого входа, всего/любого, у кого есть DevOps и AWS CloudTrail.
Прочтите эту документацию о том, как применяются несколько условий в aws.
Прочтите эту документацию, чтобы узнать о типах условных ключей, которые можно использовать в aws.
Предупреждение и меры предосторожности. Если вы тестируете, попробуйте использовать что-то вроде «Action»: «s3:DeleteObject» вместо «*». Если вы допустите ошибку при установке политики, все могут потерять доступ к корзине. Только пользователь root организации сможет разблокировать корзину.
Если я правильно понял, разрешить доступ к букету только 1 пользователю IAM. Мы можем использовать политику ведра. Я нашел это в документации netApp.
{
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::95390887230002558202:federated-user/Bob"
},
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::examplebucket",
"arn:aws:s3:::examplebucket/*"
]
},
{
"Effect": "Deny",
"NotPrincipal": {
"AWS": "arn:aws:iam::95390887230002558202:federated-user/Bob"
},
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::examplebucket",
"arn:aws:s3:::examplebucket/*"
]
}
]
}