Einwertige im Vergleich zu mehrwertige Kontextschlüssel - AWS Identity and Access Management

Einwertige im Vergleich zu mehrwertige Kontextschlüssel

Der Unterschied zwischen einwertigen und mehrwertigen Kontextschlüsseln liegt in der Anzahl der Werte im Anfragekontext, nicht in der Anzahl der Werte in der Richtlinienbedingung.

  • Einwertige Bedingungskontextschlüssel haben höchstens einen Wert im Anforderungskontext. Wenn Sie beispielsweise Ressourcen in AWS markieren, wird jedes Ressourcen-Tag als Schlüssel-Wert-Paar gespeichert. Da ein Ressourcen-Tagschlüssel nur einen einzigen Tagwert haben kann, ist aws:ResourceTag/tag-key ein einwertiger Kontextschlüssel. Verwenden Sie keinen Bedingungssatzoperator mit einem einwertigen Kontextschlüssel.

  • Mehrwertige Bedingungskontextschlüssel können im Anforderungskontext mehrere Werte enthalten. Wenn Sie beispielsweise Ressourcen in AWS mit Tags versehen, können Sie mehrere Tag-Schlüssel-Wert-Paare in eine einzige Anfrage einschließen. Daher handelt es sich bei aws:TagKeys um einen mehrwertigen Kontextschlüssel. Mehrwertige Kontextschlüssel erfordern einen Bedingungssatz-Operator.

Beispielsweise kann eine Anfrage von höchstens einem VPC-Endpunkt stammen, weshalb es sich bei aws:SourceVpce um einen einwertigen Kontextschlüssel handelt. Da ein Service über mehr als einen Prinzipal verfügen kann, der zum Service gehört, handelt es sich bei aws:PrincipalServiceNamesList um einen mehrwertigen Kontextschlüssel.

Wichtig

Der Unterschied zwischen einwertigen und mehrwertigen Kontextschlüsseln hängt von der Anzahl der Werte im Anforderungskontext ab, nicht von der Anzahl der Werte in der Richtlinienbedingung.

Wichtige Punkte

  • Die einwertigen und mehrwertigen Klassifizierungen sind in der Beschreibung jedes Bedingungskontextschlüssels als Werttyp im AWS Globale Bedingungskontextschlüssel-Thema enthalten.

  • Mehrwertige Kontextschlüssel in der Service Authorization-Referenz verwenden das Präfix „ArrayOf“, gefolgt vom Typ des Bedingungsoperators (z. B. „ArrayOfString“ oder „ArrayOfARN“). Dies gibt an, dass die Anfrage mehrere Werte für einen Bedingungskontextschlüssel enthalten kann.

  • Sie können jeden verfügbaren einwertigen Kontextschlüssel als Richtlinienvariable verwenden, aber Sie können keinen mehrwertigen Kontextschlüssel als Richtlinienvariable verwenden. Weitere Informationen zu Richtlinienvariablen finden Sie unter IAM-Richtlinienelemente: Variablen und Tags.

  • Bei der Verwendung von Kontextschlüsseln, die Schlüssel-Wert-Paare enthalten, ist es wichtig zu beachten, dass es zwar mehrere Tag-Schlüssel-Werte geben kann, jeder tag-key jedoch nur einen Wert haben kann.

  • Mehrwertige Kontextschlüssel erfordern einen Bedingungssatz-Operator. Verwenden Sie die Bedingungssatz-Operatoren ForAllValues oder ForAnyValue nicht mit einwertigen Kontextschlüsseln. Die Verwendung von Bedingungssatzoperatoren mit einwertigen Kontextschlüsseln kann zu übermäßig zulässigen Richtlinien führen.

Operatoren für mehrwertige Kontextschlüssel festlegen

Um Ihren Bedingungskontextschlüssel mit einem Anforderungskontext-Schlüssel mit mehreren Werten zu vergleichen, müssen Sie die Satzoperatoren ForAllValues oder ForAnyValue verwenden. Diese Satzoperatoren werden verwendet, um zwei Sätze von Werten zu vergleichen, z. B. den Satz von Tags in einer Anfrage und den Satz von Tags in einer Richtlinienbedingung.

Die ForAllValues- und ForAnyValue-Qualifikatoren fügen dem Bedingungsoperator eine Funktionalität zum Festlegen von Operationen hinzu, sodass Sie in einer Richtlinie Anfragekontextschlüssel mit mehreren Werten anhand mehrerer Bedingungsschlüsselwerte testen können. Wenn Sie außerdem einen mehrwertigen Zeichenfolgen-Kontextschlüssel mit einem Platzhalter oder einer Variablen in Ihre Richtlinie einschließen, müssen Sie auch den StringLike-Bedingungsoperator verwenden. Mehrere Bedingungsschlüsselwerte müssen wie ein Array in Klammern eingeschlossen werden, zum Beispiel "Key2":["Value2A", "Value2B"].

ForAllValues

Der Qualifizierer „ForAllValues“ prüft, ob der Wert jedes Elements des Anfragekontexts mit dem nachfolgenden Bedingungsoperator übereinstimmt. Die Bedingung gibt true zurück, wenn jeder Kontextschlüsselwert in der Anfrage mit einem Kontextschlüsselwert in der Richtlinie übereinstimmt. Sie gibt ebenfalls true zurück, wenn keine Kontextschlüssel in der Anfrage vorhanden sind.

Wichtig

Seien Sie vorsichtig, wenn Sie ForAllValues mit einem Allow-Effekt verwenden, da dies übermäßig zulässig sein kann, wenn das Vorhandensein fehlender Kontextschlüssel im Anfragekontext unerwartet ist. Sie sollten immer den Null-Bedingungsoperator mit einem false-Wert in Ihre Richtlinie einschließen, um zu prüfen, ob der Kontextschlüssel vorhanden ist und sein Wert nicht null ist. Ein Beispiel finden Sie unter Zugriffssteuerung auf der Grundlage von Tag-Schlüsseln.

Beispiel für den Satzoperator „ForAllValues“

Im folgenden Beispiel wird „ForAllValues“ ​​zusammen mit aws:TagKeys verwendet, um Benutzern das Löschen bestimmter Tags zu ermöglichen, die einer EC2-Instance zugewiesen sind. Diese Richtlinie erlaubt Benutzern nur das Löschen der Tags environment und cost-center. Sie können diese einzeln oder zusammen löschen. Die Tag-Schlüssel in der Anfrage müssen exakt mit den in der Richtlinie angegebenen Schlüsseln übereinstimmen.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:DeleteTags", "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*", "Condition": { "ForAllValues:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }, "Null": { "aws:TagKeys": "false" } } } ] }

Die folgende Tabelle zeigt, wie AWS diese Richtlinie auf der Grundlage der Bedingungsschlüsselwerte in Ihrer Anfrage auswertet.

Richtlinienbedingung Kontext anfordern Ergebnis
"ForAllValues:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }, "Null": { "aws:TagKeys": "false" }
aws:TagKeys: – environment

Match

"ForAllValues:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }, "Null": { "aws:TagKeys": "false" }
aws:TagKeys: – cost-center

Match

"ForAllValues:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }, "Null": { "aws:TagKeys": "false" }
aws:TagKeys: – environment – cost-center

Match

"ForAllValues:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }, "Null": { "aws:TagKeys": "false" }
aws:TagKeys: – environment – dept

Keine Übereinstimmung

"ForAllValues:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }, "Null": { "aws:TagKeys": "false" }

Kein aws:TagKeys im Anfragekontext.

Keine Übereinstimmung

Beachten Sie, dass im letzten Beispiel das Ergebnis „Keine Übereinstimmung“ lautet, da die Null-Bedingungsprüfung eine Übereinstimmung verhindert, wenn der Kontextschlüssel fehlt. Dies ist eine bewährte Methode, um zu permissive Richtlinien zu vermeiden.

ForAnyValue

Der Qualifikator „ForAnyValue“ prüft, ob mindestens ein Element des Satzes von Bedingungskontextschlüssel-Werten mit mindestens einem Element des Satzes von Bedingungskontextschlüssel-Werten in Ihrer Richtlinie übereinstimmt. Die Bedingung gibt true zurück, wenn einer der Kontextschlüsselwerte in der Anfrage mit einem der Kontextschlüsselwerte in der Richtlinie übereinstimmt. Wenn kein übereinstimmender Kontextschlüssel vorhanden ist oder der Schlüssel nicht existiert, gibt die Bedingung „false“ zurück.

Wichtig

Bei Verwendung von ForAnyValue mit einem Deny-Effekt wird die Richtlinie als Keine Übereinstimmung ausgewertet, wenn der Kontextschlüssel in der Anfrage nicht vorhanden ist. Für ein konsistentes Verhalten fügen Sie Ihrer Richtlinie eine explizite Null-Bedingungsprüfung hinzu, um zu überprüfen, ob der Kontextschlüssel existiert. Details hierzu finden Sie unter Bedingungsoperator zur Prüfung der Existenz von Bedingungsoperatoren .

Beispiel für den Satzoperator „ForAnyValue“

Im folgenden Beispiel wird ForAnyValue mit aws:TagKeys verwendet, um Benutzern das Löschen bestimmter Tags zu ermöglichen, die einer EC2-Instance zugewiesen sind. Diese Richtlinie erlaubt Benutzern das Löschen von Tags für eine Instance, wenn die in der Anfrage angegebenen Tag-Schlüssel environment oder cost-center enthalten. Die Anfrage kann zusätzliche Tag-Schlüssel enthalten, die nicht in der Richtlinie angegeben sind, muss aber mindestens einen der angegebenen Schlüssel enthalten, um die Bedingung zu erfüllen.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:DeleteTags", "Resource": "arn:aws:ec2:us-east-1:111122223333:instance/*", "Condition": { "ForAnyValue:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] } } } ] }

Die folgende Tabelle zeigt, wie AWS diese Richtlinie auf der Grundlage der Bedingungsschlüsselwerte in Ihrer Anfrage auswertet.

Richtlinienbedingung Kontext anfordern Ergebnis
"ForAnyValue:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }
aws:TagKeys: – environment

Match

"ForAnyValue:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }
aws:TagKeys: – cost-center

Match

"ForAnyValue:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }
aws:TagKeys: – environment – cost-center

Match

"ForAnyValue:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }
aws:TagKeys: – environment – dept

Match

"ForAnyValue:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }
aws:TagKeys: – dept

Keine Übereinstimmung

"ForAnyValue:StringEquals": { "aws:TagKeys": [ "environment", "cost-center" ] }

Kein aws:TagKeys im Anfragekontext.

Keine Übereinstimmung