.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.pswp.cn/news/280281.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280281.shtml
英文地址,請注明出處:http://en.pswp.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獲取匹…

新手學習Java必需要知道的這些基本概念!

學習好比蓋房子&#xff0c;打地基好很重要&#xff0c;房了能蓋多高關鍵看地基&#xff1b;學習同樣道理&#xff0c;基礎知識是以后學習一切技術的必要條件&#xff0c;我們在準備學習一門開發語言時&#xff0c;首先要學習它的基礎&#xff0c;不僅要會&#xff0c;更要融會…

jenkins沒安裝git報錯

Jenkins新建項目中源碼管理使用Git時遇到如下問題&#xff1a; 在安裝jenkins服務器上查看一下git版本&#xff0c;可能沒有安裝git 也可能是git版本太低 [rootlocalhost nnnnn]# git --version git version 1.8.3.1 yum安裝的版本太低了 打開Jenkins的 主頁面 > 系統管理 …

如何使用 IdGen 生成 UID

在分布式系統中&#xff0c;雪花 ID 是一種常用的唯一 ID 生成算法。它通過結合時間戳、機器碼和自增序列來生成 64 位整數 ID&#xff0c;可以保證 ID 的唯一性和順序性。在.Net 項目中&#xff0c;我們可以使用 IdGen 這個類庫來生成雪花 ID。它是一個開源的類庫&#xff0c;…

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…

通過 CancellationToken 提高 Web 性能

在 Web 開發中&#xff0c;經常會遇到這樣的場景&#xff1a;用戶發起一個請求&#xff0c;Web 服務器執行一些計算密集型的操作&#xff0c;等待結果返回給用戶。這種情況下&#xff0c;如果用戶在等待結果的過程中取消了請求&#xff0c;那么服務器端依然會繼續執行計算&…

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;發現有種修改注冊表的方式很簡單。 詳細步驟…

截取圖片生成頭像插件

上傳頭像插件 目的&#xff1a; 幫助開發者快速開發上傳頭像功能點 背景&#xff1a; 現在b&#xff0c;g能搜到的頭像上傳插件并不太好用&#xff0c;所以想提供一個比較自由度的上傳并且可以剪切的插件。 資源&#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…

spring boot中servlet啟動原理

啟動過程及原理 1 spring boot 應用啟動運行run方法 StopWatch stopWatch new StopWatch();stopWatch.start();ConfigurableApplicationContext context null;FailureAnalyzers analyzers null;configureHeadlessProperty();SpringApplicationRunListeners listeners getRu…

某乎有人問--微軟會拋棄C#嗎,有點擔心?

在某乎有人問&#xff1a;微軟會拋棄C#嗎&#xff0c;有點擔心&#xff1f;&#xff0c;類似這樣的問題&#xff0c;一直都有很多人在問&#xff0c;今天我們就來聊聊這個問題。沒必要擔心微軟倒閉了&#xff0c;C#都不會消失&#xff0c;其實.Net已經不屬于微軟的了。C#是屬于…

mailing list的原理

1 發往mailing list郵箱的郵件會被所有訂閱了該郵箱的人收到 說白了&#xff0c;就是一種郵件群發機制&#xff0c;為了簡化群發&#xff0c;不是將所有的收件人放到收件人列表中&#xff0c;而是發往總的郵箱即可。 2 要向該mailing list郵箱中發送郵件需要先要訂閱 但是&…