我想知道是否有人对AWS IoT关于策略处理的最佳实践有所了解,例如,我们可能有两种不同的情况:
案例1: 调用lambda(identity-id as param),它会动态创建策略,然后将策略附加到身份ID。该策略将包含硬编码的名称,例如:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:us-west-2:XXXX:client/hardcodedClient1"
},
{
"Effect": "Allow",
"Action": [
"iot:Publish",
"iot:Subscribe",
"iot:Receive"
],
"Resource": [
"arn:aws:iot:us-west-2:XXXX:topic/$aws/things/THINGNAME1/*",
"arn:aws:iot:us-west-2:XXXX:topicfilter/$aws/things/THINGNAME1/*"
]
}
]
}
案例2:通过使用${iot:ClientId}
,${iot:ThingName}
等政策变量,我们可以将一个政策附加到所有congito-identity-users;
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:us-west-2:XXXX:client/${iot:ClientId}"
},
{
"Effect": "Allow",
"Action": [
"iot:Publish",
"iot:Subscribe",
"iot:Receive"
],
"Resource": [
"arn:aws:iot:us-west-2:XXXX:topic/$aws/things/${iot:Connection.Thing.ThingName}/*",
"arn:aws:iot:us-west-2:XXXX:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/*"
]
}
]
}
所以,问题是。哪个是最佳实践,但是它们都是安全的,因为Cognito用户只能与自己的设备进行交互?
答案 0 :(得分:0)
使用策略变量的案例2是推荐的方法。
它减少了要处理的策略数量,并使它们保持有意义和可重用。从好的方面来说,每次不使用lambda和创建策略会节省一些额外的资金和时间!
就安全性而言,它与策略中的策略变量无关,它最终是什么操作策略允许或拒绝作为策略变量在运行时根据谁尝试执行操作而在之后它与您的硬编码政策相同。
答案 1 :(得分:0)
情况2更好。您还可以使用具有适当IAM策略的Cognito联合池来实现身份验证机制,并在IoT策略中使用具有适当权限的${cognito-identity.amazonaws.com:sub}
变量(只记得将此策略附加到您的Cognito identityId
)。
如果您的客户端是通过浏览器连接的,则最好不要使用iot:ClientId
,因为clientId必须是唯一的,否则用户将无法打开多个浏览器选项卡。