Direkt zum Inhalt

Wie funktioniert die IAM-Evaluierungslogik für eine explizite Deny-Richtlinie mit mehreren Bedingungsschlüsseln?

Lesedauer: 3 Minute
0

Ich möchte eine explizite Deny-Richtlinie für AWS Identity and Access Management (IAM) erstellen. Diese Deny-Richtlinie muss die Erstellung von Amazon Elastic Compute Cloud (Amazon EC2)-Instances und Amazon Elastic Block Store (Amazon EBS)-Volumes einschränken.

Kurzbeschreibung

Verwende IAM-Richtlinien-Tags, um den Start von EC2-Instances und EBS-Volumes einzuschränken, die Allow mit StringLike oder Deny mit den Bedingungsoperatoren für Zeichenfolgen StringNotLike verwenden.

Weitere Informationen findest du unter Wie verwende ich IAM-Richtlinien-Tags, um einzuschränken, wie eine EC2-Instance oder ein EBS-Volume erstellt und darauf zugegriffen werden kann?

Lösung

Um die Erstellung von EC2-Instances und EBS-Volumes einzuschränken, verwende das folgende Beispiel für eine IAM-Richtlinie, die Deny mit StringNotLike verwendet.

Hinweis: Es ist eine bewährte Methode, Deny mit StringNotLike zu verwenden, um einen versehentlichen Berechtigungszugriff zu verhindern.

Wenn die Richtlinie mehrere Bedingungsoperatoren oder mehrere Schlüssel aufweist, die an einen einzigen Bedingungsoperator angehängt sind, werden die Bedingungen mit einer UND-Logik ausgewertet. Bei Deny von mehreren Tag-Werten muss jeder RequestTag-Schlüssel in separaten Anweisungen verwendet werden, um dieselbe UND-Logik zu erhalten.

Hinweis: Wenn du alle RequestTag-Schlüsselwerte in einer Bedingung mit einer Deny-Anweisung angibst, verhält sich die Richtlinie möglicherweise nicht wie erwartet. Das liegt daran, dass die Aktion so lange zulässig ist, bis alle Bedingungen in der Deny-Anweisung als „true“ ausgewertet werden. Wenn alle Bedingungen erfüllt sind, wird die Aktion abgelehnt.

Du musst die folgenden Tags einbeziehen:

  • Das Tag cost_center muss einen Wert ungleich null haben.
  • Die Amazon-EC2-Instance verfügt über einen Tag-Schlüssel namens Production.
  • Das Identifier-Tag muss eine Kombination aus fünf beliebigen Zeichen sein.
  • Der Wert des Tags env muss sandbox, dev oder prod lauten.

Beispiel für eine Richtlinie:

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

Hinweis: Du musst die erforderlichen Tags sowohl für EC2-Instances als auch für EBS-Volumes beim Start in der Tag-Spezifikation angeben. Wenn eine der Ressourcen in der RunInstances-Anfrage nicht markiert ist, führen die expliziten Deny-Bedingungen dazu, dass der Start fehlschlägt.

Beachte die folgenden Erzwingungswerte:

  • Der Wert aws:TagKeys erzwingt die Berücksichtigung der Groß- und Kleinschreibung bei Production.
  • Der Wert ????? erzwingt die Verwendung einer Kombination von fünf beliebigen Werten. Führende oder nachgestellte Leerzeichen werden ignoriert.
  • Der Wert ?* erzwingt die Verwendung von mindestens einem Zeichen im Wertfeld. 

Weitere Informationen

Wie erstelle ich eine IAM-Richtlinie zur Steuerung des Zugriffs auf EC2-Ressourcen mithilfe von Tags?

Markieren von Amazon EC2-Ressourcen mit Tags

Steuern des Zugriffs auf AWS-Ressourcen mithilfe von Tags