Создание политики AWS IAM, которая ограничивает запуск экземпляров определенными группами безопасности.

Я пытаюсь написать политику IAM, которая позволяет пользователям AWS запускать экземпляр, только если группа безопасности относится к одному из двух типов. Поскольку нет ключа условия группы безопасности, я решил использовать операторы условия, так что экземпляр EC2 не может быть запущен / запущен , если группа безопасности не относится к одной из двух категорий. В приведенной ниже политике я ссылаюсь на эти утвержденные группы безопасности с помощью их тегов.

Проблема, с которой я столкнулся, заключается в том, что когда у меня есть группа безопасности, которая соответствует первому условию, экземпляр может быть запущен. Однако, когда я использую группу безопасности, равную «UCSFInbound» (второе условие), экземпляр не запускается (даже если должен).

У меня действительно есть отдельная политика, которая предоставляет более широкий доступ к ресурсам EC2, однако, насколько я понимаю, AWS сначала регистрирует «запрещающие» действия перед «разрешающими» действиями. И если это причина, по которой у меня возникла проблема, то ни один из двух случаев (групп безопасности) не должен работать.

Политика IAM:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Deny",
            "Action": [
                "ec2:StartInstances",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:key-pair/*",
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*::snapshot/*",
                "arn:aws:ec2:*:*:launch-template/*",
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:security-group/*",
                "arn:aws:ec2:*:*:placement-group/*",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*::image/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "ec2:ResourceTag/aws:cloudformation:stack-id": "NetworkResourcesStack"
                },
                "StringNotEquals": {
                    "ec2:ResourceTag/Name": "UCSFInbound"
                }
            }
        }
    ]
} 

person claudiadast    schedule 21.05.2018    source источник
comment
Эта страница всегда полезна для разрешений на уровне ресурсов EC2: Поддерживаемые разрешения на уровне ресурсов для действий API Amazon EC2 - Amazon Elastic Compute Cloud   -  person John Rotenstein    schedule 22.05.2018
comment
Обратите внимание, что, как написано, ваши условия объединены оператором AND, поэтому оба должны быть истинными, чтобы запрет вступил в силу. Если вы хотите, чтобы каждый сам по себе вызывал отказ, перепишите свою политику, включив в нее два оператора Deny для одних и тех же действий и ресурсов, каждое из которых имеет одно условие.   -  person jarmod    schedule 22.05.2018
comment
Если вы не можете достичь того, чего хотите проактивно с помощью политик IAM, вы можете рассмотреть возможность реактивного подхода с использованием журналов CloudTrail и Lambda (когда вы отвечаете на создаваемые ресурсы, проверяете их состояние и останавливаете или прекращаете их или предупредить кого-нибудь, если он не соответствует требованиям).   -  person jarmod    schedule 22.05.2018


Ответы (1)


В общем, вам следует избегать использования Deny политик, если они не отменяют другие политики.

Например, вы можете контролировать доступ к Amazon S3 следующим образом:

  1. Allow доступ всех сотрудников ко всем сегментам S3
  2. Deny доступ к корзине кадров, если вы не являетесь сотрудником отдела кадров.

При этом используется общая политика для Разрешить наибольший доступ, но затем используется Запретить для покрытия особого случая.

Таким образом, вы должны поместить arn:aws:ec2:region:account:security-group/security-group-id в начальную Allow политику, которая позволяет им использовать EC2.

person John Rotenstein    schedule 21.05.2018