具有动态策略的 AWS STS Tem 凭证



>我正在尝试在lambda函数中运行一些代码,该函数将发出一个签名URL,该URL使用一组具有自定义策略的临时凭证进行签名。

基本思想是,签名允许用户连接到 AWS IOT,但只能使用特定的客户端 ID,并且对订阅主题和收到的消息有限制。

如果我使用本机分配给 Lambda 函数的凭证执行签名(即在 Lambda 函数假定它们之前,代码将起作用(。但是,在 Lambda 函数中运行它确实会生成一个代入角色并生成一组临时凭证,但生成的签名不会建立与 AWS IOT 终端节点的连接。

基本代码为:

AWSSecurityTokenService tokenService = 
AWSSecurityTokenServiceClientBuilder.standard()
.withCredentials(new EnvironmentVariableCredentialsProvider())
.build();
AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest();
assumeRoleRequest.setRoleSessionName(UidGenerator.generateId(16));
assumeRoleRequest.setRoleArn("arn:aws:iam::xxxxxxxxxxx:role/websocket_signer");
assumeRoleRequest.setDurationSeconds(60 * 60);
assumeRoleRequest.setPolicy(policy);
AssumeRoleResult assumeRoleResult = tokenService.assumeRole(assumeRoleRequest);
// Create signed url
WebSocketUrlSigner signer = new WebSocketUrlSigner(
this.request.getStage(),
assumeRoleResult.getCredentials().getAccessKeyId(),
assumeRoleResult.getCredentials().getSecretAccessKey());

我尝试承担的角色websocket_signer没有本地分配任何策略,但确实与arn:aws:sts::xxxxxxxxx:assumed-role/lambda_role/lambda_function_name建立了信任关系。

分配给 Lambda 函数的角色(在其代入之前(具有以下信任关系:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": [
"lambda.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}

为了消除策略的任何潜在问题,我将以下策略动态传递给承担的角色(应该与现有的角色策略合并,这没什么(:

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect",
"iot:Subscribe",
"iot:Receive"
],
"Resource": [
"*"
]
}
]
}

我最终应该得到一个签名的URL,它可以使用任何客户端ID连接到任何主题并接收任何消息。函数中没有例外,AWS 正确返回所有内容,所以我一定配置错误。

角色的权限和传递的策略是相交的,而不是合并的: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_assumerole.html

如果起始角色没有任何权限,则 aasumed 角色也是如此。

最新更新