SASL/Oauthbearer 比在客户端应用程序中配置用户名/密码的 SASL/PLAIN 更安全。万一用户凭据被泄露,爆炸半径会更显着,因为用户可能拥有其他访问权限。在 SASL/OAUTHBEARER 中,首选服务帐户,这会减少泄漏的爆炸半径。建议每个客户端应用程序有一个服务帐户。使用服务帐户,可以快速将重置凭据与用户凭据进行比较。
您还可以通过OAuth在 SASL/PLAIN 中使用服务帐户,这解决了密钥轮换问题。在图 1 中,您可以看到这两个流程。起初,建立一个连接需要 4 次往返,而在 OAuth over SASL 中,客户端向授权服务器发出令牌请求并将令牌发送到 Kafka 代理/资源服务器,这样既高效又减少了爆炸半径更少的啤酒花。要更好地了解线程模型和风险,请参阅OAuth 2.0 威胁模型和安全注意事项。
在图 2 中,我使用了两个Python客户端:producer
producer_oauth.py和consumer
consumer_oauth.py。对于 Apache Kafka 和服务注册表,Red Hat OpenShift Streams for Apache Kafka 和 Red Hat OpenShift Service Registry 允许创建即用型开发人员实例,并支持开箱即用的 SASL/OAUTHBEARER 和 SASL/PLAIN 安全机制通过 OAuth 和轻松的配置管理。
创建一个 Kafka 实例并登录到 RedHat 混合云控制台。在应用程序和数据服务目录下选择“Stream for Apache Kafka”。单击“Kafka 实例”。在图 3 中,您可以看到我已经创建了一个名为kafka-instance 的实例。您可以使用任何允许的名称。
一旦状态显示为就绪状态,单击 kebab 图标(三个垂直点)以查看连接详细信息,如图 3 所示。
复制 Bootstrap Server URL 并为其创建导出或复制以供以后使用,可用于运行生产者/消费者客户端。
现在,单击“创建服务帐户”按钮以创建服务客户端 ID 和密码。使用服务帐户 clientId 和密钥。您可以通过向授权服务器(在本例中为 Red Hat SSO)发出客户端凭据授予请求来检索访问令牌。
导航到 Kafka Instances 部分,然后单击您创建的实例。让我们创建一个主题。在图 6 中,我创建了一个名为“test”的主题。您可以选择任何首选名称。
分配对上一节中创建的服务帐户的访问权限。在图 7 中,我分配了对主题“test”的访问权限,并为 Consumer 组添加了权限。为简单起见,我分配了通配符 (*) 权限;但您可以分配细粒度的权限。
让我们通过导航到应用程序和数据服务目录中的“服务注册表”来创建一个服务注册表。在图 8 中,我创建了一个“test-registry”实例。
对于 Confluence Python 客户端,复制“Schema Registry compatible API”,如图 11 所示。该 API URL 可以供模式注册表客户端在执行序列化/反序列化时访问模式。
分配服务帐户访问此架构注册表的权限。如图 12 所示,导航到Access仪表板,然后单击“Grant access”按钮。
帐户下拉部分中选择服务帐户,并根据图 13 中所示的用例将其分配为“查看器”或“管理器”。
在图 14 中,您可以看到 Python 生产者客户端使用“SASL/OAUTHBEARER”的配置要求,服务帐户通过命令行参数传递为client_id
、client_secrets
和授权服务器令牌 URL。
当客户端尝试建立连接时,该方法get_token
将使用授权服务器令牌 URLclient credentials
向授权服务器发出授权请求。在这种情况下,授权服务器是 Red Hat SSO。请求成功后,返回一个访问令牌,该令牌可以与生产消息请求一起发送到 Kafka 代理。 client_id
client_secrets