Crea IAM politiche con AWS SDK for Java 2.x - AWS SDK for Java 2.x

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Crea IAM politiche con AWS SDK for Java 2.x

IAMPolicy Builder API è una libreria che puoi usare per creare IAMpolitiche in Java e caricarle AWS Identity and Access Management su (). IAM

Invece di creare una IAM policy assemblando manualmente una JSON stringa o leggendo un file, API fornisce un approccio lato client e orientato agli oggetti per generare la stringa. JSON Quando leggi una IAM politica esistente in JSON formato, la API converte in un'istanza per la gestione. IamPolicy

Il IAM Policy Builder API è diventato disponibile con la versione 2.20.105 diSDK, quindi usa quella versione o una successiva nel tuo file di build di Maven. Il numero di versione più recente di SDK è elencato su Maven Central.

Il seguente frammento mostra un esempio di blocco di dipendenza per un file Maven. pom.xml Ciò consente di utilizzare IAM Policy Builder nel progetto. API

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

Creazione di un IamPolicy

Questa sezione mostra diversi esempi di come creare politiche utilizzando IAM Policy BuilderAPI.

In ciascuno degli esempi seguenti, inizia con IamPolicy.Builder e aggiungi una o più istruzioni utilizzando il addStatement metodo. Seguendo questo schema, IamStatement.Builder dispone di metodi per aggiungere l'effetto, le azioni, le risorse e le condizioni all'istruzione.

Esempio: creare una politica basata sul tempo

L'esempio seguente crea una policy basata sull'identità che consente l'azione di Amazon DynamoDB tra due momenti temporali. GetItem

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

L'ultima istruzione dell'esempio precedente restituisce la seguente JSON stringa.

Ulteriori informazioni su questo esempio sono disponibili nella Guida AWS Identity and Access Management per l'utente.

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

Esempio: specificare più condizioni

L'esempio seguente mostra come creare una policy basata sull'identità che consenta l'accesso a specifici attributi di DynamoDB. La policy contiene due condizioni.

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

L'ultima istruzione dell'esempio precedente restituisce la seguente JSON stringa.

Ulteriori informazioni su questo esempio sono disponibili nella Guida AWS Identity and Access Management per l'utente.

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

Esempio: specificare i principi

L'esempio seguente mostra come creare una politica basata sulle risorse che neghi l'accesso a un bucket a tutti i principali ad eccezione di quelli specificati nella condizione.

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

L'ultima istruzione dell'esempio precedente restituisce la seguente JSON stringa.

Ulteriori informazioni su questo esempio sono disponibili nella Guida AWS Identity and Access Management per l'utente.

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

Esempio: consentire l'accesso su più account

L'esempio seguente mostra come consentire Account AWS a un altro utente di caricare oggetti nel tuo bucket mantenendo il pieno controllo del proprietario degli oggetti caricati.

public String allowCrossAccountAccessExample() { IamPolicy policy = IamPolicy.builder() .addStatement(b -> b .effect(IamEffect.ALLOW) .addPrincipal(IamPrincipalType.AWS, "111122223333") .addAction("s3:PutObject") .addResource("arn:aws:s3:::amzn-s3-demo-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()); }

L'ultima istruzione dell'esempio precedente restituisce la seguente JSON stringa.

Scopri di più su questo esempio nella Guida per l'utente di Amazon Simple Storage Service.

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

Usa e IamPolicy con IAM

Dopo aver creato un'IamPolicyistanza, si utilizza an IamClientper lavorare con il IAM servizio.

L'esempio seguente crea una policy che consente a un'IAMidentità di scrivere elementi in una tabella DynamoDB nell'account specificato con il parametro. accountID La policy viene quindi caricata IAM come stringa. 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'esempio successivo si basa sull'esempio precedente. Il codice scarica la policy e la utilizza come base per una nuova policy copiando e alterando la dichiarazione. La nuova politica viene quindi caricata.

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

Gli esempi precedenti utilizzano un IamClient argomento creato come illustrato nel frammento seguente.

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

Gli esempi restituiscono le JSON stringhe seguenti.

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