AWS SDK로 IAM Policy Builder API 다루기

AWS SDK로 IAM Policy Builder API 다루기

이 코드 예제에서는 AWS SDK의 객체 지향 API를 사용해 IAM 정책을 만드는 방법을 보여드려요.

출처: 문서

본문

다음 작업을 다루어요.

  • 객체 지향 API로 IAM 정책 생성
  • IAM 서비스와 함께 IAM Policy Builder API 사용

Java (SDK for Java 2.x)

Note GitHub에 더 많은 내용이 있어요. 전체 예제와 설정·실행 방법은 AWS Code Examples Repository에서 확인할 수 있어요.

다음 예제에서 사용하는 임포트들이에요.


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.policybuilder.iam.IamConditionOperator;
import software.amazon.awssdk.policybuilder.iam.IamEffect;
import software.amazon.awssdk.policybuilder.iam.IamPolicy;
import software.amazon.awssdk.policybuilder.iam.IamPolicyWriter;
import software.amazon.awssdk.policybuilder.iam.IamPrincipal;
import software.amazon.awssdk.policybuilder.iam.IamPrincipalType;
import software.amazon.awssdk.policybuilder.iam.IamResource;
import software.amazon.awssdk.policybuilder.iam.IamStatement;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.iam.IamClient;
import software.amazon.awssdk.services.iam.model.GetPolicyResponse;
import software.amazon.awssdk.services.iam.model.GetPolicyVersionResponse;
import software.amazon.awssdk.services.sts.StsClient;

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;

시간 기반 정책을 만들어요.

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

여러 조건이 있는 정책을 만들어요.

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

정책에 보안 주체(principal)를 지정해요.

 public String specifyPrincipalsExample() {
	IamPolicy policy = IamPolicy.builder()
	.addStatement(b -> b
	.effect(IamEffect.DENY)
	.addAction("s3:*")
	.addPrincipal(IamPrincipal.ALL)
	.addResource("arn:aws:s3:::amzn-s3-demo-bucket/*")
	.addResource("arn:aws:s3:::amzn-s3-demo-bucket")
	.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());
 }

교차 계정 접근을 허용해요.

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

IamPolicy를 만들어 업로드해요.

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

IamPolicy를 다운로드해 작업해요.

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

자세한 내용은 AWS SDK for Java 2.x Developer Guide를 참고해요.

API 상세는 AWS SDK for Java 2.x API Reference의 다음 항목을 참고해요.

  • CreatePolicy
  • GetPolicy
  • GetPolicyVersion

더 알아보기 (Learn more)