如何使用 AWS STS 为 s3 中的文件的特定资源创建只读和只写令牌
how to create read only and write only token for specific resource for a file in s3 using AWS STS
我必须为 S3 中的文件生成只读和只写令牌。
到目前为止我尝试过的:
- 创建一个对引用中的存储桶具有读写权限的 IAM 角色
- 创建 STS 客户端
- 承担 STS 客户端在步骤 #1 中创建的 IAM 角色
- 使用 sts 客户端生成凭据
这样做的是
- 允许用户使用令牌访问 S3 中的文件
- 但此访问权限不限于只读或只写
- 此外,如果 IAM 角色可以访问更多存储桶,令牌将访问所有存储桶
创建STS客户端
AWSSecurityTokenServiceClient sts_client = (AWSSecurityTokenServiceClient) AWSSecurityTokenServiceClientBuilder.standard()
.withRegion(Regions.DEFAULT_REGION).build();
创建担任角色请求
AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
.withRoleArn("arn:aws:iam::123456789123:role/iam-role-name")
.withDurationSeconds(7200)
.withRoleSessionName("session-role-"+System.currentTimeMillis());
生成令牌请求
GetSessionTokenRequest session_token_request = new GetSessionTokenRequest();
生成代币
GetSessionTokenResult session_token_result = sts_client.getSessionToken(session_token_request);
创建凭据
Credentials session_creds = session_token_result.getCredentials();
创建基本凭据
BasicSessionCredentials sessionCredentials = new BasicSessionCredentials(
session_creds.getAccessKeyId(),
session_creds.getSecretAccessKey(),
session_creds.getSessionToken());
期望值
- 能够生成只读和只写令牌
- 能够生成特定于路径的标记
- 令牌仅限于引用中的资源,而不是 IAM 角色中附加的所有存储桶
be able to generate read only and write only tokens
您需要为 read-only 和 write-only 定义不同的角色。恕我直言,您不能仅使用一个角色来构建您的用例。
be able to generate path specific tokens
该角色可以包含对特定 S3 密钥(文件名)的引用,例如:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:Get*", "s3:List*"],
"Resource": [
"arn:aws:s3:::MyExampleBucket",
"arn:aws:s3:::MyExampleBucket/mypath/myfile.txt"
]
}
]
}
我找到了解决方法。
- 创建一个 STS 客户端并承担一个给定的角色,并有权访问所有必需的存储桶
- 创建一个内联策略并在获取令牌之前附加到 STS 客户端
- 使用 STS 客户端进行 getSessionToken 调用
所做的是:
- 授予对特定资源的访问权限,该资源受在线策略中给出的路径限制
- 它还限制了内嵌策略中提到的读取或写入访问权限
我必须为 S3 中的文件生成只读和只写令牌。
到目前为止我尝试过的:
- 创建一个对引用中的存储桶具有读写权限的 IAM 角色
- 创建 STS 客户端
- 承担 STS 客户端在步骤 #1 中创建的 IAM 角色
- 使用 sts 客户端生成凭据
这样做的是
- 允许用户使用令牌访问 S3 中的文件
- 但此访问权限不限于只读或只写
- 此外,如果 IAM 角色可以访问更多存储桶,令牌将访问所有存储桶
创建STS客户端
AWSSecurityTokenServiceClient sts_client = (AWSSecurityTokenServiceClient) AWSSecurityTokenServiceClientBuilder.standard()
.withRegion(Regions.DEFAULT_REGION).build();
创建担任角色请求
AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
.withRoleArn("arn:aws:iam::123456789123:role/iam-role-name")
.withDurationSeconds(7200)
.withRoleSessionName("session-role-"+System.currentTimeMillis());
生成令牌请求
GetSessionTokenRequest session_token_request = new GetSessionTokenRequest();
生成代币
GetSessionTokenResult session_token_result = sts_client.getSessionToken(session_token_request);
创建凭据
Credentials session_creds = session_token_result.getCredentials();
创建基本凭据
BasicSessionCredentials sessionCredentials = new BasicSessionCredentials(
session_creds.getAccessKeyId(),
session_creds.getSecretAccessKey(),
session_creds.getSessionToken());
期望值
- 能够生成只读和只写令牌
- 能够生成特定于路径的标记
- 令牌仅限于引用中的资源,而不是 IAM 角色中附加的所有存储桶
be able to generate read only and write only tokens
您需要为 read-only 和 write-only 定义不同的角色。恕我直言,您不能仅使用一个角色来构建您的用例。
be able to generate path specific tokens
该角色可以包含对特定 S3 密钥(文件名)的引用,例如:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:Get*", "s3:List*"],
"Resource": [
"arn:aws:s3:::MyExampleBucket",
"arn:aws:s3:::MyExampleBucket/mypath/myfile.txt"
]
}
]
}
我找到了解决方法。
- 创建一个 STS 客户端并承担一个给定的角色,并有权访问所有必需的存储桶
- 创建一个内联策略并在获取令牌之前附加到 STS 客户端
- 使用 STS 客户端进行 getSessionToken 调用
所做的是:
- 授予对特定资源的访问权限,该资源受在线策略中给出的路径限制
- 它还限制了内嵌策略中提到的读取或写入访问权限