Buat kebijakan IAM dengan AWS SDK for Java 2.x - AWS SDK for Java 2.x

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Buat kebijakan IAM dengan AWS SDK for Java 2.x

API Pembuat Kebijakan IAM adalah pustaka yang dapat Anda gunakan untuk membangun kebijakan IAM di Java dan mengunggahnya ke AWS Identity and Access Management (IAM).

Alih-alih membangun kebijakan IAM dengan merakit string JSON secara manual atau dengan membaca file, API menyediakan pendekatan berorientasi objek sisi klien untuk menghasilkan string JSON. Saat Anda membaca kebijakan IAM yang ada dalam format JSON, API mengonversinya menjadi IamPolicyinstance untuk ditangani.

API Pembuat Kebijakan IAM tersedia dengan SDK versi 2.20.105, jadi gunakan versi tersebut atau yang lebih baru di file build Maven Anda. Nomor versi terbaru SDK terdaftar di pusat Maven.

Cuplikan berikut menunjukkan contoh blok ketergantungan untuk file Maven. pom.xml Ini memungkinkan Anda untuk menggunakan IAM Policy Builder API dalam proyek Anda.

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

Buat IamPolicy

Bagian ini menunjukkan beberapa contoh cara membuat kebijakan dengan menggunakan IAM Policy Builder API.

Dalam setiap contoh berikut, mulailah dengan IamPolicy.Builder dan tambahkan satu atau lebih pernyataan dengan menggunakan addStatement metode. Mengikuti pola ini, IamStatement.Builder memiliki metode untuk menambahkan efek, tindakan, sumber daya, dan kondisi ke pernyataan.

Contoh: Membuat kebijakan berbasis waktu

Contoh berikut membuat kebijakan berbasis identitas yang mengizinkan tindakan Amazon DynamoDB antara dua titik waktuGetItem.

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

Pernyataan terakhir dalam contoh sebelumnya mengembalikan string JSON berikut.

Baca lebih lanjut tentang contoh ini di Panduan AWS Identity and Access Management Pengguna.

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

Contoh: Tentukan beberapa kondisi

Contoh berikut menunjukkan bagaimana Anda dapat membuat kebijakan berbasis identitas yang memungkinkan akses ke atribut DynamoDB tertentu. Kebijakan tersebut berisi dua syarat.

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

Pernyataan terakhir dalam contoh sebelumnya mengembalikan string JSON berikut.

Baca lebih lanjut tentang contoh ini di Panduan AWS Identity and Access Management Pengguna.

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

Contoh: Tentukan prinsipal

Contoh berikut menunjukkan cara membuat kebijakan berbasis sumber daya yang menolak akses ke bucket untuk semua prinsipal kecuali yang ditentukan dalam kondisi.

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

Pernyataan terakhir dalam contoh sebelumnya mengembalikan string JSON berikut.

Baca lebih lanjut tentang contoh ini di Panduan AWS Identity and Access Management Pengguna.

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

Contoh: Izinkan akses lintas akun

Contoh berikut menunjukkan cara mengizinkan orang lain Akun AWS mengunggah objek ke bucket Anda sambil mempertahankan kontrol pemilik penuh atas objek yang diunggah.

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

Pernyataan terakhir dalam contoh sebelumnya mengembalikan string JSON berikut.

Baca lebih lanjut tentang contoh ini di Panduan Pengguna Layanan Penyimpanan Sederhana Amazon.

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

Gunakan IamPolicy dengan IAM

Setelah Anda membuat IamPolicy instance, Anda menggunakan IamClientuntuk bekerja dengan layanan IAM.

Contoh berikut membangun kebijakan yang memungkinkan identitas IAM untuk menulis item ke tabel DynamoDB di akun yang ditentukan dengan parameter. accountID Kebijakan tersebut kemudian diunggah ke IAM sebagai string 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()); }

Contoh berikutnya dibangun di atas contoh sebelumnya. Kode mengunduh kebijakan dan menggunakannya sebagai dasar untuk kebijakan baru dengan menyalin dan mengubah pernyataan. Kebijakan baru kemudian diunggah.

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

Contoh sebelumnya menggunakan IamClient argumen yang dibuat seperti yang ditunjukkan pada cuplikan berikut.

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

Contoh mengembalikan string JSON berikut.

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