亚马逊AWS官方博客
如何把设备安全的接入AWS IoT(二)
1.简介
本系列文章前面一篇介绍了 AWS IoT 支持的所有协议,认证和授权方式的原理和细节,以及其分别所适应的场景。并介绍了设备使用 IAM 身份认证接入 AWS IoT 的参考步骤和参考代码。接下来本文介绍设备使用 Amazon Cognito 身份认证方式接入 AWS IoT 的参考步骤和参考代码。
在进行下一步之前,请确保已执行完本系列文档第一篇的第4章,准备工作。
2. 设备使用 Amazon Cognito 身份认证方式接入
您可以使用第三方的身份,如 Google,Facebook,OIDC,SAML 等,或者用户开发的自定义的身份,在 Cognito 身份池中交换得到 Cognito 身份,然后使用 Cognito 身份来认证设备。Cognito 身份的鉴权方式则比较复杂,首先 Cognito 身份池会为经过认证的身份配置一个 Role,进而使用 Role 的 IAM Policy 对请求进行鉴权,另外,Cognito 身份也会在 AWS IoT 中绑定一个 IoT Policy,这个 IoT Policy 也会对请求进行鉴权。实际上,Cognito 身份的最终权限是身份池 Role的IAM policy 与 Cognito 身份的 IoT Policy 的交集。Cognito 身份可以用于 mobile 场景的移动端认证。
注:由于 IoT Policy 支持 IoT 上下文的多种策略变量,通常建议的做法是,在 IAM Policy给一个比较大的权限,然后在 IoT Policy 中通过策略变量来实现精细化的权限管理。
设备使用 Amazon Cognito 身份认证的流程示意图:
2.1 创建 Amazon Cognito 身份池和相关权限
首先,创建 Cognito 身份池
把 IdentityPoolId 配置到环境变量中。
创建经过认证的 Cognito 身份代入的角色。
绑定角色到 Cognito 身份池
给角色绑定可以 Attach IoT Policy 的权限
设备在使用 Cognito 身份接入 IoT 的时候,还需要为其绑定一个 IoT Policy。 通常情况下,考虑权限的安全,这一步需要在后端的服务来执行,这里为了简化,由设备来为自己绑定 IoT Policy,生产系统中应该禁止使用这种方法。
把 IAM Policy 绑定到角色。
Cognito 身份池支持多种身份认证的方式,如 Google,Facebook,Amazon,OID C等,这里使用了开发人员验证的身份来获取身份。
2.2 创建并部署开发人员验证的身份程序
创建一个 IAM 用户,developerIdpUser。这个用户用来给 developer provider 程序提供权限。
developer provider 程序的作用是给设备分配身份,并且调用 Cognito 的 GetOpenIdTokenForDeveloperIdentity 接口返回 Cognito 身份池的身份和令牌。
创建策略,并把策略绑定到 developerIdpUser 用户
为 developerIdpUser 用户创建 Access Key
记录下 AccessKeyId 和 SecretAccessKey
生成 developer provider 程序。
运行 developer_provider.py
developer_provider.py 在 http://0.0.0.0:8383/ 接受请求,并返回 Cognito 身份池的身份信息。
打开一个新的 SSH 窗口,定位到 awsIoTAccessDemo 目录。
2.3 设备使用 HTTP 协议接入
通过 Cognito 方式认证的设备,需要 IAM Policy 和 IoT Policy 同时授权。
为设备创建 IAM Policy,并将其绑定到 Cognito 身份池的角色。
创建 IoT Policy
生成设备模拟程序。
运行设备模拟程序发送消息。
在本系列文章第一篇的第4.3章节打开的控制台中查看 AWS IoT 收到的消息。
2.4 设备使用 MQTT OVER WEBSOCKET 协议接入
通过 Cognito 方式认证的设备,需要 IAM Policy 和 IoT Policy 同时授权。
为设备创建 IAM Policy,并将其绑定到 Cognito 角色。
创建 IoT Policy。
生成设备模拟程序。
运行设备模拟程序。
此设备模拟程序会一直运行,接受输入的数据,发送到 AWS IoT Core,同时也订阅自己发送消息的 topic。
输入要发送到 AWS IoT 的消息,如 “data from device cognito websocket.”,设备会接收到自己发送的这个消息。同时,在本系列文章第一篇的 4.3 章节中打开的控制台中也可以看到此消息。
执行 Ctrl+C 停止程序。