Erstellen von IAM-Richtlinien mit der AWS SDK for Java 2.x - AWS SDK for Java 2.x

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erstellen von IAM-Richtlinien mit der AWS SDK for Java 2.x

Die IAM Policy Builder API ist eine Bibliothek, mit der Sie IAM-Richtlinien in Java erstellen und in AWS Identity and Access Management (IAM) hochladen können.

Anstatt eine IAM-Richtlinie durch manuelles Zusammenstellen einer JSON-Zeichenfolge oder durch Lesen einer Datei zu erstellen, bietet die API einen clientseitigen, objektorientierten Ansatz zum Generieren der JSON-Zeichenfolge. Wenn Sie eine vorhandene IAM-Richtlinie im JSON-Format lesen, konvertiert die API sie zur Verarbeitung in eine IamPolicy Instance.

Die IAM Policy Builder API wurde mit Version 2.20.105 des SDK verfügbar. Verwenden Sie daher diese Version oder eine neuere Version in Ihrer Maven-Build-Datei. Die neueste Versionsnummer des SDK ist auf Maven Central aufgeführt.

Der folgende Codeausschnitt zeigt ein Beispiel für einen Abhängigkeitsblock für eine Maven-pom.xmlDatei. Auf diese Weise können Sie die IAM Policy Builder-API in Ihrem Projekt verwenden.

<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>iam-policy-builder</artifactId> <version>2.20.139</version> </dependency>

Erstellen eines IamPolicy

Dieser Abschnitt zeigt mehrere Beispiele für die Erstellung von Richtlinien mithilfe der IAM-Policy-Builder-API.

Beginnen Sie in jedem der folgenden Beispiele mit IamPolicy.Builder und fügen Sie eine oder mehrere Anweisungen hinzu, indem Sie die -addStatementMethode verwenden. Nach diesem Muster verfügt der IamStatement.Builder über Methoden, um der Anweisung die Wirkung, Aktionen, Ressourcen und Bedingungen hinzuzufügen.

Beispiel: Erstellen einer zeitbasierten Richtlinie

Im folgenden Beispiel wird eine identitätsbasierte Richtlinie erstellt, die die Amazon-DynamoDB-GetItemAktion zwischen zwei Zeitpunkten zulässt.

public String timeBasedPolicyExample() { IamPolicy policy = IamPolicy.builder() .addStatement(b -> b .effect(IamEffect.ALLOW) .addAction("dynamodb:GetItem") .addResource(IamResource.ALL) .addCondition(b1 -> b1 .operator(IamConditionOperator.DATE_GREATER_THAN) .key("aws:CurrentTime") .value("2020-04-01T00:00:00Z")) .addCondition(b1 -> b1 .operator(IamConditionOperator.DATE_LESS_THAN) .key("aws:CurrentTime") .value("2020-06-30T23:59:59Z"))) .build(); // Use an IamPolicyWriter to write out the JSON string to a more readable format. return policy.toJson(IamPolicyWriter.builder() .prettyPrint(true) .build()); }

Die letzte Anweisung im vorherigen Beispiel gibt die folgende JSON-Zeichenfolge zurück.

Weitere Informationen zu diesem Beispiel finden Sie im AWS Identity and Access Management -Benutzerhandbuch.

{ "Version" : "2012-10-17", "Statement" : { "Effect" : "Allow", "Action" : "dynamodb:GetItem", "Resource" : "*", "Condition" : { "DateGreaterThan" : { "aws:CurrentTime" : "2020-04-01T00:00:00Z" }, "DateLessThan" : { "aws:CurrentTime" : "2020-06-30T23:59:59Z" } } }

Beispiel: Angeben mehrerer Bedingungen

Das folgende Beispiel zeigt, wie Sie eine identitätsbasierte Richtlinie erstellen können, die den Zugriff auf bestimmte DynamoDB-Attribute ermöglicht. Die Richtlinie enthält zwei Bedingungen.

public String multipleConditionsExample() { IamPolicy policy = IamPolicy.builder() .addStatement(b -> b .effect(IamEffect.ALLOW) .addAction("dynamodb:GetItem") .addAction("dynamodb:BatchGetItem") .addAction("dynamodb:Query") .addAction("dynamodb:PutItem") .addAction("dynamodb:UpdateItem") .addAction("dynamodb:DeleteItem") .addAction("dynamodb:BatchWriteItem") .addResource("arn:aws:dynamodb:*:*:table/table-name") .addConditions(IamConditionOperator.STRING_EQUALS.addPrefix("ForAllValues:"), "dynamodb:Attributes", List.of("column-name1", "column-name2", "column-name3")) .addCondition(b1 -> b1.operator(IamConditionOperator.STRING_EQUALS.addSuffix("IfExists")) .key("dynamodb:Select") .value("SPECIFIC_ATTRIBUTES"))) .build(); return policy.toJson(IamPolicyWriter.builder() .prettyPrint(true).build()); }

Die letzte Anweisung im vorherigen Beispiel gibt die folgende JSON-Zeichenfolge zurück.

Weitere Informationen zu diesem Beispiel finden Sie im AWS Identity and Access Management -Benutzerhandbuch.

{ "Version" : "2012-10-17", "Statement" : { "Effect" : "Allow", "Action" : [ "dynamodb:GetItem", "dynamodb:BatchGetItem", "dynamodb:Query", "dynamodb:PutItem", "dynamodb:UpdateItem", "dynamodb:DeleteItem", "dynamodb:BatchWriteItem" ], "Resource" : "arn:aws:dynamodb:*:*:table/table-name", "Condition" : { "ForAllValues:StringEquals" : { "dynamodb:Attributes" : [ "column-name1", "column-name2", "column-name3" ] }, "StringEqualsIfExists" : { "dynamodb:Select" : "SPECIFIC_ATTRIBUTES" } } }

Beispiel: Angeben von Prinzipalen

Das folgende Beispiel zeigt, wie Sie eine ressourcenbasierte Richtlinie erstellen, die den Zugriff auf einen Bucket für alle Prinzipale verweigert, mit Ausnahme der in der Bedingung angegebenen.

public String specifyPrincipalsExample() { IamPolicy policy = IamPolicy.builder() .addStatement(b -> b .effect(IamEffect.DENY) .addAction("s3:*") .addPrincipal(IamPrincipal.ALL) .addResource("arn:aws:s3:::BUCKETNAME/*") .addResource("arn:aws:s3:::BUCKETNAME") .addCondition(b1 -> b1 .operator(IamConditionOperator.ARN_NOT_EQUALS) .key("aws:PrincipalArn") .value("arn:aws:iam::444455556666:user/user-name"))) .build(); return policy.toJson(IamPolicyWriter.builder() .prettyPrint(true).build()); }

Die letzte Anweisung im vorherigen Beispiel gibt die folgende JSON-Zeichenfolge zurück.

Weitere Informationen zu diesem Beispiel finden Sie im AWS Identity and Access Management -Benutzerhandbuch.

{ "Version" : "2012-10-17", "Statement" : { "Effect" : "Deny", "Principal" : "*", "Action" : "s3:*", "Resource" : [ "arn:aws:s3:::BUCKETNAME/*", "arn:aws:s3:::BUCKETNAME" ], "Condition" : { "ArnNotEquals" : { "aws:PrincipalArn" : "arn:aws:iam::444455556666:user/user-name" } } } }

Beispiel: Kontoübergreifenden Zugriff zulassen

Das folgende Beispiel zeigt, wie Sie einem anderen erlauben AWS-Konto , Objekte in Ihren Bucket hochzuladen, während die volle Eigentümerkontrolle der hochgeladenen Objekte beibehalten wird.

public String allowCrossAccountAccessExample() { IamPolicy policy = IamPolicy.builder() .addStatement(b -> b .effect(IamEffect.ALLOW) .addPrincipal(IamPrincipalType.AWS, "111122223333") .addAction("s3:PutObject") .addResource("arn:aws:s3:::DOC-EXAMPLE-BUCKET/*") .addCondition(b1 -> b1 .operator(IamConditionOperator.STRING_EQUALS) .key("s3:x-amz-acl") .value("bucket-owner-full-control"))) .build(); return policy.toJson(IamPolicyWriter.builder() .prettyPrint(true).build()); }

Die letzte Anweisung im vorherigen Beispiel gibt die folgende JSON-Zeichenfolge zurück.

Weitere Informationen zu diesem Beispiel finden Sie im Benutzerhandbuch für Amazon Simple Storage Service.

{ "Version" : "2012-10-17", "Statement" : { "Effect" : "Allow", "Principal" : { "AWS" : "111122223333" }, "Action" : "s3:PutObject", "Resource" : "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*", "Condition" : { "StringEquals" : { "s3:x-amz-acl" : "bucket-owner-full-control" } } } }

Verwenden eines IamPolicy mit IAM

Nachdem Sie eine IamPolicy Instance erstellt haben, verwenden Sie eine , IamClient um mit dem IAM-Service zu arbeiten.

Im folgenden Beispiel wird eine Richtlinie erstellt, die es einer IAM-Identität ermöglicht, Elemente in eine DynamoDB-Tabelle in dem Konto zu schreiben, das mit dem -accountIDParameter angegeben ist. Die Richtlinie wird dann als JSON-Zeichenfolge in IAM hochgeladen.

public String createAndUploadPolicyExample(IamClient iam, String accountID, String policyName) { // Build the policy. IamPolicy policy = IamPolicy.builder() // 'version' defaults to "2012-10-17". .addStatement(IamStatement.builder() .effect(IamEffect.ALLOW) .addAction("dynamodb:PutItem") .addResource("arn:aws:dynamodb:us-east-1:" + accountID + ":table/exampleTableName") .build()) .build(); // Upload the policy. iam.createPolicy(r -> r.policyName(policyName).policyDocument(policy.toJson())); return policy.toJson(IamPolicyWriter.builder().prettyPrint(true).build()); }

Das nächste Beispiel baut auf dem vorherigen Beispiel auf. Der Code lädt die Richtlinie herunter und verwendet sie als Grundlage für eine neue Richtlinie, indem er die Anweisung kopiert und ändert. Die neue Richtlinie wird dann hochgeladen.

public String createNewBasedOnExistingPolicyExample(IamClient iam, String accountID, String policyName, String newPolicyName) { String policyArn = "arn:aws:iam::" + accountID + ":policy/" + policyName; GetPolicyResponse getPolicyResponse = iam.getPolicy(r -> r.policyArn(policyArn)); String policyVersion = getPolicyResponse.policy().defaultVersionId(); GetPolicyVersionResponse getPolicyVersionResponse = iam.getPolicyVersion(r -> r.policyArn(policyArn).versionId(policyVersion)); // Create an IamPolicy instance from the JSON string returned from IAM. String decodedPolicy = URLDecoder.decode(getPolicyVersionResponse.policyVersion().document(), StandardCharsets.UTF_8); IamPolicy policy = IamPolicy.fromJson(decodedPolicy); /* All IamPolicy components are immutable, so use the copy method that creates a new instance that can be altered in the same method call. Add the ability to get an item from DynamoDB as an additional action. */ IamStatement newStatement = policy.statements().get(0).copy(s -> s.addAction("dynamodb:GetItem")); // Create a new statement that replaces the original statement. IamPolicy newPolicy = policy.copy(p -> p.statements(Arrays.asList(newStatement))); // Upload the new policy. IAM now has both policies. iam.createPolicy(r -> r.policyName(newPolicyName) .policyDocument(newPolicy.toJson())); return newPolicy.toJson(IamPolicyWriter.builder().prettyPrint(true).build()); }

In den vorherigen Beispielen wird ein IamClient Argument verwendet, das wie im folgenden Ausschnitt gezeigt erstellt wird.

IamClient iam = IamClient.builder().region(Region.AWS_GLOBAL).build();

Die Beispiele geben die folgenden JSON-Zeichenfolgen zurück.

First example { "Version" : "2012-10-17", "Statement" : { "Effect" : "Allow", "Action" : "dynamodb:PutItem", "Resource" : "arn:aws:dynamodb:us-east-1:111122223333:table/exampleTableName" } } Second example { "Version" : "2012-10-17", "Statement" : { "Effect" : "Allow", "Action" : [ "dynamodb:PutItem", "dynamodb:GetItem" ], "Resource" : "arn:aws:dynamodb:us-east-1:111122223333:table/exampleTableName" } }