IoT#
安全边缘到云消息传递#
从 DeepStream 5.0 开始,Kafka 适配器支持安全通信。安全包括
身份验证:Kafka brokers 可以根据凭据限制客户端(生产者和消费者)连接到集群。从 5.0 版本开始,DeepStream 应用程序可以使用 TLS 相互身份验证和 SASL/Plain 机制向此类集群验证身份以发送(和接收)消息。这对于在公司网络外部执行的集群尤其重要,因此数据在通信期间会通过公共网络传输。
加密:加密确保从第三方维护 DeepStream 应用程序发送到 Kafka brokers 的消息的机密性。
篡改:添加的安全支持可防止应用程序和 broker 之间的消息在传输过程中被篡改。
授权:限制允许客户端连接到 broker 的操作。客户端(在本例中为 DeepStream 应用程序)的身份在身份验证步骤中建立。
双向 TLS 身份验证#
DeepStream(5.0 及更高版本)支持基于双向 TLS(传输层安全)身份验证机制的 Kafka 安全性。TLS 是 SSL 的后继者,但这两个术语在文献中仍然可以互换使用。TLS/SSL 通常用于安全通信,而连接到服务器时(例如 HTTPS)则用于网络上的安全通信。双向通信确保客户端和服务器可以相互验证身份,同时还支持加密等其他安全方面,从而实现防篡改通信并支持客户端授权。
步骤概述#
本节提供在为 Kafka 启用双向 TLS 安全性时的高级指导和注意事项。有关设置 SSL 安全性的详细设置说明,请参阅 DeepStream 5.0+ SDK 中 sources/libs/kafka_protocol_adaptor/
文件夹中的 Secure_Setup.md 文档。按照以下步骤为带有 Kafka 的 DeepStream 应用程序启用双向 TLS 身份验证
设置启用 TLS 身份验证的 Kafka broker
为 broker 和 DeepStream 应用程序创建和部署证书
将 CA 证书复制到 broker 和客户端 Truststores
在 Kafka 配置文件中配置 TLS 选项(请参阅上面的 proto-cfg 参数)
TLS 版本#
作为初始 TLS 握手的一部分,DeepStream 应用程序和服务器等客户端会协商要使用的 TLS 协议。建议在生产中使用 TLSv1.2
或更高版本。您可以使用 OpenSSL 实用程序连接到 broker 来验证您的 broker 支持哪个版本的 TLS。可以通过安装 openssl 软件包来部署 OpenSSL 实用程序,该软件包适用于 Ubuntu 和其他 Linux 发行版。运行以下命令
openssl s_client -connect <broker address>:<broker port> -tls1_2
此操作使用 TLSv1.2
,同时使用 openssl_s
客户端连接到 broker。如果出现错误,请查看握手期间的日志,以查找指示不支持 TLSv1.2
的问题。
密钥生成#
安全设置文档描述了使用 keytool 实用程序生成密钥对。用户可以选择指定用于生成密钥对的算法。RSA 是一种流行的算法,提供 2048 位密钥选项以增强安全性。其他算法包括 DSA 和 ECDSA,它们的签名和验证速度各不相同,如此处所述:https://wiki.mozilla.org/Security/Server_Side_TLS。
证书签名#
虽然安全设置文档提供了创建令牌证书颁发机构 (CA) 以签署客户端证书的说明,但在生产中,用户将创建由第三方 CA 签署的证书。这些证书是使用证书签名请求 (CSR) 创建的。有关更多信息,请参阅 https://en.wikipedia.org/wiki/Certificate_signing_request。请求证书的客户端会创建密钥对,但仅包含公钥以及其他信息,特别是“通用名称”,即请求证书的机器的完全限定域名 (FQDN)。此信息由用户使用私钥签名,私钥必须保密。
密码选择#
作为部署 DeepStream 应用程序时的 TLS 配置选项的一部分,用户可以指定要使用的密码套件。密码套件定义了在 TLS 连接的整个生命周期中使用的底层算法的集合。这些算法解决
密钥交换(在初始握手期间)
数字签名(在初始握手期间)
批量加密(数据通信期间的机密性)
消息身份验证(数据通信期间的防篡改)。OpenSSL(以及 librdkafka 和 DeepStream 中的 Kafka 适配器)支持许多密码。
上述算法的建议如下所述
ECDHE 作为密钥交换算法;它基于椭圆密钥密码学,同时使用临时密钥,从而提供前向保密。
用于数字签名的 ECDSA 或 RSA
用于批量加密的 AES。AES 提供 128 位和 256 位密钥大小。权衡是在计算开销和额外保护之间。
还建议使用支持经过身份验证的加密的批量加密算法,该算法除了密文之外还使用标签。标签的使用可以检测构造不正确的密文,例如,这些密文可能是专门为攻击而选择的。AES_GCM 和 AES_CBC 是支持身份验证加密的块密码的示例。
总而言之,符合这些建议的 TLSv1.2
密码示例包括
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
在 DeepStream 的 Kafka 配置文件中配置 TLS 选项#
Kafka 消息适配器为 librdkafka
库提供的配置选项需要针对 SSL 进行修改。Kafka 适配器部分中的 DeepStream 文档描述了提供这些配置选项的各种机制,但本节基于使用专用配置文件来介绍这些步骤。必须使用消息代理部分中的 proto-cfg
条目在配置文件中定义参数列表,如下例所示。
[message-broker]
proto-cfg = "security.protocol=ssl;ssl.ca.location=<path to your ca>/ca-client-cert;ssl.certificate.location=<path to your certificate >/client1_cert.pem;ssl.key.location=<path to your private key>/client1_private_key.pem;ssl.key.password=test1234;ssl.key. password=abcdefgh;
ssl.cipher.suites=ECDHE-RSA-AES256-GCM-SHA384; debug=broker,security"
配置文件中指定的各种选项如下所述
security.protocol.ssl
:使用 SSL 作为身份验证协议
ssl.ca.location
:客户端 CA 证书的存储路径
ssl.certificate.location
:客户端证书的存储路径
ssl.key.location
:受保护的私钥的存储路径
ssl.cipher.suites=ECDHE-RSA-AES256-GCM-SHA384
ssl.key.password
:从 p12 文件中提取私钥时提供的私钥密码
ssl.cipher.suites
选项允许用户选择用于连接到 broker 的密码。鉴于底层 librdkafka
库使用 OpenSSL,因此可以从 OpenSSL 文档中识别受支持的密码列表:https://www.openssl.org/docs/man1.0.2/man1/ciphers.html librdkafka
支持其他几个与安全相关的选项,这些选项可以作为 Kafka 适配器配置文件的一部分启用。有关选项的完整列表,请参阅 librdkafka
配置页面:edenhill/librdkafka
SASL/Plain#
DeepStream(5.0 及更高版本)为 Kafka 启用了基于 SASL/Plain 的身份验证机制。SASL/Plain 启用用户名/密码形式的身份验证。它通常与 TLS 一起使用以启用端到端加密,从而确保用户名密码凭据和后续数据传输都是机密的,这在 DeepStream 应用程序和 Kafka broker 之间的通信通过公共网络发生时尤其重要。
步骤概述#
本节提供在为 Kafka 启用 SASL/Plain 身份验证时的高级指导和注意事项。有关设置 SSL 安全性的详细设置说明,请参阅 DeepStream 5.0+ SDK 中 sources/libs/kafka_protocol_adaptor/
文件夹中的 Secure_Setup.md
文档。按照以下步骤为带有 Kafka 的 DeepStream 应用程序启用 SASL/Plain 身份验证
配置 Kafka broker 以使用 SASL/Plain 身份验证,以便将 SASL 身份验证与 SSL 一起用于加密
使用 Kafka broker 配置所需的用户名和密码
为 broker 创建和部署证书
将 CA 证书复制到 broker 和客户端 TrustStores
在 Kafka 配置文件中使用用户名和密码配置 DeepStream 应用程序(请参阅上面的
proto-cfg
参数)
TLS 配置#
请注意,与双向 TLS 身份验证不同,SASL/Plain 不需要客户端证书。相反,只需要 broker 的证书,DeepStream 应用程序使用这些证书来确保 broker 的真实性。为此,双向 TLS 部分中描述的 TLS 的各个方面(包括要使用的 TLS 版本、密钥生成和密码选择)均适用。
凭据存储#
用于创建和共享密码的标准准则适用于 SASL/Plain 凭据。使 Kafka SASL/Plain 凭据保密的选项包括使用基于文件系统的访问控制。存储凭据的 Kafka 配置文件可以加密存储在磁盘上,并在运行时解密并以明文形式存储有限的时间。
在双向 TLS 和 SASL/Plain 之间进行选择#
SASL/Plain 提供了熟悉的用户名和密码身份验证隐喻,可与 Kafka 一起使用。由于无需创建客户端证书,因此设置起来也可能更容易。但是,双向 TLS 具有多个优点,包括启用基于 CA 的允许客户端列表,这意味着来自同一组织的、使用共享 CA 的新客户端可以自动进行身份验证,而无需重新配置 broker。与密码不同,与双向 TLS 身份验证一起使用的私钥可以利用密钥存储硬件(如 HSM 和 TPM),这些硬件使用密钥执行加密操作,而无需泄露密钥本身。证书可以具有有限的到期时间,因此凭据在设计上必须定期更新,从而防止重复或盗窃。
对性能的影响#
启用基于 TLS 的安全性将在系统中的处理器上产生计算开销。多个方面会影响开销,包括消息大小、帧速率和密码套件的选择。虽然密码套件中的密钥交换算法在初始连接建立期间会产生一次性开销,但批量加密和消息身份验证算法在数据传输期间运行,因此需要考虑性能。例如,AES 提供两种变体,分别基于 128 位和 256 位密钥。虽然后者更安全,但会产生更大的性能开销。确保您的处理器支持 AES 指令;大多数现代 Xeon 处理器都支持,Jetson 的处理器也是如此。有关 Jetson 处理器的更多信息,请参阅 https://developer.nvidia.com/embedded/develop/hardware。
双向消息传递#
DeepStream(5.0 及更高版本)现在支持双向通信,以发送和接收云到设备消息以及发布设备到云消息。这对于各种用例尤其重要,例如触发应用程序记录重要事件、更改操作参数和应用程序配置、无线 (OTA) 更新,或请求系统日志和其他重要信息。DeepStream(5.0 及更高版本)支持其他几个 IoT 功能,这些功能可以与双向消息传递结合使用。DeepStream 现在提供了一个 API,用于基于异常或云到设备消息执行智能记录。此外,DeepStream 还支持在应用程序运行时 OTA 更新 AI 模型。下图显示了双向消息传递架构
可以通过在配置文件中添加以下组在 test5 应用程序中启用消息订阅者。
[message-consumerX]
enable=1
proto-lib=/opt/nvidia/deepstream/deepstream/lib/libnvds_kafka_proto.so
conn-str= <connection string as host;port >
config-file=../cfg_kafka.txt
subscribe-topic-list=<topic1>;<topic2>;<topicN>
此处 X 应替换为整数值,例如 0、1、2 等。
边缘到云#
设备到云消息传递当前通过 Gst-nvmsgbroker
(MSGBROKER) 插件进行。Gstnvmsgbroker
插件默认情况下使用适当的协议 API 调用较低级别的适配器库。您可以选择 Kafka、AMQP、Azure IoT、Redis,甚至可以创建自定义适配器。DeepStream 5.0 引入了一个新的低级别 nvmsgbroker
库,用于为跨各种协议的双向消息传递提供统一的接口。Gst-nvmsgbroker
插件可以选择与此新库进行接口,而不是直接调用协议适配器库,这通过配置选项进行控制。有关 Gst-nvmsgbroker 插件的详细信息,请参阅 DeepStream 插件开发指南。
云到边缘#
DeepStream 应用程序可以订阅 Apache Kafka topics 或 Redis streams 以接收来自云的消息。DeepStream 5.0 引入了一个新的低级别 nvmsgbroker
库。云到设备消息传递当前通过此库进行。nvmsgbroker
库使用适当的协议 API 调用较低级别的适配器库。您可以选择 Kafka、Redis,甚至可以创建自定义适配器。接收和处理云消息的实现可以在以下文件中找到
$DEEPSTREAM_DIR/sources/apps/apps-common/src/deepstream_c2d_msg.c
$DEEPSTREAM_DIR/sources/apps/apps-common/src/deepstream_c2d_msg_util.c
NvMsgbroker 库#
DeepStream(5.0 及更高版本)具有一个新的 nvmsgbroker
库,该库可用于与多个外部 brokers 建立连接。此库充当消息适配器库的包装器,并提供用于建立和关闭连接以及发布/订阅消息的 API。nvmsgbroker
库提供线程安全性,使 DeepStream 应用程序中的任意数量的组件可以使用相同的连接句柄来发布/订阅消息。Gst-msgbroker
插件可以选择直接调用适配器库 API 以连接外部实体,或使用 nvmsgbroker
库接口来同时连接多个外部实体。
自动重连功能#
DeepStream(6.0 及更高版本)具有自动重连功能,其中,如果与端点的网络连接断开,则在应用程序仍在运行时,会定期尝试与外部实体重新连接。此功能在低级别 nvmsgbroker
库中提供。cfg_nvmsgbroker.txt 中列出了适用于低级别 nvmsgbroker
库中引入的自动重连功能的配置。
$DEEPSTREAM_DIR/sources/libs/nvmsgbroker/cfg_nvmsgbroker.txt