物联网安全 - 12.MQTT 代理安全

admin 2023年10月26日02:51:55评论22 views字数 7529阅读25分5秒阅读模式


本博客是物联网安全系列的一部分,我们将讨论与物联网/工业物联网生态系统及其安全性相关的基本概念。如果您还没有浏览过该系列以前的博客,我建议您先浏览这些博客。如果您只对 MQTT 代理安全感兴趣,请随时继续。

物联网安全-物联网介绍及其架构

物联网安全-2.物联网攻击面

物联网安全3.物联网10大安全漏洞

物联网安全-4.低功耗蓝牙BLE

物联网安全-5.ZigBee协议物联网安全-6.ZigBee安全物联网安全-7.物联网固件逆向

物联网安全-8.软件无线电(Software Defined Radio,SDR)简介

物联网安全-9.软件无线电简介(Software Defined Radio,SDR):软件部分

物联网安全 – 10.MQTT 协议和安全简介

物联网安全 – 11 CoAP 协议和安全简介

目录

1 引言

2 数据和连接安全

3 客户端身份验证                

4 限制对服务器资源的访问

5 证书吊销列表

 6 结论

7 参考资料

在这篇博客中,我们将介绍客户端身份验证以及 MQTT 代理用于与 MQTT 客户端安全连接的其他安全方法

1 引言

MQTT协议在许多行业中越来越流行,它也吸引了物联网初学者,发烧友物联网开发人员以及希望探索这项技术以获得新机会的安全研究人员。

如果您是 MQTT 的新手,并且想了解有关该协议的更多信息,请访问我们关于 MQTT 协议和安全的博客。

物联网安全 – 10.MQTT 协议和安全简介

MQTT 代理和客户端有许多开源和商业实现可供选择。但是在使用 MQTT 代理的任何 MQTT 实现之前,必须了解 MQTT 代理和客户端的安全功能。

本博客阐述了初学者开始研究 MQTT 协议的安全性以及 MQTT 代理和客户端所需的安全功能所需的信息。

我们使用 Eclipse Mosquitto Broker 来了解代理配置以及如何为所需的安全模式配置 Mosquitto 代理。我们还将研究 AWS IoT Core 以获取类似的功能和配置。

2 数据和连接安全

2.1 安全连接

根据MQTT规范TCP端口,分别保留用于MQTT TLS和非TLS通信。88831883

在非TLS通信中,即在端口上,MQTT消息在MQTT代理和客户端之间以纯文本格式传输,应被视为不安全的连接。而在TLS通信或安全连接(即TCP端口)中,MQTT消息在传输之前由TLS安全层加密。18838883

在 MQTT 代理和客户端之间使用安全通信始终是一个好主意。

2.1.1 莫斯基托经纪人

Mosquitto Broker 在文件中提供了一个选项,用于选择 MQTT 连接的侦听器端口,默认值为 。应将其更改为用于安全 (TLS) 通信。mosquitto.conf18838883

# Port to use for the default listener.
port 8883

这只是第一步,您仍然需要配置代理以使用证书来使其工作。

2.1.2 AWS IoT Core

默认情况下,AWS IoT 核心对端口上的 MQTT 使用 TLS 连接8883

2.2 应用数据或 MQTT 有效负载安全性

MQTT 协议是消息传递协议,不为其承载的应用程序有效负载提供任何加密。应用程序负责在发送到 MQTT 层之前或从 MQTT 层接收后对应用程序数据(有效负载)进行加密/解密,以实现端到端数据加密。请注意,应用程序级加密独立于 TLS 数据包加密。


物联网安全 – 12.MQTT 代理安全

3 客户端身份验证

对于任何 MQTT 代理,有三种类型的客户端身份验证方法可用于验证 MQTT 客户端的身份

  1. 客户端标识符(客户端 ID)

  2. 用户名和密码

  3. 客户端证书

3.1 客户端标识符(客户端 ID)

根据 MQTT 规范,所有 MQTT 客户端必须具有唯一性,并且客户端必须将其与数据包一起发送。代理使用它来创建和维护会话状态。Client IdClient IdCONNECTClient Id

它不是 MQTT 身份验证的一部分,仅用于唯一标识 MQTT 连接。但是,某些代理实现提供了某种方法来使用 或派生自 的某种内容来建立客户端身份。但是,单独使用客户端 ID 进行身份验证或验证是一个坏主意,因为它可以在客户端纵/欺骗。Client IdClient IdClient Id

我们将在以下示例中看到 Mosquitto Broker 和 AWS IoT Core 如何使用基本安全性client id

3.1.1 莫斯基托经纪人

Mosquitto Broker 提供了一个在文件中调用的选项来配置客户机标识前缀,该选项允许客户机标识中具有指定前缀的客户机连接到莫斯基托代理。clientid_prefixesmosquitto.conf


=================================================================安全性=================================================================如果设置了该选项,只有具有匹配前缀的clientid的客户端将被允许连接到经纪人。默认情况下,所有客户端都可以连接。例如,在此处设置"secure-"将意味着客户端"secure-client"可以连接,但clientid为"mqtt"的客户端不能连接clientid_prefixes C_ID-

在上面的示例中,clientid_prefixes设置为 C_ID- 并且允许具有 C_ID_Client01 的客户端进行连接,但不允许客户端 ID 为 Client01 的客户端进行连接。client id

3.1.2 AWS IoT Core

AWS IoT 提供了在 IoT 核心中创建时设置的选项,此处 id 与 .但是,当为相应的 .thing idthingthingClient IDthingthing id

注意:
如果客户端与as连接,第二个客户端具有相同的连接,即 正在尝试连接代理,然后第一个客户端被代理断开连接。这是 MQTT 协议为任何客户端会话提供的最低安全性,可防止具有间歇性连接的客户端生成多个 MQTT 会话。但是,正如我们之前关于 MQTT 的博客文章所讨论的那样,它也为 MQTT 网络上的拒绝服务攻击打开了大门。client idclient_1client idclient_1

3.2 用户名和密码

MQTT 规范定义了 和 MQTT 客户端身份验证的要求。客户端将数据包与 and 一起发送到 MQTT 代理,代理在接受 MQTT 会话之前验证 和。usernamepasswordusernamepasswordCONNECTusernamepassword

和在数据包中以夹板文本格式发送到代理,除非在传输层加密,即使用端口进行连接。usernamepasswordCONNECT8883

注意:
根据 MQTT 规范,不强制使用身份验证。

3.2.1 莫斯基托经纪人

Mosquitto Broker 在文件中提供了两个参数,以启用客户端的客户端身份验证 – 和 .mosquitto.confusernamepassword

3.2.1.1 允许匿名

(请提供一句话解释什么是允许匿名)
若要使用凭据启用客户端身份验证,还需要将参数设置为 in file。allow_anonymousfalsemosquitto.conf

如果没有设置其他安全选项,allow_anonymous默认为true。如果设置了password_file或psk_file,或者加载了实现用户名/密码或TLS-PSK检查的认证插件,则allow_anonymous默认为false。allow_anonymous false

3.2.1.2 密码文件路径

要创建密码文件,mosquitto 代理附带了创建密码文件的实用程序。mosquitto_passwd

例:

一个。创建/附加密码文件并使用散列密码添加用户john

$ sudo mosquitto_passwd -c /etc/mosquitto/pwfile john <somepassword>

b.从密码文件中删除用户

$ sudo mosquitto_passwd -d /etc/mosquitto/pwfile john <somepassword>

创建密码文件后,使用文件中的参数设置密码文件的当前位置。password_filemosquitto.conf

有关替代身份验证选项,请参阅TLS客户端的require_certificate和use_identity_as_username选项。如果同时使用auth_plugin和password_file,将首先进行auth_plugin检查。password_file /etc/mosquitto/pwfile

注意:
对于 Linux,mosquitto 密码文件的默认位置是,对于 windows,则为 mosquitto 安装文件夹。/etc/mosquitto/pwfile~mosquittopasswords.txt

3.2.2 AWS IoT Core

AWS IoT 核心不支持用户名和密码身份验证,但它提供了自定义身份验证选项。

注意:
另一种用途是根据客户端允许或拒绝对客户端的访问,我们将在下面的第 4.1.3.2 节中看到它usernametopicusername

3.3. 客户端 SSL 证书

被认为是最安全的客户端身份验证方法,在基于证书的身份验证中,客户端将由受信任的根 CA 签名的 SSL 证书发送到服务器以对客户端进行身份验证。

3.3.1 莫斯基托经纪人

Mosquitto 代理在文件中提供以下选项来启用基于证书的客户端身份验证。mosquitto.conf

3.3.1.1 需要客户端证书

设置为 时,允许在连接握手期间提供有效证书的 MQTT 客户端进行连接。require_certificatetrue


默认情况下,启用了TLS的监听器将类似于启用了https的Web服务器运行,即服务器具有由证书颁发机构(CA)签署的证书,而客户端将验证其为受信任的证书。总体目标是加密网络流量。通过将require_certificate设置为true,客户端必须提供有效的证书才能继续网络连接。这允许对经纪人的访问进行控制,超出了MQTT提供的机制。require_certificate true

3.3.1.2 根 CA 文件路径

必须将 or 设置为已签署服务器证书的受信任 CA 证书,以启用基于证书的客户端身份验证。cafilecapath

至少必须定义cafile或capath中的一个,以启用基于证书的TLS加密。它们都定义了访问PEM编码的证书颁发机构(CA)证书的方法,这些证书已经签署了您的服务器证书,而您希望信任这些证书。

cafile定义了包含CA证书的文件路径。capath定义了一个目录,用于查找包含CA证书的文件。为了使capath正常工作,证书文件的文件扩展名必须为“.crt”,每次添加/删除证书时,您都必须运行“openssl rehash <capath路径>”。


cafile /etc/mosquitto/certs/ca.crt#capath

3.3.1.3 服务器证书和密钥文件路径

MQTT 客户端请求在 TLS 握手期间进行服务器身份验证。certfile

# Path to the PEM encoded server certificate.certfile /etc/mosquitto/certs/server.crt# Path to the PEM encoded keyfile.keyfile /etc/mosquitto/certs/server.key

3.3.2 AWS IoT Core

AWS IoT 核心使用基于 x.509 证书的身份验证作为默认客户端身份验证方法。

在此处阅读有关 AWS IoT 客户端身份验证的更多信息。

4 限制对服务器资源的访问

每个 MQTT 代理都必须具有一些访问控制机制,以根据客户端提供的信息(例如用户名、客户端标识符、客户端的主机名/IP 地址或身份验证机制的结果)限制 MQTT 客户端访问服务器资源。

4.1 莫斯基托经纪人

Mosquitto代理有一个机制,称为或用于MQTT主题,用于控制客户端对代理上主题的订阅和发布访问。用户名或客户机标识用于限制对代理主题的访问。access control listACLACL

中的参数是包含访问控制列表的文件的路径。有效的文件路径启用主题限制。acl_filemosquitto.confACL

# If an auth_plugin is used as well as acl_file, the auth_plugin check will be# made first.acl_file /etc/mosquitto/aclfile

注意:默认文件的位置

在Linux系统上,Mosquitto的默认配置文件通常位于/etc/mosquitto/mosquitto.conf

在Windows系统上,Mosquitto的默认配置文件位于Mosquitto安装文件夹的根目录下。例如,如果你将Mosquitto安装在C:Program FilesMosquitto,那么默认配置文件应该位于C:Program FilesMosquittomosquitto.conf。请注意,实际安装路径可能会有所不同,取决于你在安装过程中选择的路径。


 # This affects access control for clients with no username.topic read $SYS/#
# This only affects clients with username "roger".user rogertopic foo/bar
# This affects all clients.pattern write $SYS/broker/connection/%c/state

有三种类型的规则建立和保存ACLacl_file

4.1.1 主题名称

此规则使用关键字,适用于所有匿名客户端。如果客户端使用凭据进行连接,则忽略该客户端的此规则。topic

以下是用于定义此规则的格式 –

topic [read|write|readwrite] <topic>

例:

下面一行提供对任何匿名客户端的读取(订阅)访问权限,并且对任何其他主题的访问将被拒绝。

topic read $SYS/#

4.1.2 用户名

此规则使用关键字,适用于使用用户凭据进行连接的客户端。
以下是用于定义此规则的格式 –user

user <username>
topic [read|write|readwrite] <topic>

这里与密码文件中的相同username

例:

以下行为具有用户名的客户端提供对主题的读取(订阅)和写入(发布)访问权限,而对于其他客户端则忽略。foo/barroger

user roger
topic foo/bar

4.1.3 与主题的模式替换

此规则使用关键字。使用主题的模式替换,代理允许使用其 or 访问客户端。patternclient idusername

以下是用于定义此规则的格式 –

pattern [read|write|readwrite] <topic>

注意:根据 Eclipse Mosquitto 文档,以下模式可供替换

  1. %c 以匹配客户端的客户端 ID

  2. %you 以匹配客户端的用户名

以下行是 ACL 文件中的默认条目,并授予对所有客户端的写入(发布)访问权限。

pattern write $SYS/broker/connection/%c/state

4.1.3.1 客户端 ID 替换

以下示例将说明如何使用变电站进行访问client idtopic

例:

下面行允许所有客户端对主题进行读取访问pattern write sensor/<clientid>/data

pattern write sensor/%c/data

以下行将允许对具有客户端 ID 的客户端进行写入访问以访问本主题,并拒绝对所有其他客户端的访问c1

pattern write sensor/c1/data

4.1.3.2 用户名替换

以下示例将说明如何使用变电站进行访问usernametopic

例:

下面行允许所有客户端对主题进行读取访问user/<username>/logintime

pattern read user/%u/logintime

下面一行将允许用户对主题进行读写访问user/john/lastloginjohn

pattern read | write user/john/lastlogin

4.2 AWS IoT Core

在 AWS IoT 中,访问代理资源的权限由 控制。在此处阅读有关 AWS IoT Core 策略的更多信息。AWS IoT Core policies

5 证书吊销列表

虽然基于证书的身份验证被认为是最安全的,但证书一旦颁发,就不能被修改,并且在未过期时控制一个人的访问是一个挑战。然后在某些情况下,证书来自克隆或已停用的设备,用于获取系统访问权限。
为了避免这种情况,证书吊销列表 (CRL) 由证书颁发机构 CA 颁发。它包含已停用或已泄露设备中已吊销的证书的信息,这些设备不再受信任并阻止将来使用。

5.1 莫斯基托经纪人

当使用基于证书的客户端身份验证时,该文件是必需的,即 设置为 。它包含已停用或已泄露的客户端设备中吊销的证书的信息,以防止将来使用。CRLrequire_certificatetrue

您可以使用参数 from 指向 PEM 编码的吊销文件。crlfilemosquitto.conf

"如果你将require_certificate设置为true,你可以创建一个证书吊销列表文件,用于吊销特定客户端证书的访问权限。如果你已经这样做了,可以使用crlfile指向包含PEM编码的吊销文件。"

crlfile /etc/pki/mosquitto/content/crl/mosquitto_crl.pem

5.2 AWS IoT Core

使用 AWS IoT 控制台,用户可以停用或吊销客户端证书。在此处阅读有关客户端证书激活或停用的更多信息。

6 结论

有一些薮猫安全机制可用于保护 MQTT 通信,并且因实现而异。这些在 MQTT 代理端实施的安全机制、MQTT 代理和 MQTT 客户端的正确配置减少了物联网生态系统中的攻击面,并为已知攻击提供了更好的优势。
我们希望这篇博文能让您深入了解用于保护代理和客户端之间 MQTT 连接的安全机制。

继续下一部分 – IoT 安全 - 第 13 部分(硬件侦察简介)

7 参考资料

  • Mosquitto 代理配置文件

  • mosquitto_passwd实用程序

  • 为 Mosquitto 配置 SSL/TLS 支持

  • AWS IoT 中的安全性

这就是这篇的全部内容。

其它课程

windows网络安全一防火墙


物联网安全 – 12.MQTT 代理安全

windows文件过滤(更新完成)

物联网安全 – 12.MQTT 代理安全

USB过滤(更新完成)

物联网安全 – 12.MQTT 代理安全

游戏安全(更新中)

物联网安全 – 12.MQTT 代理安全

二进制漏洞(更新中)

物联网安全 – 12.MQTT 代理安全

ios逆向

物联网安全 – 12.MQTT 代理安全

还有很多免费教程(限学员)

物联网安全 – 12.MQTT 代理安全

更多详细内容添加作者微信


物联网安全 – 12.MQTT 代理安全

 

 

物联网安全 – 12.MQTT 代理安全





原文始发于微信公众号(安全狗的自我修养):物联网安全 – 12.MQTT 代理安全

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年10月26日02:51:55
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   物联网安全 - 12.MQTT 代理安全https://cn-sec.com/archives/2134470.html

发表评论

匿名网友 填写信息