IAM-JSON-Richtlinienelemente: Condition - AWS Identity and Access Management

IAM-JSON-Richtlinienelemente: Condition

Mit dem Element Condition (oder dem Condition-Block) können Sie angeben, unter welchen Bedingungen eine Richtlinie wirksam ist. Das Element Condition ist optional. Im Condition-Element formulieren Sie Ausdrücke, in denen Sie Bedingungsoperatoren (gleich, kleiner als usw.) verwenden, um die Kontextschlüssel und -werte in der Richtlinie mit Schlüsseln und Werten im Anforderungskontext abzugleichen. Weitere Informationen zum Anforderungskontext finden Sie unter Bestandteile einer Anfrage.

"Condition" : { "{condition-operator}" : { "{condition-key}" : "{condition-value}" }}

Der Kontextschlüssel, den Sie in einer Richtlinienbedingung angeben, kann ein globaler Bedingungskontextschlüssel oder ein servicespezifischer Kontextschlüssel sein. Kontextschlüssel für globale Bedingungen verfügen über das Präfix aws:. Servicespezifische Kontextschlüssel verfügen über das Präfix des Services. Mit Amazon EC2 können Sie beispielsweise mithilfe des ec2:InstanceType-Kontextschlüssels eine Bedingung schreiben, die für diesen Service eindeutig ist. Informationen zum Anzeigen servicespezifischer IAM-Kontextschlüssel mit dem Präfix iam: finden Sie unter IAM- und AWS STS-Bedingungskontextschlüssel.

Bei Namen von Kontextschlüsseln wird die Groß-/Kleinschreibung nicht beachtet. Das Einbeziehen des aws:SourceIP-Kontextschlüssels ist beispielsweise gleichbedeutend mit dem Testen auf AWS:SourceIp. Die Berücksichtigung der Groß- und Kleinschreibung bei  Werten von Kontextschlüsseln hängt vom verwendeten Bedingungsoperator ab. Die folgende Bedingung enthält beispielsweise den StringEquals-Operator, um sicherzustellen, dass nur von johndoe gestellte Anfragen übereinstimmen. Benutzern mit dem Namen JohnDoe wird der Zugriff verweigert.

"Condition" : { "StringEquals" : { "aws:username" : "johndoe" }}

Die folgende Bedingung verwendet den StringEqualsIgnoreCase-Operator, damit Benutzer mit dem Namen johndoe oder JohnDoe gefunden werden.

"Condition" : { "StringEqualsIgnoreCase" : { "aws:username" : "johndoe" }}

Einige Kontextschlüssel unterstützen Schlüssel-Wert-Paare, mit denen Sie einen Teil des Schlüsselnamens festlegen können. Beispiele hierfür sind der globale aws:RequestTag/tag-key-Kontextschlüssel, AWS KMSkms:EncryptionContext:encryption_context_key und der ResourceTag/tag-key-Kontextschlüssel, der von mehreren Services unterstützt wird.

  • Wenn Sie den ResourceTag/tag-key-Kontextschlüssel für einen Service wie etwa Amazon EC2 verwenden, müssen Sie einen Schlüsselnamen für den tag-key angeben.

  • Bei den Schlüsselnamen muss die Groß- und Kleinschreibung nicht berücksichtigt werden. Dies bedeutet Folgendes: Wenn Sie "aws:ResourceTag/TagKey1": "Value1" im Bedingungselement Ihrer Richtlinie angeben, stimmt die Bedingung mit einem Ressourcen-Tag-Schlüssel mit dem Namen TagKey1 oder tagkey1 überein, aber nicht mit beiden.

  • AWS-Services, die diese Attribute unterstützen, ermöglichen es Ihnen möglicherweise, mehrere Schlüsselnamen zu erstellen, die sich nur durch Groß-/Kleinschreibung unterscheiden. Ein Beispiel wäre hier das Tagging einer Amazon-EC2-Instance mit ec2=test1 und EC2=test2. Wenn Sie eine Bedingung wie "aws:ResourceTag/EC2": "test1" verwenden, um den Zugriff auf diese Ressource zu erlauben, stimmt der Schlüsselname mit beiden Tags, jedoch nur mit einem Wert überein. Dies kann zu unerwarteten Bedingungsfehlern führen.

Wichtig

Als bewährte Methode stellen Sie sicher, dass Mitglieder Ihres Kontos eine konsistente Namenskonvention beim Benennen von Schlüssel-Wert-Paar-Attributen verfolgen. Beispiele hierfür sind Tags oder AWS KMS-Verschlüsselungskontexte. Sie können dies erzwingen, indem Sie den aws:TagKeys-Kontextschlüssel zum Taggen oder kms:EncryptionContextKeys für den AWS KMS-Verschlüsselungskontext verwenden.

Der Anforderungskontext

Wenn ein Auftraggeber eine Anforderung an AWS stellt, erfasst AWS die Anforderungsinformationen in einem Anforderungskontext. Die Informationen werden verwendet, um die Anforderung auszuwerten und zu autorisieren. Sie können das Condition-Element einer JSON-Richtlinie verwenden, um bestimmte Kontextschlüssel anhand des Anforderungskontexts zu testen. Sie können beispielsweise eine Richtlinie erstellen, die den Kontextschlüssel aws:CurrentTime verwendet, um einem Benutzer das Ausführen von Aktionen nur innerhalb eines bestimmten Datumsbereichs zu ermöglichen.

Wenn eine Anfrage übermittelt wird, wertet AWS jeden Kontextschlüssel in der Richtlinie aus und gibt einen Wert von wahrfalschnicht vorhanden und gelegentlich null (eine leere Datenzeichenfolge) zurück. Ein Kontextschlüssel, der in der Anfrage nicht vorhanden ist, wird als Nichtübereinstimmung betrachtet. Die folgende Richtlinie erlaubt beispielsweise das Entfernen Ihres eigenen Multi-Faktor-Authentifizierung (MFA)-Geräts, aber nur, wenn Sie sich in der letzten Stunde (3 600  Sekunden) per MFA angemeldet haben.

{ "Version": "2012-10-17", "Statement": { "Sid": "AllowRemoveMfaOnlyIfRecentMfa", "Effect": "Allow", "Action": [ "iam:DeactivateMFADevice" ], "Resource": "arn:aws:iam::*:user/${aws:username}", "Condition": { "NumericLessThanEquals": {"aws:MultiFactorAuthAge": "3600"} } } }

Der Anforderungskontext kann die folgenden Werte zurückgeben:

  • True – Wenn der Anforderer sich innerhalb der letzten Stunde per MFA angemeldet hat, gibt die Bedingung true zurück.

  • False – Wenn sich der Anforderer vor mehr als einer Stunde per MFA angemeldet hat, gibt die Bedingung false zurück.

  • Not present (nicht vorhanden) – Wenn der Anforderer eine Anforderung unter Verwendung seiner IAM-Benutzerzugriffsschlüssel in der AWS CLI oder AWS-API gestellt hat, ist der Schlüssel nicht vorhanden. In diesem Fall ist der Schlüssel nicht vorhanden und stimmt nicht überein.

  • Null – Für Kontextschlüssel, die vom Benutzer definiert werden, z. B. die Übergabe von Tags in einer Anfrage, ist es möglich, eine leere Zeichenfolge einzuschließen. In diesem Fall ist der Wert im Anforderungskontext null. Ein Null-Wert kann in einigen Fällen "true" zurückgeben. Wenn Sie beispielsweise den mehrwertigen ForAllValues-Bedingungsoperator mit dem aws:TagKeys-Kontextschlüssel verwenden, können unerwartete Ergebnisse auftreten, wenn der Anforderungskontext null zurückgibt. Weitere Informationen finden Sie unter aws:TagKeys und Mehrwertige Kontextschlüssel.

Der Bedingungsblock

Das folgende Beispiel zeigt das grundlegende Format eines Condition-Elements:

"Condition": {"StringLike": {"s3:prefix": ["janedoe/*"]}}

Ein Wert aus der Anfrage wird durch einen Kontextschlüssel dargestellt, in diesem Fall s3:prefix. Der Kontextschlüsselwert wird mit einem Wert verglichen, den Sie als Literalwert angeben, z. B. janedoe/*. Der vorzunehmende Vergleich wird vom Bedingungsoperator (hier StringLike) bestimmt. Sie können Bedingungen erstellen, die Zeichenketten, Datumsangaben, Zahlen und vieles mehr mit typischen booleschen Vergleichen wie "gleich", "größer als" und "kleiner als" vergleichen. Wenn Sie Zeichenfolgen-Operatoren oder ARN-Operatoren verwenden, können Sie auch eine Richtlinienvariable im Kontextschlüsselwert verwenden. Das folgende Beispiel enthält die Variable aws:username.

"Condition": {"StringLike": {"s3:prefix": ["${aws:username}/*"]}}

Unter bestimmten Umständen können Kontextschlüssel mehrere Werte enthalten. Eine Anforderung an Amazon DynamoDB könnte beispielsweise darin bestehen, mehrere Attribute einer Tabelle zurückzugeben oder zu aktualisieren. Eine Richtlinie für den Zugriff auf DynamoDB-Tabellen kann den dynamodb:Attributes-Kontextschlüssel enthalten, der alle in der Anfrage aufgeführten Attribute enthält. Sie können diese Attribute mit einer Liste zulässiger Attribute in einer Richtlinie mithilfe von Mengenoperatoren im Element Condition vergleichen. Weitere Informationen finden Sie unter Mehrwertige Kontextschlüssel.

Wenn die Richtlinie im Zuge einer Anforderung ausgewertet wird, ersetzt AWS den Schlüssel mit dem entsprechenden Anforderungswert. (In diesem Beispiel würde AWS das Datum und die Uhrzeit der Anforderung verwenden.) Die Auswertung der Bedingung gibt "true" oder "false" zurück und das Ergebnis wird von der Richtlinie berücksichtigt, um die Anforderung zuzulassen oder zu verweigern.

Mehrere Werte in einer Bedingung

Ein Condition-Element kann mehrere Bedingungsoperatoren enthalten, und jeder Bedingungsoperator kann mehrere Kontext-Schlüssel-Wert-Paare enthalten. Dies wird in folgender Abbildung veranschaulicht.

Zwei Blockdiagramme für Bedingungs-Operatoren. Der erste Block enthält zwei Platzhalter für Kontextschlüssel mit jeweils mehreren Werten. Der zweite Bedingungsblock enthält einen Kontextschlüssel mit mehreren Werten.

Weitere Informationen finden Sie unter Mehrwertige Kontextschlüssel.