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:
und der ResourceTag/tag-key-Kontextschlüssel, der von mehreren Services unterstützt wird.encryption_context_key
-
Wenn Sie den
ResourceTag/
-Kontextschlüssel für einen Service wie etwa Amazon EC2 verwenden, müssen Sie einen Schlüsselnamen für dentag-key
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 NamenTagKey1
odertagkey1
ü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
undEC2=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.
-
Eine Liste aller Bedingungsoperatoren und eine Beschreibung ihrer Funktionsweise finden Sie unter Bedingungsoperatoren.
-
Sofern nicht anders angegeben, können alle Kontextschlüssel mehrere Werte haben. Eine Beschreibung zum Umgang mit Kontextschlüsseln mit mehreren Werten finden Sie unter Mehrwertige Kontextschlüssel.
-
Eine Liste aller global verfügbaren Kontextschlüssel finden Sie unter Globale AWS-Bedingungskontextschlüssel.
-
Informationen zu Bedingungskontextschlüsseln, die von jedem Service definiert werden, finden Sie unter Aktionen, Ressourcen und Bedingungsschlüssel für AWS-Services.
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 wahr, falsch, nicht 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 demaws: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.
Weitere Informationen finden Sie unter Mehrwertige Kontextschlüssel.