#amazon-web-services #amazon-s3 #amazon-iam
#amazon-web-services #amazon-s3 #amazon-iam
Вопрос:
Я хочу создать политику корзины s3, чтобы только учетная запись Root могла иметь полный доступ, как я могу это сделать?
Пример:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow full access for root account user",
"Effect": "Allow",
"Principal": {
"AWS": "root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::ih-deploy-bucket/*",
"arn:aws:s3:::ih-deploy-bucket"
]
}
]
}
Или добавление условия, подобного
"Condition": {
"StringEquals" : {"aws:username" : "rootUser"}
}
Ответ №1:
Это один из очень немногих (если не единственный) вариантов использования для явного Deny
с NotPrincipal
:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"NotPrincipal": {
"AWS": "arn:aws:iam::<your-account-number>:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::ih-deploy-bucket/*",
"arn:aws:s3:::ih-deploy-bucket"
]
}
]
}
Это явно запретит всем участникам, которые не являются (и не только) пользователем корневой учетной записи, включая пользователей IAM, предполагаемые ролевые сеансы и федеративных пользователей в этой учетной записи.
И поскольку пользователь root всегда имеет явные разрешения на все действия со всеми ресурсами, фактическое разрешение предоставляется разрешениями пользователя root на основе идентификационных данных, поэтому пользователь root будет иметь доступ к этой корзине.
Причина, по которой это работает, заключается в том, что идентификатор вызывающего абонента, работающий в вашей учетной записи, всегда имеет несколько участников одновременно, которые оцениваются IAM для утверждения политики:
- участник учетной записи
arn:aws:iam::<your-account-number>:root
- пользователь, предполагаемая роль или участник федеративного пользователя
В случае явного Allow
if вы использовали только участника корневой учетной записи в Principal
правиле в заявлении политики, тогда любой пользователь в этой учетной записи будет соответствовать разрешению и получит доступ, поскольку участник учетной записи всегда является частью списка участников пользователя в этой учетной записи.
Однако в случае a Deny
с a NotPrincipal
все немного по-другому. Здесь в списке NotPrincipal
s должны быть указаны все участники идентификатора вызывающего абонента, чтобы им не было отказано.
Этот факт несколько просвечивает в документации AWS о NotPrincipal
: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html
При использовании NotPrincipal с Deny необходимо также указать ARN учетной записи участника, которому не отказано. В противном случае политика может запретить доступ ко всей учетной записи, содержащей участника. В зависимости от службы, которую вы включаете в свою политику, AWS может сначала проверить учетную запись, а затем пользователя. Если оценивается пользователь с предполагаемой ролью (тот, кто использует роль), AWS может сначала проверить учетную запись, затем роль, а затем пользователя с предполагаемой ролью.
Комментарии:
1. «убедитесь, что идентификатор учетной записи в этом заявлении указан правильно, так как в противном случае вы потеряете полный доступ к этой корзине, в том числе с вашим пользователем учетной записи root!» это неверно, поскольку root всегда имеет разрешение на установку политики корзины
Ответ №2:
"AWS": "root"
следует изменить на
"AWS": "arn:aws:iam::<your-account-number>:root"
Комментарии:
1. Я пробовал это, это не корневая учетная запись в соответствии с этой страницей AWS -> При указании учетной записи AWS вы можете использовать ARN учетной записи (arn: aws: iam :: AWS-account-ID: root) или сокращенную форму, состоящую из префикса AWS:, за которым следуетидентификатор учетной записи. docs.aws.amazon.com/IAM/latest/UserGuide /…
2. Это предоставляется всем пользователям в учетной записи.
3. @LeonardoCampanha Нет, это неправда. Он НЕ предоставит доступ всем пользователям IAM.
Ответ №3:
Как сказал httpdigest в этом ответе, пользователь root всегда имеет явные разрешения для всех действий со всеми ресурсами.
Итак, что я заблокировал все разрешения для всех других пользователей, которые не находятся в состоянии. И пользователь root всегда имеет доступ.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Block all user not in condition, but the root has permission",
"Effect": "Deny",
"Principal": {
"AWS": "*"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::bucket/*",
"arn:aws:s3:::bucket"
],
"Condition": {
"NotIpAddress": {
"aws:SourceIp": "175.222.100.192"
},
"StringNotEquals": {
"aws:username": "user1"
}
}
}
]
}
Комментарии:
1. Вопрос заключался в том, как предоставить root, но у root всегда есть разрешение, я этого не знал. Вместо этого я использовал другой подход, чтобы предоставить разрешение, специфичное для root, потому что root всегда имеет разрешение, в котором я отказал всем остальным.. Условие — это только пример, который я использовал, чтобы указать, кто также может получить доступ вместо пользователя root.