OceaBase开发者大会落地上海!4月20日共同探索数据库前沿趋势!报名戳 了解详情
写点什么

IOT 终端设备如何安全地往 S3 传输文件

  • 2019-10-25
  • 本文字数:7508 字

    阅读完需:约 25 分钟

IOT 终端设备如何安全地往 S3 传输文件

前序

物联网设备通常使用 X.509 证书通过 Mqtt 协议连接到 AWS IOT 平台,通过 Pub/Sub 的方式进行交互。随着硬件设备的功能愈加强大,更多非控制的数据需要与云端进行交互。例如需要把更新包/插件从 S3 下载到硬件端,或者把视频数据从 IP Camera 传输到 S3 进行存储,这些场景下终端设备需要跟 S3 进行交互。与 Mqtt 使用 X.509 证书进行身份认证不同,S3(包括其他的 AWS 服务)使用Signature Version 4,也就是 Access Key 和 Secret Access Key 的方式进行身份认证(具体的签名过程已经在 AWSCLI 和 SDK 底层封装实现,只需要提供 Access Key 和 Secret Access Key 即可)。基于安全的考虑,AWS 建议通过 STS 服务向用户群体颁发临时凭证(包含 Access Key、Secret Access Key 和 Session Token),在短时间内向合法用户授予细粒度的权限,从而保证授权处在可控的范围。为了保证用户的合法性,我们往往需要通过登陆等逻辑模块进行身份验证,通过验证后再向用户颁发临时凭证,这个流程大概如下图所示:



上述方案看起来不错,提供足够的安全性。但在物联网场景中,终端设备往往是百万级别甚至是千万级别的,客户需要搭建集群支持登陆模块庞大的访问量。既然 AWS 把 IOT 打包成一个托管服务,那 AWS 能否把认证和分发临时凭证添加到 IOT 功能模块中呢?


答案是肯定的,这也是本文将要介绍的功能。在物联网场景中一个天然的优势是,大部分的硬件设备在出厂时内嵌了 X.509 证书,X.509 证书在很大程度上能够作为合法凭证。AWS IOT 最新推出的特性,能够复用这套身份检验方式,客户不再需要搭建登陆等组件进行合法性认证,就能够获取临时凭证。具体做法是设备端发起一个 Https 连接请求临时凭证,把 X.509 证书作为 Https 建立 SSL 通道的客户端证书来做身份验证,具体流程如下图所示。除了 S3 外,IOT 终端设备也可以通过这种方法获取其他基于 Signature Version 4 的 AWS 服务的权限。本文将会对这项功能特性的配置流程进行介绍。

概述

如下图所示,配置这项功能需要以下四个步骤:


(1) 步骤一:配置终端设备获取临时凭证的连接。在终端设备上配置必要的证书和证书链,并通过 CLI 工具得到当前 AWS 账户获取临时凭证的终端节点。


(2) 步骤二:定义临时凭证的权限。在 IAM Role 配置信任关系,并赋予相应访问权限。


(3) 步骤三:实现 AWS IOT 组件与 IAM Role 的关联。


(4) 步骤四:进一步精细化权限控制。

设置步骤

一.设备端的准备工作

设备通过 Https 在 AWS IOT 的 443 端口上获取临时凭证。在建立 Https 时,您需要把以下证书加载到设备端:


(1)X.509 证书以及私钥。这两个是 Mqtt 建立通讯时的客户端证书文件。如果之前通过 IOT Mqtt 建立通讯,这两个文件已经存在于设备端。


(2)RSA Amazon Root CA 1 VeriSign Class 3 Public Primary G5 根 CA 证书。这两个文件是建立 https 时,AWS 端的证书链文件。为了防止设备端环境不信任 AWS 的证书链造成 SSL 通道建立不成功,需要把这两个文件放置在设备端。


(3)查询 AWS Account 获取临时凭证的终端节点。需要注意的是,该终端节点不同于 IOT 终端节点,且暂时不支持通过 AWS 控制台进行获取。我们可以通过 AWSCLI 工具的 describe-endpoint CLI 命令进行获取,命令如下:


aws iot describe-endpoint –endpoint-type iot:CredentialProvider —region ap-southeast-1


需要注意的是,必须指定参数 endpoint-typeiot:CredentialProvider ,否则无法获取临时凭证的 endpoint。


返回的 endpoint 格式如下所示:


.credentials.iot..amazonaws.com


最终访问的 URL 为:


https://.credentials.iot_..amazonaws.com:443/role-aliases/_/credentials

二.AWS IAM Service 的准备工作

设备端获取的临时凭证的权限在 IAM Role 中定义,我们需要创建一个新的 IAM Role,并把设备端需要获取的权限(例如从 S3 下载文件)赋予该角色。这部分的工作有两点需要注意:


(1)创建完 IAM Role 后,需要把该 IAM Role 的信任关系编辑修改为以下内容:


Json


{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "credentials.iot.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
复制代码


可以注意到,上述信任关系与直接把 IOT 服务作为受信任实体有所不同。当前无法在控制台直接选择 credentials.iot 作为受信任实体,所以需要在创建 IAM Role 后把信任关系修改为上述内容。该信任关系表明:信任实体 credentials.iot 可以切换到该 IAM Role,获取该 IAM Role 所拥有的权限。


(2)把设备端需要获取的权限策略 Policy 附加给 IAM Role。例如:如果您希望设备端能够对 vincent-iot 这个 S3 Bucket 下的文件进行操作,IAM Policy 的内容如下所示:


Json


{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:HeadBucket",
"s3:ListObjects"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::vincent-iot/*"
}
]
}
复制代码


您可能注意到,上述 IAM Policy 的权限对于每个设备提供的权限是一样的,权限粒度不够精细。如果希望对每个设备端的权限进行更细粒度的控制,例如每个设备只能访问其在 S3 某一个目录下的文件,可以在上述 Policy 中通过添加 IOT 策略变量来实现。具体我们会在第四部分加以详述。

三.AWS IOT Service 的准备工作

Https 获取临时凭证的过程中,AWS 通过 X.509 证书来做身份识别。每个 X.509 证书对应 AWS IOT 平台的一个 Credential。要完成 Credential 跟 IAM Role 的关联,需要做以下两步关键操作:


(1)创建角色别名。角色别名是 AWS IOT 新增加的一个组件,用于把 IAM Role 映射到 AWS IOT 组件。我们可以在 AWS IOT 控制台创建一个角色别名,在角色别名中指定第二部分中创建的 IAM Role 作为目标,如下图所示:



(my_iot_role_alias 为角色别名;my-iot-role 为第二部分 IAM Role 的名称)


我们留意到,请求临时凭证的 URL 的相对路径中,包含了角色别名__。因此可以看到,IAM Role 的 ARN 并没有硬编码到 URL 中。当需要修改 IAM Role 时,我们只需要在角色别名中修改其所指向的 IAM Role ARN 即可,无需修改设备端的 URL。角色别名起到解耦的作用。


另外需要注意的是,临时凭证的有效期是在创建角色别名时设定的,默认为 900 秒。AWS 控制台暂时不提供有效期的选项,但我们可以在 AWSCLI 创建角色别名时通过参数 credentialDurationInSeconds 进行指定,如下所示:


aws iot create-role-alias –role-alias my_iot_role_alias –role-arn arn:aws:iam::123456789012:role/my-iot-role –credential-duration-seconds 3600 –region ap-southeast-1


(2)在每个设备 Credential attach 的 IOT Policy 中增加 iot:AssumeRoleWithCertificate 权限,使设备拥有代入角色别名的权限。IOT Policy 的内容如下所示:


Json


{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:AssumeRoleWithCertificate",
"Resource": "arn:aws:iot:ap-southeast-1:123456789012:rolealias/my_iot_role_alias"
}
]
}
复制代码


(您需要把上述 Resource 中的 ARN 替换成您角色别名的 ARN)


经过上述的设置,终端设备就能通过 Https 获取临时凭证。我们用以下 wget 命令发起访问,会获得临时凭证的返回:


wget –private-key=/home/ubuntu/iotgetaksk/2ffd3c6424-private.pem.key –certificate=/home/ubuntu/iotgetaksk/2ffd3c6424-certificate.pem.crt –ca-directory=/home/ubuntu/iotgetaksk/AmazonRootCA1.cer –debug https://abcdefghijklm.credentials.iot.ap-southeast-1.amazonaws.com:443/role-aliases/my_iot_role_alias/credentials

四.权限的细粒度考虑

在第二部分中,我们提到该 IAM Policy 给每个设备提供相同权限,存在一定的安全隐患。我们能够在 IAM Policy 中嵌入 IOT 策略变量为每个设备提供更细粒度的权限,例如我们可以把第二部分的 IAM Policy 改为如下:


Json


{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:HeadBucket",
"s3:ListObjects"
],
"Resource": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::vincent-iot/${ iot:certificateId}/*"
}
]
}
复制代码


在上述 IAM Policy 中,我们以_${ iot:certificateId}_策略变量作为 S3 Resource 的一部分。当请求临时凭证时,AWS 会使用实际值替换该变量,从而做到每个临时凭证精细化权限控制。


这个特性当前支持三种策略变量,分别:


· ${iot:thingName} 事物名称


· ${iot:thingType} 事物类型


· ${iot:certificateId} X.509 证书 ID


其中{iot:thingName}和 ${iot:thingType}与前者稍有不同:


(1)如果在 IAM Policy 中使用了{iot:thingType},我们必须在 Https 的 request Header 中添加 x-amzn-iot-thingname 请求标头来传递事物名称 thing name,否则无法在 IAM Policy 中使用事物变量{iot:thingType}。采用这种操作是因为当前一个 X.509 证书能够附加多个 thing,因此我们必须在 Https 请求标头中指定具体的 thing name,AWS 才能获取具体对应的{iot:thingType}。这也说明了,当前通过 X.509 证书获取临时凭证这种做法,一个临时凭证只能精细化控制对某一个 thing 的权限分发。


(2)如果在 IAM Policy 中指定了{iot:thingType},但在 Https Request 中没有添加 x-amzn-iot-thingname 标头,AWS 会正常给您返回临时凭证,但我们会发现该临时凭证没有任何权限。


(3)当在 Https Request 中添加 x-amzn-iot-thingname 标头后,AWS 会检查当前的 X.509 证书是否已经附加相应的 thing。如果发现附加关系不正确,AWS 会拒绝返回临时凭证,返回 403,提示“Invalid thing name passed”。


当您一切准备就绪后,您可以尝试通过以下 wget 命令发起访问:


wget –header=”x-amzn-iot-thingname: bulbthing” –private-key=/home/ubuntu/iotgetaksk/2ffd3c6424-private.pem.key –certificate=/home/ubuntu/iotgetaksk/2ffd3c6424-certificate.pem.crt –ca-directory=/home/ubuntu/iotgetaksk/AmazonRootCA1.cer –debug https://abcdefghijklm.credentials.iot.ap-southeast-1.amazonaws.com:443/role-aliases/my_iot_role_alias/credentials


再次提醒,只有在 IAM Policy 中使用了{iot:thingType}策略变量才需要在 Https 请求中添加 x-amzn-iot-thingname 请求标头,对于 ${iot:certificateId}是不需要的。

结束语

Mqtt 与其他 AWS 服务的身份认证方式存在差异。为了减少与两套体系交互时重复的身份认证工作,AWS 推出本文介绍的功能,复用 X.509 证书,减少客户的开发量和成本。目前,该功能在 AWS 海外具有 IOT 服务的区域可用,但在由光环新网运营的北京区域暂时不可用。


作者介绍:


邱越俊


亚马逊 AWS 解决方案架构师,熟悉 AWS IOT 平台的开发和使用,擅长数据分析、IOT 架构和管理, 具有丰富的解决客户实际问题的经验。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/iot-device-secure-s3-transfer-doc/


2019-10-25 08:00626

评论

发布
暂无评论
发现更多内容

开源一夏 | 对于jQuery选择器和动画效果停止动画的实战心得【前端jQuery框架】

恒山其若陋兮

开源 8月月更

Sass.vs.Less | 简介

Jason199

SaaS 8月月更

深入了解 Spring篇之BeanDefinition结构

邱学喆

对象初始化 BeanDefinition 对象创建 属性注入 对象检索

rocketmq整合SpringCloudStream

急需上岸的小谢

8月月更

详解中断系统

timerring

8月月更

Go-Excelize API源码阅读(三)——OpenReader()

Regan Yue

Go 开源 源码分析 8月日更 8月月更

【LeetCode】算术三元组的数目Java题解

Albert

LeetCode 8月月更

SpringBoot实战:国际化组件MessageSource的执行逻辑与源码

看山

源码 spring源码 MessageSource Spring原理 SpringBoot实战

数据治理(二):数据治理功能方面

Lansonli

大数据 数据治理 8月月更

2022-Java后端工程师面试指南-(消息队列)

自然

Rocket Rabbit MQ 8月月更

企业文化如何治好“企业内耗”?

涛哥 数字产品和业务架构

企业文化 企业架构

Ingress Nginx 接连披露高危安全漏洞,是否有更好的选择?

阿里巴巴云原生

阿里云 Kubernetes 云原生 ingress

全面了解Java中的15种锁概念及机制!

TimeFriends

8月月更

模块九(电商秒杀系统)

Geek_701557

《编程的原则》读书笔记(一):编程的前提和准则

Chares

软件工程 软件开发 程序开发 编程原理

Java+EasyExcel实现文件导入导出

Bug终结者

Java 8月月更

低成本、大容量、高交互…Polkadot 引领 GameFi 实现新突破

One Block Community

区块链

2022-Java后端工程师面试指南-(SSM)

自然

spring cloud stream Java core 8月月更

MySQL 指令

武师叔

8月月更

一文带你搞懂OAuth2.0

海风极客

Go 后端 OAuth 2.0

leetcode 232. Implement Queue using Stacks 用栈实现队列(简单)

okokabcd

LeetCode 数据结构与算法 栈和队列

Python 教程之输入输出(7)—— 如何在 Python 中不使用换行符进行打印?

海拥(haiyong.site)

Python 8月月更

OpenHarmony像素单位

坚果

开源 OpenHarmony 8月月更

Python爬虫eval混淆,爬虫进阶实战系列

梦想橡皮擦

Python 爬虫 8月月更

关于架构的认知

yuexin_tech

架构

即将开幕!阿里云飞天技术峰会邀您一同探秘云原生最佳实践

阿里巴巴云原生

阿里云 云原生 阿里云飞天技术峰会

Spring Security OAuth实现GitHub快捷登录

阿提说说

Spring Security OAuth

2022-Java后端工程师面试指南-(计算机网络)

自然

网络 8月月更

毕业总结

Geek_701557

Spring(四、配置数据源)

开源 MySQ Druid 8月月更

深入浅出边缘云 | 6. 监控与遥测

俞凡

架构 边缘计算 网络 深入浅出边缘云

IOT 终端设备如何安全地往 S3 传输文件_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章