Créez des politiques IAM avec le AWS SDK for Java 2.x - AWS SDK for Java 2.x

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Créez des politiques IAM avec le AWS SDK for Java 2.x

L'API IAM Policy Builder est une bibliothèque que vous pouvez utiliser pour créer des politiques IAM en Java et les télécharger vers AWS Identity and Access Management (IAM).

Au lieu de créer une politique IAM en assemblant manuellement une chaîne JSON ou en lisant un fichier, l'API fournit une approche orientée objet côté client pour générer la chaîne JSON. Lorsque vous lisez une politique IAM existante au format JSON, l'API la convertit en IamPolicyinstance à gérer.

L'API IAM Policy Builder est devenue disponible avec la version 2.20.105 du SDK. Utilisez donc cette version ou une version ultérieure dans votre fichier de build Maven. Le numéro de version le plus récent du SDK est répertorié sur Maven Central.

L'extrait suivant montre un exemple de bloc de dépendance pour un fichier pom.xml Maven. Cela vous permet d'utiliser l'API IAM Policy Builder dans votre projet.

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

Créer un IamPolicy

Cette section présente plusieurs exemples de création de politiques à l'aide de l'API IAM Policy Builder.

Dans chacun des exemples suivants, commencez par les instructions IamPolicy.Builder et ajoutez une ou plusieurs instructions à l'aide de la addStatement méthode. Suivant ce modèle, le IamStatement.Builder dispose de méthodes pour ajouter l'effet, les actions, les ressources et les conditions à l'instruction.

Exemple : créer une politique basée sur le temps

L'exemple suivant crée une politique basée sur l'identité qui autorise l'action Amazon GetItem DynamoDB entre deux points dans le temps.

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()); }

La dernière instruction de l'exemple précédent renvoie la chaîne JSON suivante.

Pour en savoir plus sur cet exemple, consultez le guide de AWS Identity and Access Management l'utilisateur.

{ "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" } } }

Exemple : Spécifier plusieurs conditions

L'exemple suivant montre comment créer une politique basée sur l'identité qui autorise l'accès à des attributs DynamoDB spécifiques. La politique contient deux conditions.

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()); }

La dernière instruction de l'exemple précédent renvoie la chaîne JSON suivante.

Pour en savoir plus sur cet exemple, consultez le guide de AWS Identity and Access Management l'utilisateur.

{ "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" } } }

Exemple : Spécifier les principaux

L'exemple suivant montre comment créer une politique basée sur les ressources qui refuse l'accès à un bucket à tous les principaux, à l'exception de ceux spécifiés dans la condition.

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()); }

La dernière instruction de l'exemple précédent renvoie la chaîne JSON suivante.

Pour en savoir plus sur cet exemple, consultez le guide de AWS Identity and Access Management l'utilisateur.

{ "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" } } } }

Exemple : autoriser l'accès entre comptes

L'exemple suivant montre comment autoriser une autre personne Compte AWS à télécharger des objets dans votre compartiment tout en conservant le contrôle total du propriétaire sur les objets chargés.

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()); }

La dernière instruction de l'exemple précédent renvoie la chaîne JSON suivante.

Pour en savoir plus sur cet exemple, consultez le guide de l'utilisateur d'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" } } } }

Utiliser et IamPolicy avec IAM

Après avoir créé une IamPolicy instance, vous utilisez an IamClientpour travailler avec le service IAM.

L'exemple suivant crée une politique qui permet à une identité IAM d'écrire des éléments dans une table DynamoDB du compte spécifié avec le paramètre. accountID La politique est ensuite téléchargée dans IAM sous forme de chaîne JSON.

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()); }

L'exemple suivant s'appuie sur l'exemple précédent. Le code télécharge la politique et l'utilise comme base pour une nouvelle politique en copiant et en modifiant la déclaration. La nouvelle politique est ensuite téléchargée.

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()); }

Les exemples précédents utilisent un IamClient argument créé comme indiqué dans l'extrait suivant.

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

Les exemples renvoient les chaînes JSON suivantes.

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" } }