Como a lógica de avaliação do IAM funciona usando uma política de negação explícita com várias chaves de condição?

3 minuto de leitura
0

Quero criar uma política Deny explícita do AWS Identity and Access Management (IAM). Essa política Deny deve restringir a criação de instâncias do Amazon Elastic Compute Cloud (Amazon EC2) e volumes do Amazon Elastic Block Store (Amazon EBS).

Breve descrição

Use tags de política do IAM para restringir o lançamento de instâncias do EC2 e volumes do EBS que tenham operadores de condição de string Allow com StringLike ou Deny com StringNotLike.

Para obter mais informações, consulte Como posso usar as tags de política do IAM para restringir a forma como uma instância do EC2 ou um volume do EBS podem ser criados?

Resolução

Para restringir a criação de instâncias do EC2 e volumes do EBS, use o exemplo a seguir de política do IAM que usa Deny com StringNotLike.

Observação: é uma prática recomendada usar Deny com StringNotLike para evitar um acesso privilegiado acidental.

Se sua política tiver vários operadores de condição ou várias chaves anexadas a um único operador de condição, as condições serão avaliadas usando a lógica AND. Com múltiplos valores de tag Deny, cada chave RequestTag deve ser usada em instruções separadas para obter a mesma lógica AND.

Observação: todos os valores da chave RequestTag definidos em uma condição com uma política Deny podem não funcionar conforme o esperado. Isso ocorre porque a ação é permitida até que todas as condições sejam atendidas. Quando todas as condições são atendidas, a ação é negada.

As seguintes tags são obrigatórias:

  • A tag cost_center deve ter um valor não nulo.
  • A instância do EC2 tem uma chave de tag chamada Production.
  • A tag identifier deve ser uma combinação de cinco caracteres.
  • O valor da tag env deve ser sandbox, dev ou prod.

Exemplo de política:

{    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowToDescribeAll",
            "Effect": "Allow",
            "Action": [
                "ec2:Describe*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "AllowRunInstances",
            "Effect": "Allow",
            "Action": "ec2:RunInstances",
            "Resource": [
                "arn:aws:ec2:*::image/*",
                "arn:aws:ec2:*::snapshot/*",
                "arn:aws:ec2:*:*:subnet/*",
                "arn:aws:ec2:*:*:network-interface/*",
                "arn:aws:ec2:*:*:security-group/*",
                "arn:aws:ec2:*:*:key-pair/*"
            ]
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions1",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/cost_center": "?*"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions2",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "ForAllValues:StringNotLike": {
                    "aws:TagKeys": "Production"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions3",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/identifier": "?????"
                }
            }
        },
        {
            "Sid": "AllowRunInstancesWithRestrictions4",
            "Effect": "Deny",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ],
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/env": [
                        "sandbox",
                        "dev",
                        "prod"
                    ]
                }
            }
        },
        {
            "Sid": "AllowRunInstances1",
            "Effect": "Allow",
            "Action": [
                "ec2:CreateVolume",
                "ec2:RunInstances"
            ],
            "Resource": [
                "arn:aws:ec2:*:*:volume/*",
                "arn:aws:ec2:*:*:instance/*"
            ]
        },
        {
            "Sid": "AllowCreateTagsOnRunInstance",
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "ec2:CreateAction": "RunInstances"
                }
            }
        }
    ]
}

Observe os seguintes valores de aplicação:

  • O valor aws:TagKeys reforça a diferenciação entre maiúsculas e minúsculas de Production.
  • O valor ????? impõe o uso de uma combinação de quaisquer cinco valores. Espaços antes ou depois são ignorados.
  • O va;pr ?* impõe o uso de pelo menos um caractere no campo de valor para que as instâncias do EC2 não possam ser iniciadas com valores de tag vazios.

Informações relacionadas

Como crio uma política do IAM para controlar o acesso aos recursos do Amazon EC2 usando tags?

Marcar seus recursos do Amazon EC2

Controlar o acesso aos recursos da AWS usando políticas

AWS OFICIAL
AWS OFICIALAtualizada há um ano