本文档介绍在 Google Cloud 上管理和运行物联网 (IoT) 后端时的安全最佳做法。在 IoT 解决方案中,IoT 后端将边缘设备连接到其他资源。本文档重点介绍以下 IoT 后端:Message Queueing Telemetry Transport (MQTT) 代理和 IoT 平台。
本文档是系列文档中的一篇,该系列介绍了 Google Cloud 上的 IoT 架构以及如何从 IoT Core 进行迁移。本系列中的其他文档包括以下内容:
- Google Cloud 上的关联设备架构概览
- Google Cloud 上的独立 MQTT 代理架构
- Google Cloud 上的 IoT 平台产品架构
- 在 Google Cloud 上运行 IoT 后端的最佳实践(本文档)
- 将 Pub/Sub 架构上的设备迁移到 Google Cloud
- 自动预配和配置边缘与裸机系统和服务器的最佳做法
本文档提供了预配和管理设备凭据、对边缘设备进行身份验证和访问以及允许 IoT 边缘设备访问 Google Cloud 资源的最佳做法。
IoT 架构
IoT 架构包含可让您预配和管理设备凭据、对边缘设备进行身份验证和访问权限控制以及让边缘设备访问 Google Cloud 资源的服务。本文档讨论了两个 IoT 后端架构:一个使用 MQTT 代理,另一个使用 IoT 平台。这两个后端之间的主要安全差异是设备身份和设备管理。IoT 平台作为其系统的一部分提供这些功能,而 MQTT 代理要求您提供这些功能。
下图描述了 IoT 架构。
该架构显示了完成以下三个过程所需的服务:
证书预配,这是准备边缘设备以进行配置时必须完成的过程。
身份验证和授权,包括边缘设备和 MQTT 代理或 IoT 平台用于彼此进行身份验证的身份验证方案。
边缘设备与 Google Cloud 服务之间的连接,这些是边缘设备为连接到云资源以及上传或下载数据而完成的任务。
本文档主要介绍预配和身份验证的安全最佳做法。
该架构结合使用了以下服务和功能:
- 边缘设备(如医疗设备),部署在您的环境边缘且地理位置靠近您要处理的数据。边缘设备与您的 IoT 后端双向连接,这意味着它们可以向 IoT 后端发送消息以及接收来自 IoT 后端的消息。
- IoT 后端,可以是 MQTT 代理或 IoT 平台。
- MQTT 代理使用 MQTT 协议提供安全接口以供边缘设备连接。MQTT 代理没有设备身份和设备管理功能,需依赖外部系统来提供。
- IoT 平台是一个云应用,边缘设备与它连接和通信。IoT 平台使用 MQTT 协议提供安全接口以供边缘设备连接。每个 IoT 平台都有自己的安全实现,该实现确定如何对边缘设备进行身份验证和授权,以及如何管理设备身份。
- 托管所有边缘设备的证书的中央证书存储区。
- 边缘设备必须访问的云资源。
预配边缘设备
连接边缘设备与后端工作负载之前,您必须为边缘设备预配证书。有两种主要场景决定证书的预配方式:
如果您的解决方案基于商业通用设备,您可以在购买设备后完全控制预配过程。
如果您使用定制设备,则初始预配过程会在设备制造期间进行,您必须将该预配过程与供应商和制造商整合。
在任一种场景中,您都必须使用链接到根证书授权机构 (CA) 的信任链来创建设备证书。这些证书会对设备身份进行身份验证,并有助于确保在设备上执行的操作和修改由可信的操作者执行。使用 Certificate Authority Service 等 CA 来完成以下任务:
- 以安全的方式生成并存储根 CA 证书。
- 生成并存储从属 CA 证书,以便在必要时为设备证书签名。
- 请求设备证书。
- 配置从属 CA 权限并分发给供应商和制造商。
- 撤消设备证书(如果您不再需要这些证书,或者您怀疑设备已遭破解)。
如需预配设备证书,您必须完成以下任务:
使用设备支持的基于硬件的安全解决方案(例如安全元件 (SE))或硬件安全模块 (HSM)。根据设计,SE 或 HSM 将私钥存储在本地,并且绝不会将私钥对外公开。如果您没有使用基于硬件的安全解决方案来生成公钥/私钥对,请使用 CA 生成密钥。如需了解详情,请参阅使用自动生成的密钥。
签署并生成设备证书。生成公钥/私钥对后,下载公钥,创建证书签名请求 (CSR),并将 CSR 发送到 CA 以进行签名。CA 会生成与根 CA 关联的设备证书。如需了解详情,请参阅使用 CSR。使用自动生成的密钥时,您可以直接向 CA 请求设备证书。
在边缘设备上安装签名设备证书,并将证书发送到 Secret Manager 等中央证书库。
如需了解详情,请参阅如何使用 Google Cloud CA Service (PDF) 部署安全可靠的公钥基础架构。
如需了解其他预配最佳做法,请参阅自动预配和配置边缘与裸机系统和服务器的最佳做法。
使用三种类型的证书来帮助保护 IoT 解决方案:
根 CA 证书提供系统中所有其他证书的信任链根。后端工作负载使用根证书来验证客户端证书,边缘设备使用根证书来验证服务器证书。您必须将根证书分发给 IoT 后端和边缘设备。
服务器证书用于保护 IoT 后端公开的端点。您拥有您的端点需要支持的不同加密算法的服务器证书。服务器证书与根 CA 相关联。Secret Manager 同时管理和存储服务器证书的私有和公开部分。您必须使用服务器证书及其相应的私钥来配置 IoT 后端。
客户端证书用于标识边缘设备。每个边缘设备至少有一个客户端证书,这意味着您拥有的证书数量会随着您环境中的边缘设备数量增加而增加。客户端证书与根 CA 相关联。您必须将客户端证书分配给边缘设备和 IoT 后端。
使用 HSM 或 SE 生成设备证书的过程
下图展示了如何在使用 HSM 或 SE 时预配设备证书。
在此图中,会发生以下步骤:
- 边缘设备在硬件中生成公钥对。
- 下载公钥并为其创建证书签名请求 (CSR)。
- 将 CSR 发送到 CA 以请求证书。
- CA 完成以下操作:
- 为证书签名。
- 将设备证书返回给预配者。
- 预配者完成以下操作:
- 将证书发送到边缘设备。
- 将证书存储在中央证书存储区中。
- 边缘设备将证书存储在安全的位置。
使用 CA 生成设备证书的过程
下图显示了使用 CA 时如何预配设备证书。
在此图中,会发生以下步骤:
- 您生成一个 CSR,并将其发送给 CA 以请求证书。
- CA 完成以下操作:
- 生成公钥和公钥对,然后对公钥进行签名。
- 将设备证书和私钥返回到预配者。
- 您需要完成以下操作:
- 将证书和私钥发送到边缘设备。
- 将证书和私钥存储在中央证书存储区中。
- 边缘设备将证书存储在安全的位置。
设备身份的最佳做法
本部分介绍设备身份的最佳做法。
将身份提供方与 MQTT 代理搭配使用
MQTT 代理使用通过插件、数据库和文件提供的设备凭据对边缘设备进行身份验证。如需以可扩缩的方式系统地管理设备身份,请使用身份提供方 (IdP)。IdP 管理所有设备的身份和凭据,并充当设备身份的主要可靠来源。
如需在 MQTT 代理中让设备身份保持最新,请实现一个系统专用集成层。如需详细了解如何管理设备凭据,请参阅预配边缘设备。
使用 IoT 平台的数字身份作为可靠来源
IoT 平台具有用于管理设备身份和设备凭据的安全功能,以及对尝试访问该平台的设备进行身份验证和授权。这些安全功能有助于确保只有获得授权的设备才能访问 IoT 平台并帮助确保数据完整性。
验证 IoT 平台管理的设备身份是否代表 IoT 平台管理的所有设备的主要真实来源。IoT 解决方案中需要设备身份信息的其他组件应依赖 IoT 平台的安全系统。IoT 平台授予对设备的访问权限,并在整个 IoT 解决方案中传播任何安全更改。
网络连接的最佳做法
确保网络连接安全非常重要,原因如下:
- 安全的网络有助于确保设备连接到正确的后端。例如,安全的网络可以防止 DNS 仿冒(一种尝试使设备连接到由攻击者控制的恶意后端的攻击)。
- 安全的网络有助于确保第三方无法读取您的数据流量。例如,安全的网络可以防止中间人攻击(攻击者读取您的设备与后端之间的流量)。
使用传输层安全协议 (TLS) 保护边缘设备与后端工作负载之间的网络通信。
使用 mTLS 扩展 TLS 以实现双向身份验证方案,使得连接的双方都能够确定彼此的身份。
如需了解如何使用 TLS,请参阅 Google Cloud 上的独立 MQTT 代理架构和 Google Cloud 上的 IoT 平台产品架构。
MQTT 代理的证书管理的最佳做法
本部分介绍使用 MQTT 代理时管理证书的最佳做法。
集中存储证书
在一个位置集中存储和管理服务器证书及设备证书。具体来说,请确保您实施了以下控制措施:
- 包含所有设备及其证书以及服务器端点及其证书的清单。
- 拥有有关证书的其他信息,例如证书的有效性。
- 能够为设备添加和移除证书,以便设备可以使用新证书进行连接。
- 拥有对中央证书存储区的访问权限,可限制后端中的不同角色对证书执行的操作。
使用 Secret 存储和管理解决方案,例如 Secret Manager 或 HashiCorp Vault。Secret Manager 允许您对设备凭据执行版本控制、更新和失效操作,以及管理凭据的访问权限政策。
对于 IoT 平台,请使用 Secret Manager API 访问权限实现对凭据的访问。
保护边缘设备上的证书
如需在边缘设备上存储证书和密钥,请使用本地可信执行环境或证书存储区来保护凭据并阻止未经授权的访问。如果您需要在自己的设备上存储 Secret 材料,请使用 Flash 加密等技术对材料进行加密,并将材料存储在防篡改元素中,以防止未经授权的数据提取。
使中央证书存储区与 MQTT 代理证书存储区同步
MQTT 代理必须访问客户端证书以进行基于证书的身份验证,因此您必须同步 MQTT 代理的证书存储区与中央证书存储区。验证中央证书存储区中的更改(例如添加、更新和删除证书)是否与 MQTT 代理证书存储区同步。MQTT 代理使用 MySQL、PostgresDB 和 Java 密钥库等证书存储区。根据 MQTT 代理使用的证书,确保存在以下过程:
- 监控中央证书存储区中的更改并通知同步过程的过程。
- 获取中央证书存储区中的更改并使中央证书存储区中的更改与 MQTT 代理使用的证书存储区同步的过程。
使用 Secret Manager 作为证书存储区时,您可以使用事件通知作为监控过程。您可以将同步过程实现为事件通知的监听器。
将证书安全地分发到边缘设备
使用 MQTT 代理时,请将根证书和客户端证书分发到您的边缘设备。分发证书时,您必须保护通信通道,以避免流量被拦截。
用于分发证书的主要通信通道如下:
- 通过现有通信通道从 IoT 后端到边缘设备的直接路径。
- 边缘设备请求并下载证书的间接路径。
在分发证书期间,您需要以下组件:
- 证书存储区,用于集中管理证书。
- 分发协调器,用于为每个边缘设备发送证书并跟踪分发过程。
- 边缘设备上的更新处理程序,用于接收或下载证书并将证书存储在设备上。
在边缘设备的预配过程中以及在需要轮替证书时分发证书。
在预配过程中,请确保预配者能够通过加密通道(例如 SSH)并使用诸如 SCP 之类的工具直接访问边缘设备。由于设备未工作,因此您可以将证书直接推送到边缘设备。
轮替证书时,使用 MQTT 代理作为分发协调器和边缘设备之间的通信通道。使用其他通道将证书下载到设备上。为了最大限度地减少边缘设备的工作中断,请使用间接证书分发路径。此过程将包括以下逻辑步骤:
- 分发协调器从证书存储区获取访问凭据。
- 分发协调器将证书访问凭据和其他信息(例如下载网址)一起推送到边缘设备。
- 设备上的更新处理程序接收访问凭据,临时存储信息并向分发协调器确认收到凭据。
- 更新处理程序会协调在设备处于非活动状态时下载证书。更新处理程序使用访问凭据从凭据存储空间下载证书。
- 下载证书后,更新处理程序继续执行证书轮替进程,如证书轮替部分中所述。
使用 Secret Manager 作为中央证书存储区时,您可以生成短期访问令牌来授予和限制对证书的访问。如需了解详情,请参阅将访问令牌安全地分发给设备。
为防止证书在传输过程中公开,请加密边缘设备与 MQTT 代理之间的连接。如需了解详情,请参阅网络连接的最佳做法。
自动轮替证书
为了限制泄露的证书可能造成的损害,请生成有效时间有限的证书,并在证书过期之前轮替证书。对于大规模的 IoT 部署,请实现自动证书轮替程序,以便在旧证书失效之前使用新证书持续更新设备。没有有效证书的已部署设备意味着设备可能会停止工作,这可能会使得修复 IoT 解决方案的成本高昂,并且会对 IoT 解决方案的整体功能产生负面影响。
您的边缘设备必须与 MQTT 代理进行双向连接,以确保它们可以向 MQTT 代理发送消息,并且可以接收来自 MQTT 代理的消息。
在证书轮替期间,您需要以下组件:
- 监控进程,用于定期扫描证书清单,并查找即将过期的证书。监控进程会触发即将失效的证书的证书轮替。
- 初始化和监督证书轮替的轮替进程。
- 边缘设备上与 MQTT 代理通信并执行证书轮替步骤的设备证书轮替处理程序。
为了轮替证书,IoT 解决方案需要完成以下步骤:
- 轮替进程会向边缘设备发送初始化消息,以启动证书轮替。
- 设备证书轮替处理程序通过将响应发送回轮替作业来确认初始化消息。
- 轮替进程向 CA 请求新证书。此请求与证书预配请求类似,不同之处在于密钥和 CSR 以 MQTT 代理消息的形式发送。
- 从 CA 收到新证书后,轮替作业将证书分发到中央证书存储区和边缘设备。它还将证书同步到 MQTT 代理的证书存储区。
- 设备证书轮替处理程序存储新证书,并使用新证书初始化与 MQTT 代理的新连接。
- 建立新连接后,设备证书轮替处理程序向 MQTT 代理发送已完成消息。
- 收到已完成消息后,轮替进程使中央证书存储区中的旧证书失效。
为了帮助保护在轮替进程中发送的证书,请使用专用 MQTT 主题进行证书轮替。仅允许轮替作业和边缘设备访问这些主题。
为了帮助保护证书轮替进程免受运行时故障的影响,请为更改和进度启用持久化。
如需详细了解如何使用 Secret Manager 轮替 Secret,请参阅 Secret 轮替。
IoT 平台证书管理的最佳做法
如果您使用的是 IoT 平台,请使用该平台提供的证书更新和分发机制。出于备份目的,您可以定期将凭据从 IoT 平台导出到辅助 Secret 存储,例如 Secret Manager。
使用 MQTT 代理进行身份验证的最佳做法
在双向身份验证过程中,后端工作负载会验证边缘设备的身份,边缘设备也会验证后端工作负载的身份。在后端工作负载确认边缘设备的身份后,后端工作负载为会设备授予访问资源的权限。
以下部分介绍了使用 MQTT 代理时身份验证方法的最佳做法。
为 MQTT 代理选择身份验证方法
不同的 IoT 后端支持不同的身份验证方法。常用的方法如下:
- 用户名和密码身份验证:在此方法中,边缘设备提供其用户名和密码以验证其身份。
- 基于令牌的身份验证:在此方法中,使用加密的安全令牌来验证边缘设备的身份。
- 自定义身份验证方案:在此方法中,您实现自定义机制来验证边缘设备的身份。
作为 MQTT 标准的一部分,MQTT 代理支持使用用户名和密码进行身份验证作为 MQTT CONNECT
数据包的默认方法。
MQTT CONNECT
数据包还包含 Client Identifier
字段,可用于唯一标识 MQTT 代理的客户端。边缘设备会在建立连接时将 MQTT CONNECT
数据包发送到 MQTT 代理。
除了 MQTT
CONNECT
数据包中的用户名、密码和客户端标识符字段之外,MQTT 5.0 还支持增强型身份验证,使您能够构建质询/响应身份验证流程。MQTT 5.0 允许边缘设备与 MQTT 代理之间的多个 AUTH
数据包交换。
将密码存储区与用户名和密码身份验证结合使用
对于用户名和密码身份验证,请将 MQTT 代理配置为使用密码存储区。密码存储区提供了一个集中位置,用于管理连接到 MQTT 代理的所有边缘设备的密码。默认情况下,MQTT 规范中的用户名、密码和客户端标识符字段为可选字段。因此,请设计身份验证机制以验证 MQTT
CONNECT
数据包中是否存在用户名、密码和客户端标识符字段。
确保对静态密码和传输中密码进行加密,如下所示:
对于静态密码,将会存储密码的加密强哈希;该密码无法逆转。如需详细了解如何对密码进行哈希处理,请参阅账号身份验证和密码管理的最佳做法。
对于传输中密码,将会加密边缘设备与 MQTT 代理之间的连接。如需了解详情,请参阅网络连接的最佳做法。
考虑基于令牌的身份验证
使用基于令牌的身份验证时,边缘设备会向 MQTT 代理发送令牌以进行身份验证。设备可以自行生成令牌,也可以从其他身份验证服务获取令牌。与密码相比,令牌的有效期很短:令牌仅在一段时间内有效,具有明确的失效日期。验证令牌时,始终检查到期日期。
JSON Web 令牌 (JWT) 是一种实现基于令牌的身份验证的方法。Edge 设备可以生成 JWT 并使用 MQTT 代理进行身份验证。JWT 作为密码字段嵌入到 MQTT CONNECT 数据包中。
JWT 的优势如下:
- JWT 允许您选择用于对令牌进行签名的加密算法。JWT 非常适合受限的边缘设备,您可以使用资源密集型加密算法(如 ECC)对令牌进行签名。
- 使用公钥加密时,私钥仅用于边缘设备,绝不会与其他方共享。私钥有助于使得此方法比用户名和密码身份验证更安全,因为凭据通过连接发送,并且需要加密数据。
考虑自定义身份验证方案
某些 MQTT 代理支持不同的身份验证机制和协议。例如,如果您的 MQTT 代理支持自定义身份验证方案,您可以将其配置为支持以下内容:
- 行业标准身份验证协议,例如 OpenID Connect、安全断言标记语言 (SAML)、LDAP、Kerberos 和简单身份验证和安全层 (SASL)。这些协议会将设备身份验证委托给您现有的身份提供方。某些 MQTT 代理支持增强型身份验证和可扩展的身份验证机制,您可以使用这些机制来扩展 MQTT 代理以支持新的协议和身份提供方。
- 基于证书的双向身份验证。某些 MQTT 代理支持双向身份验证方案,例如基于 mTLS 的身份验证。
设备访问权限控制和授权的最佳做法
由于 MQTT 协议的发布者和订阅者通信模式,因此使用 MQTT 主题定义设备访问权限控制。MQTT 主题控制设备与 IoT 后端的通信方式。每个 IoT 后端都有不同的访问权限控制和授权实现方式,因此请参阅 IoT 后端文档,了解如何设置 MQTT 主题。
使用单一用途的服务账号访问 Google Cloud 资源
对 Google Cloud 资源的访问权限通过 IAM 允许政策(该政策将资源访问权限与一组主账号绑定起来)进行管理。典型的主账号有用户账号、服务账号和群组。服务账号通常供应用或计算工作负载用于对云资源进行已获授权的 API 调用。通过服务账号,IoT 边缘设备可以访问云资源。
由于设备身份由 IoT 后端管理,因此您必须在 IoT 后端和 IAM 之间映射身份,似的边缘设备可以访问 Google Cloud 资源。
如果您要管理大量设备,而每个 Google Cloud 项目的服务账号数量存在限制,因此无法实现设备和服务账号之间一对一的映射。
应改为创建与 IoT 解决方案需要访问的云资源相关联的服务账号,如创建单一用途的服务账号中所述。例如,为以下每个使用场景创建一个唯一的服务账号:
- 下载软件的更新软件包
- 上传大型媒体文件
- 从延迟时间信息流中提取数据
为了实现最小权限,请确保每个服务账号仅具有足够的访问权限来支持其使用场景。例如,对于用于下载软件包的服务账号,请仅授予对 Cloud Storage 存储桶的读取权限。
将访问令牌安全地分发给设备
通常,您的边缘设备会使用 MQTT 与您的 IoT 平台通信。但对于特定使用场景,您的设备可能需要直接访问 Google Cloud 资源。例如,应该考虑以下事项:
- 为了下载内容,边缘设备仅在下载过程中需要对 Cloud Storage 存储桶的只读权限。
- 为了将数据上传到 Cloud Storage 存储桶,边缘设备需要对存储桶的写入权限。
对于这些使用场景,请使用工作负载身份联合,这种方法通过访问令牌授予对 Google Cloud 资源的访问权限。工作负载身份联合无需在边缘设备上预配任何特定于云的凭据,并且访问权限分配根据需求动态进行。
如需将云资源的访问令牌分发到您的设备,请在设备身份提供方和 Google Cloud 之间配置工作负载身份联合。如需支持工作负载身份联合,请确保您的 IoT 后端满足工作负载身份联合要求,并遵循符合您的使用情形的安全最佳做法。
如需使用工作负载身份联合访问 Google Cloud 资源,您的边缘设备必须实现 OAuth 2.0 令牌交换工作流,其中包括以下步骤:
- 设备调用 Security Token Service,并提供它自己的设备凭据。
- Security Token Service 通过验证边缘设备提供给设备身份提供方的凭据来验证边缘设备的身份。
- 如果身份验证成功,Security Token Service 就会将联合令牌返回给边缘设备。
- 边缘设备使用联合令牌来模拟单一用途的服务账号,并获取短期有效的 OAuth 2.0 访问令牌。
- 设备使用短期有效的 OAuth 2.0 访问令牌向 Google Cloud API 进行身份验证,并获取对所需云资源的访问权限。
如需限制短期有效的访问令牌对 Cloud Storage 中特定存储桶和对象的访问权限,请使用凭据访问边界。凭据访问边界可让您限制短期有效的凭据的访问权限,并最大限度地减少访问令牌被破解时 Cloud Storage 存储桶中泄露的资源数量。
工作负载身份联合是一种可扩缩的方法,用于安全地将边缘访问权限分配给边缘设备。如需详细了解身份验证,请参阅 Google 身份验证。
监控和审核对云资源的访问权限
启用 Cloud Audit Logs,以便在边缘设备通过经过身份验证的 API 请求访问云资源时创建日志条目。借助 Cloud Audit Logs,您可以监控边缘设备在 Google Cloud 上执行的关键操作。此外,Cloud Audit Logs 还会创建审核跟踪记录和日志,供您调查任何问题。如需了解详情,请参阅模拟服务账号以访问 Google Cloud。
后续步骤
- 详细了解物联网技术概览。
阅读本系列文章中的其余文档:
详细了解使用服务账号的最佳做法。