Мне нужно создать действительно простую политику IAM и назначить ее определенной очереди. Мне нужно предоставить доступ (должен быть полный доступ) к очереди только определенному пользователю IAM.
Потому что на данный момент по умолчанию все пользователи IAM с политикой AmazonSQSFullAccess/АдминистраторДоступ может отправлять / читать сообщение в / из очереди.
Я пробовал следующие правила, но безуспешно
Политика 1
{
"Version": "2012-10-17",
"Id": "arn:aws:sqs:us-east-1:930XXXXXX332:task-queue/SQSDefaultPolicy",
"Statement": [
{
"Sid": "Sid1487598389851",
"Effect": "Deny",
"Principal": "*",
"Action": "SQS:*",
"Resource": "arn:aws:sqs:us-east-1:930XXXXXX332:task-queue",
"Condition": {
"ArnNotEquals": {
"aws:SourceArn": "arn:aws:iam::930XXXXXX332:user/test-sqs"
}
}
},
{
"Sid": "Sid1487599825058",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::930XXXXXX332:user/test-sqs"
},
"Action": "SQS:*",
"Resource": "arn:aws:sqs:us-east-1:930XXXXXX332:task-queue"
}
]
}
Политика 2 (то же, что и выше, но я пробовал другое условие)
"Condition": {
"NotPrincipal": {
"AWS": "arn:aws:iam::930XXXXXX332:user/test-sqs"
}
}
Другими словами - мне нужно получить что-то вроде следующего
Allow: user1, user2
Deny: *
Это вообще возможно?
На данный момент я должен явно указать каждого пользователя в рамках эффекта запрета. А это крайне неудобно
Наконец я нашел обходной путь. С приведенной ниже политикой он работает должным образом.
{
"Version": "2012-10-17",
"Id": "arn:aws:sqs:us-east-1:930XXXXXX332:test-queue",
"Statement": [
{
"Sid": "Sid1472529596416",
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::930XXXXXX332:user/test-sqs",
"arn:aws:iam::930XXXXXX332:root"
]
},
"Action": "SQS:*",
"Resource": "arn:aws:sqs:us-east-1:930XXXXXX332:test-queue"
}
]
}
Важнейшая часть - вы должны явно указать учетную запись root. Без него - вообще не сработало бы. Как по мне, это некая магия AWS :) Но, может быть, кто-то сможет пролить свет на ситуацию.
Обновление 01.03.2017 Кажется, я нашел описание такого поведения - http://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements.html#NotPrincipal
В следующем примере всем участникам, кроме пользователя по имени Боб в учетной записи AWS 444455556666, явным образом запрещен доступ к ресурсу. Обратите внимание, что для достижения желаемого эффекта элемент NotPrincipal содержит ARN пользователя Боба и учетную запись AWS, которой принадлежит Боб (arn: aws: iam :: 444455556666: root). Если бы элемент NotPrincipal содержал только ARN Боба, результатом политики было бы явное запрещение доступа к учетной записи AWS, содержащей пользователя Bob.
Пользователь не может иметь больше разрешений, чем его родительская учетная запись, поэтому, если учетной записи Боба явно запрещен доступ, Боб также не сможет получить доступ к ресурсу.
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::444455556666:user/Bob",
"arn:aws:iam::444455556666:root"
]
}
Объединение Deny и NotPrincipal - единственный раз, когда порядок, в котором AWS оценивает принципалов, имеет значение.
Первая часть исходного кода завершается ошибкой, потому что условие снова проверяется ресурсом Arn, поэтому вы, по сути, запрещаете доступ ко всем очередям. Вторая часть должна работать, но явный отказ в доступе всегда имеет приоритет.
«Политика 2» неверна, поскольку вы снова предоставляете доступ всем, кроме пользователя, которому вы должны предоставить доступ. Но глобальное отрицание, которое вы использовали выше, по-прежнему имеет приоритет, поэтому никакого эффекта.
Я думаю, ваша проблема кроется в самой основе ваших текущих настроек IAM - вам никогда не следовало предоставлять такой широкий доступ к своим системам всем пользователям. IAM работает по принципу «разрешите то, что вам строго нужно», что лучше всего для безопасности. Вместо этого вы связали себя принципом «отрицать все, кроме того, что вам нужно», что вряд ли можно поддерживать в IAM из-за того, что утверждения «отрицать» всегда побеждают.
На данный момент обходной путь заключается в том, что вы сделали: примените политику запрета к группе и примените эту группу ко всем пользователям, которые не должны иметь доступа. Но по мере того, как может быть создано больше очередей, вы попадете в бесконечный цикл политик запрета, где вам нужно будет явно установить имена всех ваших очередей в политиках запрета. И все же - будет ли это безопасно или имеет смысл? Вы сказали, что дали многим пользователям роль администратора - если они могут изменять свои политики IAM, они могут делать все - cloudtrail может рассказать вам, что произошло, но не вернет ваши данные.
Я бы серьезно посоветовал вам вместо этого использовать другой подход и определить гораздо более ограниченные политики для ваших пользователей. При необходимости создайте дополнительные политики и сделайте их накопительными, прикрепите их к группам, а от групп к пользователям. Воспользуйтесь подстановочным знаком в значениях arn, чтобы в конечном итоге создать «зарезервированные» пространства имен для ваших ресурсов с более ограниченным доступом.