Come funziona la logica di valutazione IAM per una policy di negazione esplicita con più chiavi di condizione?

3 minuti di lettura
0

Desidero creare una policy di AWS Identity and Access Management (IAM) per la negazione esplicita. Questa policy di negazione deve limitare la creazione di istanze Amazon Elastic Compute Cloud (Amazon EC2) e di volumi Amazon Elastic Block Store (Amazon EBS).

Breve descrizione

Utilizza i tag delle policy IAM per limitare l'avvio di istanze EC2 e volumi EBS che hanno Consenti con StringLike o Nega con StringNotLike come operatori di condizioni.

Per ulteriori informazioni, consulta Come posso utilizzare i tag dei criteri IAM per limitare le modalità di creazione di un'istanza EC2 o di un volume EBS?

Soluzione

Utilizza il seguente esempio di policy IAM che utilizza Nega con StringNotLike per limitare la creazione di istanze EC2 e volumi EBS.

Nota: È consigliabile utilizzare Nega con StringNotLike per impedire accessi alle autorizzazioni accidentali.

Se la tua policy ha più operatori di condizioni o più chiavi collegati a un singolo operatore di condizioni, le condizioni vengono valutate con la logica AND. Con Nega valori di tag multipli, ogni chiave RequestTag deve utilizzare istruzioni separate per ottenere la stessa logica AND.

Nota: Tutti i valori chiave RequestTag impostati in un'unica condizione con una policy Nega potrebbero non funzionare come previsto. Questo perché l'azione è consentita fino al soddisfacimento di tutte le condizioni. Dopo che tutte le condizioni sono soddisfatte, l'azione viene negata.

Sono necessari i seguenti tag:

  • Il tag cost_center deve avere un valore diverso da nullo.
  • L'istanza EC2 ha una chiave di tag denominata Produzione.
  • Il tag identificativo deve essere una combinazione di cinque caratteri qualsiasi.
  • Il valore del tag env deve essere sandbox, dev o prod.

Policy di esempio:

{    "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"
                }
            }
        }
    ]
}

Nota i seguenti valori di applicazione:

  • Il valore aws:TagKeys impone la distinzione tra maiuscole e minuscole di Produzione.
  • Il valore ????? impone l'uso di una combinazione di cinque valori qualsiasi. Gli spazi iniziali o finali vengono ignorati.
  • Il valore ?* impone l'utilizzo di almeno un carattere nel campo del valore in modo che le istanze EC2 non possano essere avviate con valori di tag vuoti.

Informazioni correlate

Come posso creare una policy IAM per controllare l'accesso alle risorse di Amazon EC2 utilizzando i tag?

Tagging delle risorse Amazon EC2

Controllo dell'accesso alle risorse AWS tramite tag