in bundles/aws/src/main/java/org/apache/gravitino/s3/credential/S3TokenProvider.java [119:193]
private IamPolicy createPolicy(
String roleArn, Set<String> readLocations, Set<String> writeLocations) {
IamPolicy.Builder policyBuilder = IamPolicy.builder();
IamStatement.Builder allowGetObjectStatementBuilder =
IamStatement.builder()
.effect(IamEffect.ALLOW)
.addAction("s3:GetObject")
.addAction("s3:GetObjectVersion");
Map<String, IamStatement.Builder> bucketListStatmentBuilder = new HashMap<>();
Map<String, IamStatement.Builder> bucketGetLocationStatmentBuilder = new HashMap<>();
String arnPrefix = getArnPrefix(roleArn);
Stream.concat(readLocations.stream(), writeLocations.stream())
.distinct()
.forEach(
location -> {
URI uri = URI.create(location);
allowGetObjectStatementBuilder.addResource(
IamResource.create(getS3UriWithArn(arnPrefix, uri)));
String bucketArn = arnPrefix + getBucketName(uri);
String rawPath = trimLeadingSlash(uri.getPath());
bucketListStatmentBuilder
.computeIfAbsent(
bucketArn,
(String key) ->
IamStatement.builder()
.effect(IamEffect.ALLOW)
.addAction("s3:ListBucket")
.addResource(key))
.addConditions(
IamConditionOperator.STRING_LIKE,
"s3:prefix",
Arrays.asList(
// Get raw path metadata information for AWS hadoop connector
rawPath,
// Listing objects in raw path
concatPathWithSep(rawPath, "*", "/")));
bucketGetLocationStatmentBuilder.computeIfAbsent(
bucketArn,
key ->
IamStatement.builder()
.effect(IamEffect.ALLOW)
.addAction("s3:GetBucketLocation")
.addResource(key));
});
if (!writeLocations.isEmpty()) {
IamStatement.Builder allowPutObjectStatementBuilder =
IamStatement.builder()
.effect(IamEffect.ALLOW)
.addAction("s3:PutObject")
.addAction("s3:DeleteObject");
writeLocations.forEach(
location -> {
URI uri = URI.create(location);
allowPutObjectStatementBuilder.addResource(
IamResource.create(getS3UriWithArn(arnPrefix, uri)));
});
policyBuilder.addStatement(allowPutObjectStatementBuilder.build());
}
if (!bucketListStatmentBuilder.isEmpty()) {
bucketListStatmentBuilder
.values()
.forEach(statementBuilder -> policyBuilder.addStatement(statementBuilder.build()));
} else {
// add list privilege with 0 resources
policyBuilder.addStatement(
IamStatement.builder().effect(IamEffect.ALLOW).addAction("s3:ListBucket").build());
}
bucketGetLocationStatmentBuilder
.values()
.forEach(statementBuilder -> policyBuilder.addStatement(statementBuilder.build()));
return policyBuilder.addStatement(allowGetObjectStatementBuilder.build()).build();
}