paint-brush
如何通过 Kafka 移动端到端的加密数据经过@ockam
9,541 讀數
9,541 讀數

如何通过 Kafka 移动端到端的加密数据

经过 Ockam8m2023/04/19
Read on Terminal Reader

太長; 讀書

Ockam Orchestrator 的 Confluent 附加组件可通过 Confluent Cloud 实现防篡改和端到端加密消息流。嵌入式解决方案使公司能够超越常见的安全性和合规性要求,而无需进行昂贵的重新架构或开发工作。
featured image - 如何通过 Kafka 移动端到端的加密数据
Ockam HackerNoon profile picture

Ockam Orchestrator 的 Confluent 附加组件通过 Confluent Cloud 实现防篡改和端到端加密消息流,零代码更改。嵌入式解决方案使公司能够超越常见的安全性和合规性要求,而无需进行昂贵的重新架构或开发工作。


Kafka 部署通常结合身份验证令牌和传输层安全性 (TLS) 来保护进出 Kafka 主题的数据。虽然这确实保护了通过 Internet 传输的数据,但它并没有提供一个完整的解决方案来保护通过Kafka 传输的数据。 Kafka 代理将能够暂时看到明文数据。


如果 Kafka 代理或其运行的基础设施遭到破坏,则在 Kafka 内部加密进出 Kafka 代理的通信以及静态数据加密将不足以防止数据泄露,因为明文数据和解密数据的密钥在内存中可用。 Ockam 解决了这些问题,同时通过 Ockam Orchestrator 的 Confluent 插件提供额外的风险缓解优势和数据完整性保证。

相信您的动态数据


您的团队已决定将流处理平台集成到您的系统中是满足业务规模和敏捷性需求的最佳方式,而 Apache Kafka 是该平台的不二之选。您还决定利用 Confluent Cloud 中经验丰富的托管平台,以便您的团队可以专注于增加价值而不是运行基础设施。开发完成,团队有了一个可行的解决方案,生产者可以将数据发送到 Confluent Cloud,消费者可以在另一端接收数据。您的生产者、消费者和 Confluent Cloud 之间的通信使用传输层安全性 (TLS) 进行了加密和保护,因此您将继续将事物转移到生产使用中。


安全和合规审查发现了一个问题。虽然信任 Confluent Cloud,但对降低供应链风险的日益关注意味着让数据在未加密的情况下通过其系统传输不再满足您的安全要求。如果供应链中的其他供应商存在安全漏洞,您如何降低业务风险?您需要能够确保:


  1. 第三方无法在传输过程中读取数据
  2. 第三方无法在传输过程中修改数据
  3. 只有经过身份验证和授权的方才能生成数据


如果没有针对这两种情况的解决方案,您自己的供应链中的安全漏洞可能不仅会暴露您的敏感数据,还会导致其自身的下游意外升级。

无需更改代码即可集成

让我通过一个完整的工作示例向您展示如何在短短几分钟内配置和集成一个完整的端到端解决方案,确保您的数据在通过 Kafka 和 Confluent 移动时始终加密和防篡改.


注意:随着我们不断改进开发人员体验,下面的代码示例可能会发生变化。请查看https://docs.ockam.io/以获得最新的文档。

Ockam 的初始设置

如果您之前设置过 Ockam,则可以跳过此部分并直接转到下面的两个示例。


 brew install build-trust/ockam/ockam

(如果您不使用 brew 进行包管理,我们有其他系统的安装说明在我们的文档中)


安装后,您需要使用 Ockam Orchestrator 注册您的本地身份,运行以下命令并按照提供的说明进行操作:


 ockam enroll

配置 Confluent 插件

我们在这里假设您已经在 Confluent Cloud 上拥有一个工作集群(以及随附的 Kafka 命令行工具)最新的 Kafka 发行版),因此第一步是将 Ockam 项目配置为使用 Confluent 附加组件,方法是将其指向引导服务器地址:


 ockam project addon configure confluent \ --bootstrap-server YOUR_CONFLUENT_CLOUD_BOOTSTRAP_SERVER_ADDRESS


然后我们需要保存我们的 Ockam 项目配置,以便我们稍后可以使用它来注册我们的生产者和消费者,因此将输出保存到文件名project.json


 ockam project information default --output json > project.json


作为 Ockam 项目的管理员,您可以通过颁发唯一的一次性使用注册令牌来控制允许哪些其他身份将自己注册到您的项目中。我们将从为我们的消费者创建一个开始:


 ockam project enroll --project-path project.json --attribute role=member > consumer.token


...然后是第一个生产者:


 ockam project enroll --project-path project.json --attribute role=member > producer1.token


我们需要生成的最后一个配置文件是kafka.config ,它将用于存储用于访问 Confluent Cloud 上的集群的用户名和密码:


 cat > kafka.config <<EOF request.timeout.ms=30000 security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required \ username="YOUR_CONFLUENT_CLOUD_USER_NAME" \ password="YOUR_CONFLUENT_CLOUD_PASSWORD"; EOF

配置消费者以接收加密消息

在您的消费者节点上,您将首先创建一个新身份(您需要安装 Ockam 命令,因此如果您在单独的主机上执行此操作,请重复安装说明):


 ockam identity create consumer


复制上一节中的project.jsonconsumer.token文件,然后使用它们验证此身份并将其注册到您的 Ockam 项目中:


 ockam project authenticate \ --project-path project.json \ --identity consumer \ --token $(cat consumer.token)


Ockam 节点是一种安全连接不同服务的方式,因此我们将在此处创建一个节点,我们将使用我们刚刚创建的身份通过 Confluent Cloud 集群进行通信:


 ockam node create consumer \ --project project.json --identity consumer


完成后,我们现在可以公开我们的 Kafka 引导服务器。这就像远程 Kafka 引导服务器和代理在localhost:4000上变得几乎相邻:


 ockam service start kafka-consumer \ --node consumer \ --project-route /project/default \ --bootstrap-server-ip 127.0.0.1 \ --bootstrap-server-port 4000 \ --brokers-port-range 4001-4100


复制kafka.config文件,并使用它来创建一个新主题,我们将使用该主题在本演示中的生产者和消费者之间发送消息(在这种情况下,我们将主题称为demo-topic


 kafka-topics.sh \ --bootstrap-server localhost:4000 \ --command-config kafka.config \ --create \ --topic demo-topic \ --partitions 3


最后一步是启动我们的消费者脚本,将其指向localhost:4000作为我们的引导服务器:


 kafka-console-consumer.sh \ --topic demo-topic \ --bootstrap-server localhost:4000 \ --consumer.config kafka.config


消费者代码会将所有通信推送到在本地主机上运行的 Ockam 节点进程。该本地 Ockam 进程将自动管理加密密钥的生成,建立与任何生产者节点通信的安全通道,然后接收、解密和转发从我们的 Confluent Cloud 集群上运行的代理接收的任何消息。

从多个生产者发送加密消息

为了让我们的消费者处理消息,我们需要有一些东西来产生它们。我们现在将经历一个非常相似的过程,但是创建生产者所需的部分。我们通过在生产者的主机上创建一个身份再次开始(如果需要,再次在该主机上安装 Ockam 命令):


 ockam identity create producer1


复制前面部分中的project.jsonproducer1.token文件,并使用它来验证和注册我们的 Ockam 项目:


 ockam project authenticate \ --project-path project.json \ --identity producer1 \ --token $(cat producer1.token)


创建一个节点并将其链接到我们创建的项目和身份:


 ockam node create producer1 \ --project project.json \ --identity producer1


并在端口5000上公开我们的 Kafka 引导服务器,以便我们可以开始通过 Confluent Cloud 发送消息:


 ockam service start kafka-producer \ --node producer1 \ --project-route /project/default \ --bootstrap-server-ip 127.0.0.1 \ --bootstrap-server-port 5000 \ --brokers-port-range 5001-5100


确保复制kafka.config文件,并启动你的生产者:


 kafka-console-producer.sh \ --topic demo-topic \ --bootstrap-server localhost:5000 \ --producer.config kafka.config


您现有的生产者代码现在将运行,通过我们创建的安全门户与代理通信,该门户在本地端口上公开了 Kafka 引导服务器和 Kafka 代理,并将消息发送到在上一步中设置的消费者。但是,所有消息有效负载在进入生产者节点时都将被透明地加密,并且在它们退出消费者节点之前不会被解密。在传输过程中,代理无法看到最初由生产者发送的明文消息负载。


要进一步了解此示例,您可以为N个生产者重复此步骤,方法是为每个生产者生成一个新的注册令牌,然后重复本节中的步骤。


如果您查看 Confluent Cloud 中的加密消息,它们将呈现为无法识别的字符,如下面的屏幕截图所示:

在 Confluent Cloud 中写入 Kafka 演示主题的端到端加密消息

端到端加密消息流

一个只需几分钟即可实施的示例意味着很容易错过这种方法对安全性和完整性的一些重要改进:


  • 每个身份的唯一密钥:每个消费者和生产者生成自己的加密密钥,并获得自己的唯一凭证。然后他们使用这些在彼此之间建立相互信任的安全通道。通过消除对第三方服务存储或分发密钥的依赖,您可以减少漏洞表面积并消除单点故障。


  • 防篡改数据传输:通过将密钥控制推向系统边缘,在此处进行经过身份验证的加密和解密,供应链中的任何其他方都无法修改传输中的数据。您可以放心,您在消费者处收到的数据正是您的生产者发送的数据。您还可以放心,只有授权的生产者才能写入主题,确保您主题中的数据高度可信。如果您有更严格的要求,您可以控制您的凭证权限并执行精细的授权策略。


  • 减少曝光窗口:Ockam 安全通道定期轮换身份验证密钥和会话机密。这种方法意味着,如果其中一个会话秘密被暴露,您的总数据暴露窗口将被限制在该秘密被使用的一小段时间内。轮换身份验证密钥意味着即使生产者的身份密钥被泄露,也不会泄露历史数据。您可以有选择地删除受感染的生产者及其数据。使用集中式共享密钥分发方法时,存在所有当前和历史数据在泄露后无法信任的风险,因为它们可能已被篡改或被盗。 Ockam 的方法消除了泄露历史数据的风险,并使用自动轮换密钥将未来数据的风险降至最低。


今天,所有这些好处都是可能的,无需更改代码,对现有部署的配置更改也最少。

下一步

  • 如果您还没有按照本指南中的示例进行操作,您可以开始使用 Ockam按照我们文档中的说明免费使用。
  • 如果您想专门讨论 Ockam 的这个或其他潜在用例,团队将非常乐意和你聊天.
  • 或者,您可以加入我们,以及一个不断壮大的开发人员社区,他们希望通过制作设计安全的应用程序来建立信任,在建立信任 Discord 服务器或在Github .


也发布在这里