.NET Core如何通过认证机制访问Kafka?

b7c211006a2d04c6da567321e43dcce9.jpeg

【.NET Core】| 总结/Edison Zhou


大家好,我是Edison。

最近有一个ASP.NET Core使用认证机制访问Kafka的需求,加之我们又使用了CAP这个开源项目使用的Kafka,于是网上寻找了一番发现对应资料太少,于是调查了一番,做了如下的笔记,希望对你有用。

背景

在实际场景中,开发环境的Kafka服务器一般没有要求通过认证即可发布和读取消息,并且还可以随意创建Topic和Consumer Group。但是,在生产环境中则一般有较强的安全需求,无法随意创建Topic和Consumer,还做了一些认证和权限约束。而在ASP.NET Core的解决方案中,我们经常使用到CAP这个开源项目作为事件总线,在CAP.Kafka项目中,只提供了最基础的Servers配置,文档示例中也只给出了这种只适合开发环境的配置示例,而对于对安全要求较高的生产环境,则需要我们研究一下Kafka官方的配置文档,在CAP.Kafka的MainConfig对象中进行主动配置Key/Value。

本文会首先介绍一下Kafka的认证机制,然后会给出基于CAP项目通过认证方式访问Kafka的示例。

Kafka认证机制

自 0.9.0.0 版本开始,Kafka 正式引入了认证机制,用于实现基础的安全用户认证,这是将 Kafka 上云或进行多租户管理的必要步骤。目前Kafka的版本,已支持基于 SSL 和 基于 SASL 的安全认证机制。

基于 SSL 的认证主要是指 Broker 和客户端的双路认证(2-way authentication)。通常来说,SSL 加密(Encryption)已经启用了单向认证,即客户端认证 Broker 的证书(Certificate)。如果要做 SSL 认证,那么我们要启用双路认证,也就是说 Broker 也要认证客户端的证书。

Note:Kafka 的源码中依然是使用 SSL 而不是 TLS 来表示这类东西的。不过,今天出现的所有 SSL 字眼,我们都可以认为它们是和 TLS 等价的。

Kafka 还支持通过 SASL 做客户端认证。SASL 是提供认证和数据安全服务的框架。Kafka 支持的 SASL 机制有 5 种:

  • GSSAPI:也就是 Kerberos 使用的安全接口,是在 0.9 版本中被引入的。

  • PLAIN:是使用简单的用户名 / 密码认证的机制,在 0.10 版本中被引入。

  • SCRAM:主要用于解决 PLAIN 机制安全问题的新机制,是在 0.10.2 版本中被引入的。

  • OAUTHBEARER:是基于 OAuth 2 认证框架的新机制,在 2.0 版本中被引进。

  • Delegation Token:补充现有 SASL 机制的轻量级认证机制,是在 1.1.0 版本被引入的。

在实际应用中,一般建议 使用 SSL 来做通信加密,使用 SASL 来做 Kafka 的认证实现。对于小型公司来说,SASL/PLAIN 的配置和运维成本相对较小,比较适合Kafka集群配置

下图将这些认证机制进行了汇总,源自极客时间胡夕《Kafka核心技术与实战》。

d9eed96a3838b20ba9ea08e4c65ea3a8.png

通过认证机制使用Kafka

这里假设我们已经搭建好了一个Kafka集群,并且配置了SASL/PLAIN方式,并且创建了一个账号“kafka_user”,密码为"kakfa_user_password@2022abcdlk!",约束客户端只能通过SSL方式带上CA证书加密访问。

假设我们已经有了一个ASP.NET Core应用,并且之前已经在开发环境通过CAP项目使用了Kafka,那么对于生产环境或安全要求较高的测试环境,我们应该如何修改呢?

通过查看CAP的文档,在CAP.Kafka中其实只提供了几个最基础的配置项:

f791edf6bd4d884859ff725fc669b679.png

而其他的配置项,我们只能通过CAP.Kafka提供的MainConfig这个Dictionary类进行手动添加,如下所示:

services.AddCap(capOptions => 
{capOptions.UseKafka(kafkaOption=>{// kafka options.// kafkaOptions.MainConfig.Add("", "");});
});

那么,我们应该添加哪些配置呢?它们的key和可选的value又是哪些呢?CAP给出了一个参考链接:https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md,它是librdkafka项目的配置参数的文档。

通过研究配置项文档,我们大概需要以下一些参数,将其添加到MainConfig字典中,这些参数不仅适配Producer也适配Consumer。

namespace Microsoft.Extensions.DependencyInjection
{public static class ApplicationServiceCollectionExtensions{public static IServiceCollection AddEventBus(this IServiceCollection services, IConfigurationSection configuration){services.AddCap(option =>{option.UseInMemoryStorage();option.UseKafka(kfkOption =>{kfkOption.Servers = configuration["KafkaBootstrapServers"];if (Convert.ToBoolean(configuration["EnableAuthorization"])){kfkOption.MainConfig.Add("security.protocol", "sasl_ssl");kfkOption.MainConfig.Add("sasl.mechanism", "PLAIN");kfkOption.MainConfig.Add("sasl.username", configuration["SaslUserName"]);                        kfkOption.MainConfig.Add("sasl.password", configuration["SaslPassword"]);                        kfkOption.MainConfig.Add("ssl.ca.location", configuration["SslCertificatePath"]);                        kfkOption.MainConfig.Add("enable.ssl.certificate.verification", configuration["EnableSslCertificateVerification"]);                        }});option.SucceedMessageExpiredAfter = 3600 * 24 * Convert.ToInt32(configuration["SuccessMsgExpireDays"]);});return services;}}
}

在Program.cs中调用AddEventBus方法:

builder.Services.AddEventBus(builder.Configuration.GetSection("EventBusConfigs"));

在appsettings中的配置如下:

{"EventBusConfigs": {"KafkaBootstrapServers": "prd.kafka01.com:9093, prd.kafka02.com:9093, prd.kafka03.com:9093","SuccessMsgExpireDays": 7,"EnableAuthorization": true,"SaslUserName": "kafka_user","SaslPassword": "kakfa_user_password@2022abcdlk!","SslCertificatePath": "resources/certificates/intranet_server_ca.cer","EnableSslCertificateVerification": true}
}

既然是通过证书访问,那么我们得告诉ASP.NET Core这个证书放在什么位置,本文示例是放在这个ASP.NET Core应用目录下的,在实际中建议由运维管理员统一放在一个中心服务器位置,挂载到容器内部可以访问,从而保证证书的安全。如果是通过K8s部署,那么将其添加为一个Secret存放是更好的方式。

CAP中的异构系统集成

顺带说一下,在CAP这个项目中,如果你的项目都是基于它来做事件总线,那么CAP可以正常的Publish和Subscribe消息,但是如果在你使用它之前已经有了许多的Topic Messages,它需要和一些第三方系统进行消息传输,这就会涉及到异构系统的集成。如果我们不做一些配置,CAP是无法正常Subscribe和Consume消息的。

因此,在CAP中,我们需要主动对Message做一些改造,添加传递一些额外信息以便于CAP能够在收到消息时提取到关键特征从而正常运作。否则,你会在启动时收到这样一个错误:The given key "cap-msg-id" is not existed........。

我们只需要在注册CAP组件时添加自定义Headers,确保"cap-msg-id"和"cap-msg-name"两个Header值能够被解析到:

namespace Microsoft.Extensions.DependencyInjection
{public static class ApplicationServiceCollectionExtensions{public static IServiceCollection AddEventBus(this IServiceCollection services, IConfigurationSection configuration){services.AddCap(option =>{option.UseInMemoryStorage();option.UseKafka(kfkOption =>{kfkOption.Servers = configuration["KafkaBootstrapServers"];if (Convert.ToBoolean(configuration["EnableAuthorization"])){kfkOption.MainConfig.Add("security.protocol", "sasl_ssl");kfkOption.MainConfig.Add("sasl.mechanism", "PLAIN");kfkOption.MainConfig.Add("sasl.username", configuration["SaslUserName"]);                        kfkOption.MainConfig.Add("sasl.password", configuration["SaslPassword"]);                        kfkOption.MainConfig.Add("ssl.ca.location", configuration["SslCertificatePath"]);                        kfkOption.MainConfig.Add("enable.ssl.certificate.verification", configuration["EnableSslCertificateVerification"]);                        }// 以下为新增自定义Headers配置option.CustomHeaders = e => new List<KeyValuePair<string, string>>{new KeyValuePair<string, string>(DotNetCore.CAP.Messages.Headers.MessageId, SnowflakeId.Default().NextId().ToString()),new KeyValuePair<string, string>(DotNetCore.CAP.Messages.Headers.MessageName, e.Topic)};});option.SucceedMessageExpiredAfter = 3600 * 24 * Convert.ToInt32(configuration["SuccessMsgExpireDays"]);});return services;}}
}

小结

本文介绍了在ASP.NET Core中使用CAP项目通过认证机制安全地使用kafka消息中间件,希望能够对你有所帮助!

参考资料

CAP文档Kafka部分:https://cap.dotnetcore.xyz/user-guide/en/transport/kafka

librdkafka配置项文档:https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md

CAP文档Messaging部分:https://cap.dotnetcore.xyz/user-guide/en/cap/messaging

胡夕《Kafka核心技术与实战》之Kafka认证机制用哪家:https://time.geekbang.org/column/article/118347

aa641bf6532b49b5a7166f4dcd367909.gif

年终总结:Edison的2021年终总结

数字化转型:我在传统企业做数字化转型

C#刷题:C#刷剑指Offer算法题系列文章目录

.NET面试:.NET开发面试知识体系

.NET大会:2020年中国.NET开发者大会PDF资料

a23fcd30fc761ea16ce76f9cf69563b1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/280281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JQuery框架2.位置属性|筛选方法|事件

1、位置属性 jquery的css position获取匹配元素相对父元素的偏移位置&#xff1b;offset获取匹配元素在当前视口的相对偏移,返回的对象包含两个整型属性&#xff1a;top 和 left $("p").offset() $(div).offset().top $("p").offset().left scrollTop获取匹…

jenkins没安装git报错

Jenkins新建项目中源码管理使用Git时遇到如下问题&#xff1a; 在安装jenkins服务器上查看一下git版本&#xff0c;可能没有安装git 也可能是git版本太低 [rootlocalhost nnnnn]# git --version git version 1.8.3.1 yum安装的版本太低了 打开Jenkins的 主页面 > 系统管理 …

mac 不能连接wi-fi_如何在Mac OS X中查看当前的Wi-Fi连接速度

mac 不能连接wi-fiEver since I’ve been using my new MacBook Air, I’ve been befuddled by how to do some of the simplest tasks in Mac OS X that I would normally do from my Windows laptop—like show the connection speed for the current Wi-Fi network. So am I…

User Stories - 最佳实践 (Best Practices)

在转向敏捷之后&#xff0c;很多团队开始使用“用户故事”一词。用户故事是一种简单而优雅的技术&#xff0c;可以收集客户需求。然而&#xff0c;它需要一定的理解和实践才能用User Stories构建出色的软件。 让我们仔细看看用户故事是什么以及如何使用这种技术取得成功。 什么…

聊一聊promise的前世今生

promise的概念已经出现很久了&#xff0c;浏览器、nodejs都已经全部实现promise了。现在来聊&#xff0c;是不是有点过时了&#xff1f; 确实&#xff0c;如果不扯淡&#xff0c;这篇随笔根本不会有太多内容。所以&#xff0c;我就尽可能的&#xff0c;多扯一扯&#xff0c;聊一…

chromebook刷机_如何在Chromebook上切换(或离开)Canary频道

chromebook刷机Just like Chrome, Google offers multiple channels of the Chrome OS operating system. In addition to the standard Stable, Beta, and Developer channels you can choose from on the About page, there’s a special bleeding-edge Canary channel. The …

C++--day05

目录: 1. C的提高 1-131P 时间七天 2. C的基础 132-286P 时间八天 3. C的提高 287-378P 时间五天 4. C/C的数据结构 379-482P 时间五天 5. C/C的设计模式基础 483-540P 时间三天 视频资料&#xff1a;https://www.bilibili.com/video/av27904891?fromsearch&seid108915144…

libreoffice_如何更改您在LibreOffice中可以撤消的操作数

libreofficeIn LibreOffice programs, you can undo one action after another…to a point. The default number of actions you can undo is 100, but that number is easy to change. 在LibreOffice程序中&#xff0c;您可以撤消一个动作&#xff0c;直到某个点。 您可以撤消…

远程连接服务器出现身份验证错误 要求的函数不受支持

来源&#xff1a;https://www.cnblogs.com/lindajia/p/9021082.html 以往发布程序到服务器都没问题。今天远程桌面连接到服务器&#xff0c;突然出现了异常&#xff01;异常信息为&#xff1a; 在网上看到有多种解决方案&#xff1a;发现有种修改注册表的方式很简单。 详细步骤…

CDH集群安装配置(五)- Cloudera Manager Server

在线安装 sudo yum install cloudera-manager-daemons cloudera-manager-server 离线安装 资源下载地址 https://archive.cloudera.com/cm6/6.1.0/redhat7/yum/RPMS/x86_64/ 上次下面资源包到cdh1节点 cloudera-manager-server-6.1.0-769885.el7.x86_64.rpm cloudera-manager-s…

c++简单程序设计-5

编程实验部分1.vector3.cpp #include <iostream> #include <vector> #include <string> using namespace std;// 函数声明 void output1(vector<string> &); void output2(vector<string> &); int main() {vector<string>like…

关于JavaScript的编译原理

引擎&#xff1a;负责整个js程序的编译和执行过程编译器&#xff1a;负责语法分析和代码生成作用域&#xff1a;收集和维护一系列查询&#xff08;由所有声明的标识符组成&#xff09; 【例子&#xff1a;声明一个变量并赋值 var a value&#xff1b;】 Step1.编译器对该程序段…

safari检查元素_如何防止Safari检查是否使用Apple Pay

safari检查元素Apple Pay’s incorporation into macOS Sierra makes it really easy to pay using the service on your Mac with your iPhone or iPad. But that doesn’t mean just because you can, you will, or will want to use Apple Pay in the future. 通过将Apple P…

某乎有人问--微软会抛弃C#吗,有点担心?

在某乎有人问&#xff1a;微软会抛弃C#吗&#xff0c;有点担心&#xff1f;&#xff0c;类似这样的问题&#xff0c;一直都有很多人在问&#xff0c;今天我们就来聊聊这个问题。没必要担心微软倒闭了&#xff0c;C#都不会消失&#xff0c;其实.Net已经不属于微软的了。C#是属于…

icloud上传错误_如何修复HomeKit“地址未注册到iCloud”错误

icloud上传错误While Apple has made serious improvements to the HomeKit smarthome framework, there are still more than a few ghosts in the machine. Let’s look at how to banish the extremely frustrating “Address is not registered with iCloud” error to get…

(3)Python3笔记之变量与运算符

一、变量 1&#xff09;. 命名规则&#xff1a; 1. 变量名不能使用系统关键字或保留关键字 2. 变量区分大小写 3. 变量命名由字母&#xff0c;数字&#xff0c;下划线组成但不能以数字开头 4. 不需要声明变量类型 是 a 1 非 int a 1 5. 查看变量内存地址 id(a), id(b) 6…

WPF 实现视频会议与会人员动态布局

WPF 实现视频会议与会人员动态布局控件名&#xff1a;SixGridView作 者&#xff1a;WPFDevelopersOrg - 驚鏵原文链接[1]&#xff1a;https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用.NET40&#xff1b;Visual Studio 2019;接着上一篇是基于Grid实现的视频查看感…

chromebook刷机_如何获取Android应用以查看Chromebook上的外部存储

chromebook刷机Android apps are a great way to expand the sometimes limited capabilities of Chromebooks, but they can be a problem if you store most of your data on an external medium—like an SD card, for example. Android应用程序是扩展Chromebook有时有限功能…

android 指纹添加_如何将手势添加到Android手机的指纹扫描仪

android 指纹添加So you have a shiny new Android phone, equipped with a security-friendly fingerprint scanner. Congratulations! But did you know that, while useful on its own, you can actually make the fingerprint scanner do more than just unlock your phone…