在这篇文章中,将演示如何将 Kafka Connect 集成到 Cloudera 数据平台 (CDP) 中,从而允许用户在 Streams Messaging Manager 中管理和监控他们的连接器,同时还涉及安全功能,例如基于角色的访问控制和敏感信息处理。如果您是将数据移入或移出 Kafka 的开发人员、管理员或安全专家,那么这篇文章适合您。但在我介绍细节之前,让我们先从基础开始。
Kafka Connect
就本文而言,知道 Kafka Connect 是一个强大的框架就足够了,它可以大规模地将数据传入和传出 Kafka,同时需要最少的代码,因为 Connect 框架已经处理了连接器的大部分生命周期管理。事实上,对于最流行的源和目标系统,已经开发了可以使用的连接器,因此不需要代码,只需要配置。
核心构建块是:连接器,它协调单个源和单个目标(其中一个是 Kafka)之间的数据移动;负责实际数据移动的任务;以及管理所有连接器生命周期的工作人员。
Kafka 允许本地支持部署和管理连接器,这意味着在启动 Connect 集群后提交连接器配置和/或管理已部署的连接器可以通过 Kafka 公开的 REST API 完成。Streams Messaging Manager (SMM) 建立在此之上,并提供了一个用户友好的界面来替换 REST API 调用。
Streams Messaging Manager(SMM)
免责声明:本文中的描述和屏幕截图是使用 CDP 7.2.15 制作的,因为 SMM 正在积极开发中;支持的功能可能会因版本而异(例如可用的连接器类型)。
SMM 是 Cloudera 用于监控 Kafka 及相关服务并与之交互的解决方案。SMM UI 由多个选项卡组成,每个选项卡都包含不同的工具、功能、图表等,您可以使用它们来管理和获得有关 Kafka 集群的清晰见解。本文重点介绍 Connect 选项卡,该选项卡用于与 Kafka Connect 进行交互和监控。
创建和配置连接器
在进行任何监控之前,第一步是使用右上角的 New Connector 按钮创建一个连接器,该按钮导航到以下视图:
左上角显示了两种类型的连接器模板:
将数据摄取到的源和从 Kafka 中提取数据的接收器。默认情况下,源模板选项卡处于选中状态,因此会显示我们集群中可用的源连接器模板。请注意,此页面上的卡片并不代表部署在集群上的连接器实例,而是表示可用于部署在集群上的连接器类型。例如,有一个 JDBC Source 连接器模板,但这并不意味着当前有一个 JDBC Source 连接器将数据移动到 Kafka,它只是意味着所需的库已经到位以支持部署 JDBC Source 连接器。
选择连接器后,将显示连接器表单。
连接器 表单用于配置您的连接器。CDP 中默认包含的大多数连接器都附带示例配置以简化配置。模板中包含的属性和值取决于所选的连接器。通常,每个示例配置都包含连接器工作最可能需要的属性,并且已经存在一些合理的默认值。如果模板可用于特定连接器,则在您选择连接器时它会自动加载到连接器表单中。上面的示例是 Debezium Oracle Source 连接器的预填充表单。
让我们看看连接器表单在配置连接器时提供的功能数量。
添加、删除和配置属性
表单中的每一行代表一个配置属性及其值。可以通过使用属性名称及其配置值填充可用条目来配置属性。可以使用加号/垃圾箱图标添加和删除新属性。
查看和编辑大型配置值
您为某些属性配置的值可能不是短字符串或整数;一些值可以变得相当大。例如,无状态 NiFi 连接器需要flow.snapshot属性,其值是 JSON 文件的全部内容(想想:数百行)。可以通过单击“编辑”按钮在模式窗口中编辑此类属性。
隐藏敏感值
默认情况下,属性以明文形式存储,因此任何有权访问 SMM 并具有适当授权的人都可以看到它们。
配置中可能存在用户不想从系统中泄露的密码和访问密钥等属性;为了保护系统中的敏感数据,可以使用 Lock 图标将这些数据标记为机密,这可以实现两件事:
- 该属性的值将隐藏在 UI 上。
- 该值将被加密并以安全的方式存储在后端。
注意:标记为机密的属性无法使用“编辑”按钮进行编辑。
稍微深入了解一下技术细节,不仅对值进行了简单的加密,而且用于加密值的加密密钥也用全局加密密钥包装,以增加一层保护。即使全局加密密钥泄露,加密的配置也可以很容易地重新加密,用 Cloudera 提供的工具替换旧的全局密钥。有关更多信息,请参阅Kafka Connect Secrets 存储。
导入和增强配置
如果您已经准备好本机 的Kafka Connect 配置,则可以使用 Import Connector Configuration 按钮复制和粘贴它,或者使用模式窗口从文件系统中浏览它。
此功能对于将 Kafka Connect 工作负载迁移到 CDP 中特别有用,因为只需单击一个按钮即可导入现有的连接器配置。
在导入时,甚至可以使用“ 导入和增强”按钮来增强配置。增强将添加最可能需要的属性,例如:
- 与示例配置相比缺少的属性。
- StatelessNiFi 连接器的 flow.snapshot 的属性。
验证配置
在右上角,您可以看到“验证”按钮。在部署连接器之前验证配置是强制性的。如果您的配置有效,您将看到“配置有效”消息,并且 将启用下一步按钮以继续进行连接器部署。如果没有,错误将在连接器表单中突出显示。通常,您会遇到四种类型的错误:
- 一般配置错误与特定属性无关的错误出现在错误部分的表单上方。
- 缺少属性有关缺少配置的错误也出现在错误部分,带有实用程序按钮添加缺少的配置,这正是这样做的:将缺少的配置添加到表单的开头。
- 特定于属性的错误特定于属性的错误(显示在相应的属性下)。
- 多行错误如果单个属性有多个错误,则会在该属性下方显示多行错误。
监控
为了演示 SMM 对 Kafka Connect 的监控功能,我设置了两个 MySql 连接器:“sales.product_purchases”和“monitoring.raw_metrics”。现在这篇文章的目的是展示 Kafka Connect 是如何集成到 Cloudera 生态系统中的,所以我不会深入介绍如何设置这些连接器,但是如果你想跟随你可以在这些文章中找到详细的指导:
MySQL CDC 与 CDP 公共云中的 Kafka Connect/Debezium
在 Cloudera 环境中使用安全的 Debezium 连接器
现在让我们深入了解一下我之前开始创建连接器的“连接”页面。在连接器页面上有连接器的摘要以及一些整体统计信息,例如有多少连接器正在运行和/或失败;这有助于一目了然地确定是否有任何错误。
在总体统计信息部分下方有三列,一列用于 Source Connectors,一列用于 Topics ,另一列用于 Sink Connectors。第一个和最后一个代表已部署的连接器,而中间的一个显示这些连接器与之交互的主题。
要查看哪个连接器连接到哪个主题,只需单击连接器,就会出现一个图表。
除了基于连接器状态/名称进行过滤和查看连接器类型之外,一些用户甚至可以通过将鼠标悬停在各自的磁贴上来对连接器执行快速操作。
眼尖的人已经注意到在整体统计部分和连接器部分之间有一个连接器/集群配置文件导航按钮。
通过单击 Cluster Profile 按钮,可以查看工作人员级别的信息,例如在工作人员上部署了多少连接器、连接器/任务级别的成功/失败率等等。
在“连接器”选项卡上有一个带齿轮的图标,按下该图标将导航到“连接器配置文件”页面,可以在其中查看该特定连接器的详细信息。
在顶部,可以一目了然地查看评估连接器状态所需的信息,例如状态、正在运行/失败/暂停的任务以及工作人员所在的主机。如果连接器处于故障状态,也会显示导致异常的消息。
使用位于右上角的按钮,也可以从此页面(对于某些用户)管理连接器或创建新连接器。
在任务部分,任务级别的指标是可见的,例如:任务写入了多少字节,与记录相关的指标,以及任务处于运行或暂停状态的程度,以及发生错误时堆栈错误的踪迹。
连接器配置文件 页面有另一个称为连接器设置的选项卡,用户可以在其中查看所选连接器的配置,一些用户甚至可以对其进行编辑。
保护 Kafka Connect
保护连接器管理
正如我之前一直暗示的那样,有些操作并非对所有用户都可用。假设有一家公司通过网站销售某种商品。可能有一个团队监控部署网站的服务器,一个监控交易并根据不断增长的需求提高产品价格或在需求下降的情况下设置优惠券的团队。这两支队伍有非常不同的专业技能组合,因此可以合理地预期他们无法修补彼此的连接器。这就是 Apache Ranger 发挥作用的地方。
Apache Ranger 允许通过图形用户界面对各种资源(服务、文件、数据库、表和列)进行授权和审计,并确保授权在 CDP 堆栈组件之间保持一致。在 Kafka Connect 的情况下,它允许对哪个用户或组可以对特定连接器执行哪个操作进行细粒度控制(这些特定连接器可以通过正则表达式确定,因此无需一一列出)。
Kafka Connect 的权限模型如下表所示:
资源 | 权限 | 允许用户… |
---|---|---|
集群 | 查看 | 检索有关服务器的信息,以及可以部署到集群的连接器类型 |
管理 | 与运行时记录器交互 | |
验证 | 验证连接器配置 | |
连接器 | 查看 | 检索有关连接器和任务的信息 |
管理 | 暂停/恢复/重新启动连接器和任务或重置活动主题(这是连接概述页面中间列中显示的内容) | |
编辑 | 更改已部署连接器的配置 | |
创建 | 部署连接器 | |
删除 | 删除连接器 |
Ranger 中的每个权限都意味着 Cluster-view 权限,因此不需要显式设置。
在前面的示例中,我使用管理员用户登录,该用户有权对每个连接器执行所有操作,所以现在让我们创建一个用户 ID为mmichelle的用户,该用户是监控组的一部分,并在 Ranger 中配置监控组以拥有每个具有名称匹配正则表达式监控的连接器的权限。* 。
现在,在以mmichelle身份登录并导航到连接器页面后,我可以看到名为sales.*的连接器已经消失,并且如果我尝试部署一个名称以监视以外的名称开头的连接器。部署步骤将失败,并显示错误消息。
让我们更进一步:销售团队正在成长,现在需要区分分析 Kafka 中数据的分析师、支持监控销售连接器的人员并帮助分析师进行技术查询、可以管理连接器的后端支持人员,和管理员,他们可以根据分析师的需要部署和删除销售连接器。
为了支持这个模型,我创建了以下用户:
团体 | 用户 | 连接器匹配正则表达式 | 权限 |
---|---|---|---|
销售 分析师 | ssamuel | * | 没有任何权限 |
销售 支持 | ssarah | sales.* | 连接器 –查看 |
销售 后台 | ssebastian | sales.* | 连接器 –查看/管理 |
销售 管理员 | sscarlett | sales.* | 连接器 -查看/管理/编辑/创建/删除集群 -验证 |
如果我使用 sscarlett 登录,我会看到与mmichelle相似的图片;唯一的区别是她可以与名称以“ sales.”开头的连接器进行交互。”。
因此,让我们以ssebastian 身份登录并观察以下按钮已被删除:
- 连接器概览和连接器配置文件页面中的新连接器按钮。
- 连接器配置文件页面中的删除按钮。
- 连接器设置页面上的编辑按钮。
ssarah也是如此,但除此之外,她也没有看到:
- 连接器概览页面的连接器悬停弹出窗口或连接器配置文件页面上的暂停/恢复/重新启动按钮。
- 连接器配置文件的任务部分上的重新启动按钮被永久禁用。
更不用说可以登录但甚至看不到单个连接器的 ssamuel 。
这不仅适用于 UI;如果来自销售的用户绕过 SMM UI 并尝试直接通过 Kafka Connect REST API 操作监控组的连接器(或任何其他不允许的连接器),则该人将收到来自后端的授权错误。
保护 Kafka 主题
此时,如果 Sink 连接器停止从 Kafka 后端支持移动消息并且管理员无法检查是否因为没有更多消息生成到主题或其他原因,则没有用户可以直接访问 Kafka 主题资源。Ranger 也有权授予对 Kafka 资源的访问权限。
让我们进入 Ranger UI 上的 Kafka 服务,并为之前用于 Kafka Connect 服务的销售管理员和销售后端组设置适当的权限。我可以授予与*正则表达式匹配的主题的访问权限,但在这种情况下,sscarlet和ssebastian也可能会意外地与监控组的主题进行交互,所以让我们让他们访问production_database.sales.*和sales.*主题.
现在,销售连接器与之交互的主题出现在 SMM UI 的主题选项卡上,他们可以使用 Data Explorer 查看它们的内容。
保护连接器对 Kafka 的访问
SMM(和 Connect)使用授权来限制可以管理连接器的用户组。但是,连接器在 Connect Worker 进程中运行,并使用与用户凭据不同的凭据来访问 Kafka 中的主题。
默认情况下,连接器使用 Connect worker 的 Kerberos 主体和 JAAS 配置来访问 Kafka,它对每个 Kafka 资源都具有所有权限。因此,使用默认配置,有权创建连接器的用户可以将该连接器配置为读取或写入集群中的任何主题。
为了规范这一点,Cloudera 引入了kafka.connect.jaas.policy.restrict.connector.jaas属性,如果设置为“true”,则禁止连接器使用连接工作者的Principal。
在 Cloudera Manager 中启用此功能后,以前工作的连接器已停止工作,迫使连接器管理员使用sasl.jaas.config属性覆盖连接器工作的Principal:
为了修复这个异常,我为连接器 ( sconnector)创建了一个共享用户,并使用以下文章在 Kafka 集群上启用了 PAM 身份验证:
如何配置客户端以安全地连接到 Apache Kafka 集群 - 第 3 部分:PAM 身份验证。
在接收连接器的情况下,客户端配置以consumer.override为前缀;在源连接器的情况下,客户端配置以producer.override为前缀(在某些情况下也可能需要admin.override. )。
所以对于我的 MySqlConnector 我设置
代码语言:javascript复制producer.override.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username=”sconnector” password=”<secret>”;
这将导致连接器使用 PLAIN 凭据访问 Kafka 主题,而不是使用默认的 Kafka Connect 工作的Principal的身份。
为了避免泄露敏感信息,我还使用锁定图标将producer.override.sasl.jaas.config设置为机密。
不鼓励使用存储在 Kafka Connect Worker 的文件系统上的机密(例如 Kerberos 密钥表文件)进行身份验证,因为无法单独设置连接器的文件访问权限,只能在工作人员级别设置。换句话说,连接器可以访问彼此的文件,从而使用彼此的秘密进行身份验证。
结论
在本文中,我介绍了 Kafka Connect 如何与 Cloudera Data Platform 集成,如何通过 Streams Messaging Manager 创建和管理连接器,以及用户如何利用 CDP 7.2.15 中提供的安全功能。如果您有兴趣并想试用 CDP,您可以通过链接https://www.cloudera.com/campaign/try-cdp-public-cloud.html使用 CDP 公共云,免费试用 60 天。
链接:
保护 JAAS 覆盖
Kafka Connect 秘密存储
如何配置客户端以安全地连接到 Apache Kafka 集群 - 第 3 部分:PAM 身份验证
MySQL CDC 与 CDP 公共云中的 Kafka Connect/Debezium
在 Cloudera 环境中使用安全的 Debezium 连接器
原文作者:Laszlo Hunyady
原文链接:https://blog.cloudera.com/using-kafka-connect-securely-in-the-cloudera-data-platform/