在这篇博客中,我将尽力用每个人都能理解的术语解释Kafka的安全性。我们将讨论SSL、SASL和ACL。
参考:
https://www.confluent.io/blog/tag/security/
Apache Kafka和安全的必要性
Apache Kafka是一个内部中间层,使你的后端系统能够通过Kafka主题互相分享实时数据。通过标准的Kafka设置,任何用户或应用程序都可以向任何主题写入任何消息,也可以从任何主题读取数据。随着公司走向共享租约模式,即多个团队和应用程序使用同一个Kafka集群,或者你的Kafka集群开始记录一些关键和机密信息,你需要实现安全。
安全解决的问题
Kafka安全有三个组件:
- 使用SSL/TLS对传输中的数据进行加密:这是每个人在上网时都使用的一种常见的模式。这就是HTTPS的 “S”(网上随处可见漂亮的绿色锁)。
- 使用SSL或SASL进行认证:这允许你的生产者和消费者对你的Kafka集群进行认证,从而验证他们的身份。这也是一种安全的方式,使你的客户能够确认一个身份。为什么要这样做?为了授权。
- 使用ACL进行授权:认证后就可以访问资源。
加密(SSL)
加密解决了中间人(MITM)攻击的问题。如果你的数据是PLAINTEXT(在Kafka中是默认的),任何一个路由器都可以读取发送的数据。
初学者的SSL加密
这些概念在我的Udemy Kafka安全课程中都有仔细的讲授和实践,但在这篇博客中,我们将介绍下安全工作的原理。
认证(SSL和SASL)
初学者的认证
有两种方法来验证你的Kafka客户端和Broker。SSL和SASL。让我们来看看这两种方式:
SSL认证
SSL Auth基础是利用了SSL的一种能力,称为双向认证。这个想法会给你的客户颁发证书,证书由证书颁发机构签名,这使得Kafka Broker可以验证客户的身份。
当你用Heroku、Confluent Cloud或CloudKarafka等供应商提供的能力管理Kafka集群时,这是我见过最常见的设置。
SASL认证
SASL代表简单授权服务层,相信我这个名字是骗人的,事情没有那么简单。它在大数据系统中非常流行,很可能你设置Hadoop时已经利用了这一点。
- **SASL PLAINTEXT:**这是一个经典的用户名/密码组合。这些用户名和密码必须事先存储在Kafka Broker上,每次改变都需要触发滚动重启。这是非常麻烦的,也不是推荐的那种安全方式。如果你使用SASL/PLAINTEXT,请确保启用SSL加密,这样凭证就不会在网络上以PLAINTEXT的形式发送。
- SASL SCRAM: 这是用户名/密码组合和一个挑战(盐值),这使得它更安全。在此基础上,用户名和密码的哈希值被存储在Zookeeper中,这允许你在不重启经纪商的情况下扩展安全性。如果你使用SASL/SCRAM,请确保启用SSL加密,这样凭证就不会在网络上以PLAINTEXT形式发送。
- SASL GSSAPI (Kerberos): 这是基于Kerberos票据机制,这是一种非常安全的认证方式。微软Active Directory是最常见的Kerberos实现。SASL/GSSAPI是大公司的最佳选择,因为它允许公司从其Kerberos服务器内管理安全。此外,通信被加密到SSL加密是SASL/GSSAPI的可选方案。不用说,用Kerberos设置Kafka是最复杂的选择,但最终还是值得的。
授权(ACL)
这就是授权的作用,由访问控制列表 (ACL) 控制。 ACL如你所期望的:用户 A 不能(不能)对来自主机 D 的资源 C 执行操作 B。请注意,当前使用 Kafka 附带的 SimpleAclAuthorizer,ACL 没实现具有组规则或基于正则表达式 规则。
ACL很强大,因为它可以帮助你预防灾难。例如,你可能有一个主题,需要只从一个客户端或主机中写入。你要防止你的普通用户向这些主题写入任何东西,从而防止任何数据损坏或反序列化错误。如果你有一些敏感数据,你需要向监管机构证明只有某些应用程序或用户可以访问这些数据,那么ACL很不错。
要添加ACL,你可以使用kafka-acls命令(文档在这里)。它有一些快捷方式来添加生产者或消费者。
kafka-acl --topic test --producer --authorizer-properties zookeeper.connect=localhost:2181 --add --allow-principal User:alice
复制
结果是:
Adding ACLs for resource `Topic:test`: User:alice has Allow permission for operations: Describe from hosts: * User:alice has Allow permission for operations: Write from hosts: *Adding ACLs for resource `Cluster:kafka-cluster`: User:alice has Allow permission for operations: Create from hosts: *
复制
请注意,使用默认提供的SimpleAclAuthorizer,你的ACL会存储在Zookeeper中。因此,必须确保Zookeeper的安全,并确保只有Kafka Broker被允许写入Zookeeper(zookeeper.set.acl=true)。否则任何用户都可以进来修改ACL,从而破坏了安全性。
最后,从长远来看,你可能会发现 kafka-acls 命令很难用。
原文标题: Introduction to Apache Kafka Security 🔒
原文作者: Navdeep Parash
原文地址:https://blog.knoldus.com/introduction-to-apache-kafka-security-%f0%9f%94%92/
评论

