灵活多样认证授权,零开发投入保障 IoT 安全

简介: 本文将通过对EMQX客户端认证与授权机制以及5.0版本中相关优化的详细解析,为读者展示EMQX进行物联网安全保障的原理机制,帮助大家更好地使用这一功能构建更加安全可靠的物联网平台与应用。

引言:灵活认证/授权机制带来高效安全保障

EMQX 始终十分关注安全性,通过大量开箱即用的安全功能为广大物联网用户提供持续增强的安全保障,包括 MQTT over TLS/SSL、基于国密算法的传输加密认证集成方案,以及用户名/密码、LDAP、JWT、PSK 和 X.509 证书等多种身份认证功能。

其中,客户端认证与授权是安全保障的核心之一。最新发布的 EMQX 5.0 对配置方式和使用流程进行了优化,内置实现了客户端认证授权功能:用户通过简单配置,无需编写代码即可对接各类数据源与认证服务,实现各个级别与各类场景下的安全配置,以更高的开发效率获得更安全的保障。

本文将通过对 EMQX 客户端认证与授权机制以及 5.0 版本中相关优化的详细解析,为读者展示 EMQX 进行物联网安全保障的原理机制,帮助大家更好地使用这一功能构建更加安全可靠的物联网平台与应用。

EMQX 客户端认证机制

身份认证是大多数应用程序的重要组成部分,在物联网应用中也一样。

MQTT 协议允许客户端携带用户名/密码用于身份认证,在此基础上 EMQX 扩展允许客户端在密码中携带 Token 实现 JWT 认证。同时,EMQX 完整支持 MQTT 5.0 增强认证功能,能够通过质询/响应风格方式实现对客户端和服务器的双向认证,实现更强的安全性保障。

三种认证方式

密码认证

EMQX 支持最简单也是使用最多的认证方式,密码认证要求客户端提供能够表明身份的凭据,例如用户名、客户端 ID 以及对应的密码。在某些场景下,用户可能会选择将 TLS 证书中的一些字段(例如证书公用名称)作为客户端的身份凭据使用。

但不论使用何种身份凭据进行认证,这些身份凭据都会提前存储到特定数据源(数据库)中,其中密码通常都会以加盐后散列的形式存储,这也是我们强烈建议的方式。

密码认证在 EMQX 中的基本运作原理为:在客户端连接时,EMQX 将使用用户指定的查询语句在数据库中查询与该客户端提供的身份凭据对应的密码散列值,然后与客户端当前连接密码的散列值进行匹配,一旦匹配成功,EMQX 将允许该客户端登录。

密码认证流程.png

密码认证流程,使用 PosgresSQL 作为数据源

JWT 认证

JWT 是一种基于 Token 的认证机制,它不需要服务器来保留客户端的认证信息或会话信息。客户端可以在密码或用户名中携带 Token,EMQX 则使用预先配置的密钥或公钥对 JWT 签名进行验证。

如果用户配置了 JWKs 服务器,则 JWT 认证器将使用从 JWKs 服务器查询到的公钥列表对 JWT 签名进行验证。在持有密钥的情况下用户可以为客户端批量签发认证信息,是最简便的认证方式。

MQTT 5.0 增强认证

MQTT 5.0 增强认证是对密码认证的扩展,它更像是一种认证框架,允许使用各种更安全的认证机制,例如 SCRAM 认证、Kerberos 认证等。目前 EMQX 已支持 SCRAM 认证,并且通过内置数据库提供了对 SCRAM 用户管理的支持。

在传输层方面,EMQX 支持 TLS 的双向认证,这在某种程度上能满足客户端和服务端之间的身份验证要求,EMQX 也支持基于 PSK 的 TLS/DTLS 认证,本文不再赘述此部分内容。

认证链、超级用户与权限

EMQX 允许创建多个认证器构成一条认证链,认证器将按照在链中的位置顺序运行,如果在当前认证器中未检索到身份凭证,将会切换至链上的下一个认证器继续认证,所有认证器都没有查找到数据则客户端认证失败。

EMQX 允许在认证阶段为客户端设置超级用户角色以及预设权限列表,用于后续的发布订阅权限检查。

EMQX 授权机制

EMQX 授权是指对客户端的发布和订阅操作进行权限控制。与客户端认证一样,客户端权限列表同样需要提前存储到特定数据源(数据库、文件)中,更新对应的数据即可实现权限的运行时动态更新。

授权机制在 EMQX 中的基本运作原理为:在客户端发布或订阅时,EMQX 将使用特定的流程或用户指定的查询语句从数据源中查询该客户端相关的访问控制列表(ACL),与当前操作进行匹配并根据匹配结果允许或拒绝当前操作。

缓存、授权链与权限优先级

大量的客户端订阅和发布将会对授权数据后端产生访问压力, 因此 EMQX 引入了缓存机制。

EMQX 允许创建多个授权检查器构成一条授权链,授权检查将按照在链中的位置顺序运行,如果在当前授权检查器中未检索到权限数据,将会切换至链上的下一个检查器继续检查,所有检查器都没有查找到数据则客户端根据 no_match 配置默认允许或拒接操作。

如果客户端在认证阶段设置了超级用户角色,则后续的发布订阅操作不会再触发授权检查;如果设置了权限列表,则优先匹配客户端权限数据。三者匹配关系如下:

超级用户 > 权限数据 > 授权检查

认证与授权数据源

EMQX 为密码认证、授权提供了与多种后端数据库的集成支持,包括 MySQL、PostgreSQL、MongoDB 和 Redis。

同时 EMQX 也支持用户将身份凭证和权限列表存储到内置数据库(基于 Mnesia)中,这种方式提供了非常简单的配置流程和用户管理接口。用户可以通过 REST API 或 Dashboard 管理认证数据,或从 CSV 或 JSON 文件批量导入用户。

除此之外,EMQX 还可以通过 HTTP 方式对接用户自己开发的服务,借此实现更复杂的认证与授权逻辑。

EMQX 认证.png
EMQX 授权.png

移除认证授权插件

EMQX 5.0 中我们将认证授权功能从插件迁移至内置功能,原认证授权插件不再内置。

除了配置文件的方式外,EMQX 允许通过 Dashboard 与 REST API 配置认证授权功能,选择需要的认证方式,选择擅长的数据源,填入参数即可启用连接认证和授权检查功能,为客户端提供最重要的安全防护。REST API 的配置方式能够在实现将配置一次性分发并生效至集群所有节点中,这种热配置的方式大大提升了易用性,能够更快的上手使用。

相比于 4.x 版本,使用内置数据时 EMQX 5.0 还在 Dashboard 提供了数据管理页面,用户在浏览器上即可完成数据的导入/添加与管理,真正实现开箱即用零开发能力。

EMQX 认证1.png

保留插件使用方式

内置的认证授权本身也是通过挂载钩子的形式实现控制的,用户仍然可以使用 EMQX 4.x 中开发的认证授权插件,或基于 EMQX 5.0 开发新的插件,此时插件与内置功能将以钩子挂载顺序确定执行优先级。

以下是认证与授权功能挂载的钩子信息,更多信息请参考插件与扩展 - 钩子

表格.jpg

多语言扩展开发认证授权功能

除了原生插件开发外,EMQX 还支持通过多语言钩子扩展的形式实现认证授权功能。

移除匿名认证机制

EMQX 4.x 中提供了匿名认证配置 allow_anonymous,没有启用认证插件或认证插件中没有查找到当前客户端的身份凭证时,EMQX 将根据匿名认证启用情况决定是否允许客户端连接*。

我们建议用户务必在生产环境中禁用匿名认证以避免数据库列表之外的客户端连接至 EMQX。

为了进一步提升安全性,同时降低用户使用的复杂度,我们在 EMQX 5.0 中移除了这一机制。目前是否启用认证的逻辑如下:

  • EMQX 没有配置任何认证器时,此时允许所有客户端连接
  • EMQX 配置认证器后:

    • 所有认证器禁用:允许客户端连接
    • 任意认证器启用:查找身份凭证进行认证,如果全部启用的认证器中都没有找到身份凭证,则禁止客户端连接

EMQX 5.0 认证链示意图.png

EMQX 5.0 认证链示意图

调整认证器与授权检查器顺序

用户可以创建多个认证器和授权检查器组成链实现链式认证,尽管我们不推荐这么做,但某些场景下这是有益的:比如客户端数量多、发布订阅速率很高的极端场景下,用户可能使用 Redis 作为链中的第一个授权检查器,与 HTTP 授权检查服务搭配使用,借助 Redis 高性能、自带 TTL 优势提供缓存层以实现更高性能的授权检查能力。

此前链上检查器执行的顺序是通过对应插件加载顺序决定的,并没有对应的配置接口,这会带来几个问题:

  • EMQX 初次启动时需要手动去每个节点执行插件加载操作,确保插件加载顺序符合业务需求
  • EMQX 重启后会自动加载上次启动时已加载的插件,插件加载顺序会被打乱
  • 后续的维护使用中无法感知链的顺序

EMQX 5.0 针对以上问题进行了优化:按照配置顺序从上到下依次加载并执行认证器与授权检查器,用户可以从配置层面实现顺序的控制。

同时我们提供了 Dashboard 与 REST API,允许通过拖拽、上下移动的方式调整认证器和授权检查器的顺序,确保符合业务需求。

实现认证授权可观测性

EMQX 5.0 提供了认证授权统计指标,可以分别统计集群综合以及单个节点上认证器和授权检查器的执行情况,包括以下数据:

  • 成功数:认证或授权检查通过数
  • 失败数:认证或授权检查失败数
  • 不匹配:没有找到用户凭证或权限列表的次数
  • 当前速度:当前执行速度

通过认证授权统计指标,用户可以及时发现如大量的失败认证/授权检查,及时感知安全系统的异常情况。

EMQX 实现认证授权可观测性.png

为监听器配置另外一种认证方式

默认情况下 EMQX 所有监听器接入的客户端都使用同一种认证方式,从同一个认证数据源中读取数据。

但在同时接入多个服务的 EMQX 集群中,用户可能需要根据业务不同为每种接入方式配置不同的认证方式,比如:

  • 通过 MQTT over WebSocket 接入的客户端不会颁发永久的用户名密码凭证,而是使用具有时效性的 JWT 进行认证以确保业务安全;
  • 通过 MQTT TCP 接入的硬件设备会在初始化时烧录用户名密码或客户端证书,该认证凭证在整个生命周期中不会变化,可以使用密码认证;
  • 用于后端服务连接的监听器不需要认证检查,此监听器通常监听于内网地址有足够的安全性。

EMQX 5.0 允许为指定监听器设置另外一种认证方式,或者关闭某个监听器的认证检查,以便灵活的适应各类认证需求。

全局共用一个认证方式能够满足绝大多数场景的客户端认证需求,对于大多数用户监听级别的认证设置是无感的,有需要的用户只需在监听器中配置即可。

结语

物联网安全是企业数字化业务创新的基石。EMQX 在提供高标准安全功能的同时,也在持续提升灵活度与易用性。EMQX 5.0 中灵活多样认证与授权方式能够适配更多开源和企业方案,为企业构建安全物联网平台提供了更多选择。配合其他丰富的开箱即用的安全功能,零开发投入就能实现可靠的物联网安全保障。

本系列中的其它文章

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
目录
相关文章
|
7月前
|
存储 物联网 数据管理
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(12)
现在到了使用Apache IoTDB进行IoT相关开发的架构设计与功能实现的最后一个环境,在本文中我将向大家介绍IoTDB的查询语言。IoTDB为咱们广大开发者提供了类似SQL的查询语言,用于与IoTDB进行交互,查询语言可以分为4个主要部分:架构语句、数据管理语句、数据库管理语句、功能。
134 0
|
7月前
|
SQL 物联网 Apache
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(11)
目前,IoTDB中不存在冲突的权限,因此用户的真正权限是用户自身权限和用户角色权限的结合。也就是说,要确定用户是否可以执行操作,取决于用户自己的权限之一或用户角色的权限是否允许该操作。用户自己的特权和用户角色的特权可能会重叠,但这并不重要。
128 1
|
7月前
|
SQL 传感器 物联网
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(10)
物联网提供限制/限制条款和偏移/偏移子句,以使用户对查询结果有更多的控制权。使用 LIMIT 和 SLIMIT 子句允许用户控制查询结果的行数和列数,使用 OFFSET 和 SOFSET 子句允许用户设置结果的起始位置进行显示。
|
5月前
|
安全 物联网 物联网安全
物联网安全IoT攻击向量威胁
物联网主要有两种感染途径:暴力破解弱密码和利用网络服务中的漏洞。
106 0
|
7月前
|
SQL 物联网 Java
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(9)
GROUP BY 语句为用户提供了三种类型的指定参数: 参数1:时间轴上的显示窗口 参数2:划分时间轴的时间间隔(应为正) 参数3:时间滑动步长(可选,不应小于时间间隔,如果未设置,则默认等于时间间隔)
133 0
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(9)
|
7月前
|
SQL 传感器 物联网
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(8)
IoTDB为用户提供了多种插入实时数据的方式,如直接输入插入SQL语句在客户端,这插入SQL语句语句可用于将数据插入到一个或多个已创建的指定时间序列中。
192 1
|
7月前
|
SQL 存储 缓存
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(7)
IoTDB支持存储级TTL设置,这意味着它能够定期自动删除旧数据。使用TTL的好处是,希望咱们程序猿可以控制总磁盘空间的使用,并防止机器用完磁盘。此外,随着文件总数的增加,查询性能可能会降低,并且随着文件的增加,内存使用也会增加。及时删除此类文件有助于保持较高的查询性能并减少内存使用。
143 0
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(7)
|
7月前
|
存储 SQL 传感器
使用Apache IoTDB进行IoT相关开发的架构设计与功能实现(6)
接下来我们讨论一下关于创建存储组的相关方面,在这里值得注意的是,当路径本身或路径的父/子层已经被设置为存储组时,则不允许将路径设置为存储组。例如,设置是不可行的​​root.ln.wf01​​存在两个存储组时,作为一个存储组​​root.ln​​和​​root.sgcc​​。系统会给出相应的错误提示。
118 0
|
9月前
|
移动开发 运维 监控
低代码开发云平台源码,支持多种企业应用场景,快速构建CRM、ERP、OA、BI、IoT、大数据应用程序
基于 moleculer 微服务架构开发,提供微服务的应用开发、配置管理、服务注册与发现、服务认证与授权、服务网关、服务监控、统一日志分析等,提供微服务应用的开发、部署、监控、运维等应用生命周期管理。
低代码开发云平台源码,支持多种企业应用场景,快速构建CRM、ERP、OA、BI、IoT、大数据应用程序
|
11月前
|
物联网
《阿里云产品手册2022-2023 版》——IoT边缘现场计算:云边协同软件获得首批可信云认证
《阿里云产品手册2022-2023 版》——IoT边缘现场计算:云边协同软件获得首批可信云认证
136 0