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 verwenden (gleich, kleiner als usw.), um die Bedingungsschlüssel und -werte der Richtlinie mit den Schlüsseln und Werten in der Anforderungen abzugleichen. Weitere Informationen zum Anforderungskontext finden Sie unter Request.

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

Der von Ihnen angegebene Bedingungsschlüssel kann ein globaler Bedingungsschlüssel oder ein servicespezifischer Bedingungsschlüssel sein. Globale Bedingungsschlüssel haben das Präfix aws:. Servicespezifische Bedingungsschlüssel haben das Präfix des Services. Mit Amazon EC2 können Sie beispielsweise eine Bedingung mit dem ec2:InstanceType-Schlüssel schreiben, der für diesen Service eindeutig ist. Informationen zum Anzeigen von servicespezifischen IAM-Bedingungsschlüsseln mit dem Präfix iam: finden Sie unter IAM- und AWS STS-Bedingungskontextschlüssel.

Bei Namen von Bedingungsschlüsseln wird die Groß- und Kleinschreibung nicht beachtet. Beispiel: Das Einbeziehen des aws:SourceIP-Bedingungsschlüssels entspricht dem Testen auf AWS:SourceIp. Die Groß-/Kleinschreibung der Werte von Bedingungsschlüsseln hängt vom verwendeten Bedingungsoperator ab. Beispiel: Die folgende Bedingung enthält die StringEquals-Produktion, um sicherzustellen, dass nur Anfragen von johndoe gefunden werden. 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 Bedingungsschlüssel unterstützen Schlüsselwert-Paare, mit denen Sie einen Teil des Schlüsselnamens festlegen können. Beispiele hierfür sind der globale aws:RequestTag/tag-key-Bedingungsschlüssel, AWS KMSkms:EncryptionContext:encryption_context_key und der ResourceTag/tag-key-Bedingungsschlüssel, der von mehreren Services unterstützt wird. Wenn Sie den ResourceTag/tag-key-Bedingungsschlü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, erlauben Ihnen das Erstellen mehrerer Schlüsselnamen, 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-Bedingungsschlüssel zum Markieren 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 Bedingungen im Hinblick auf den Anforderungskontext zu testen. Sie können beispielsweise eine Richtlinie erstellen, die den aws:CurrentTime-Bedingungsschlüssel verwendet, um einem Benutzer zu erlauben, bestimmte Aktionen mit nur einem bestimmten Datumsbereich auszuführen.

Wenn eine Anforderung übermittelt wird, wertet AWS jeden Bedingungsschlüssel in der Richtlinie aus, der den Wert true, false, not present (nicht vorhanden) oder (gelegentlich) null (eine leere Datenzeichenfolge) zurückgibt. Ein Schlüssel, der nicht in der Anforderung vorhanden ist, wird als fehlende Übereinstimmung gewertet. Die folgende Richtlinie erlaubt beispielsweise das Entfernen Ihres eigenen Multi-Factor-Authentication (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", "iam:DeleteVirtualMFADevice" ], "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 – Bei Bedingungsschlüsseln, die vom Benutzer definiert werden, beispielsweise Übergabe von Tags in einer Anforderung, kann eine leere Zeichenfolge eingeschlossen werden. 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-Bedingungsschlüssel verwenden, können unerwartete Ergebnisse auftreten, wenn der Anforderungskontext nullzurückgibt. Weitere Informationen finden Sie unter aws:TagKeys und Verwenden mehrerer Schlüssel und Werte.

Der Bedingungsblock

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

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

Ein Wert aus der Anforderung wird durch einen Bedingungsschlüssel repräsentiert, 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 im Bedingungswert auch eine Richtlinienvariable verwenden. Das folgende Beispiel enthält die aws:username-Variable.

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

Unter bestimmten Umständen können Schlüssel mehrere Werte enthalten. Eine Anforderung an Amazon DynamoDB könnte beispielsweise darin bestehen, mehrere Attribute einer Tabelle zurückzugeben oder zu aktualisieren. In einer Richtlinie für den Zugriff auf DynamoDB-Tabellen kann der dynamodb:Attributes-Schlüssel definiert werden, der alle in der Anforderung angegebenen 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 Erstellen einer Bedingung mit mehreren Schlüsseln oder Werten.

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 Bedingungen und jede Bedingung kann mehrere Schlüssel-Wert-Paare enthalten. Dies wird in folgender Abbildung veranschaulicht.

Weitere Informationen finden Sie unter Erstellen einer Bedingung mit mehreren Schlüsseln oder Werten.