如何為Kafka設定OAuth2安全機制?
隨著Kafka版本2.0.0 的KIP-255(Kafka改進提案)的提交,現在我們可以使用SASL(簡單認證和安全層)OAUTHBEARER來驗證客戶端到代理或中間人身份驗證。
先決條件
- Docker
- Docker-compose
- Git
實現Java類支援OAuth機制
有了KIP-255的文件,我們需要實現2個類來使用外部OAuth2伺服器來驗證我們的客戶端或代理。
第一個類實現AuthenticateCallbackHandler,並將為需要進行身份驗證的客戶端或代理服務。
public class OauthAuthenticateLoginCallbackHandler implements AuthenticateCallbackHandler { private final Logger log = LoggerFactory.getLogger(OauthAuthenticateLoginCallbackHandler.class); private Map<String, String> moduleOptions = null; private boolean configured = false; @Override public void configure(Map<String, ?> map, String saslMechanism, List<AppConfigurationEntry> jaasConfigEntries) { if (!OAuthBearerLoginModule.OAUTHBEARER_MECHANISM.equals(saslMechanism)) throw new IllegalArgumentException(String.format("Unexpected SASL mechanism: %s", saslMechanism)); if (Objects.requireNonNull(jaasConfigEntries).size() != 1 || jaasConfigEntries.get(0) == null) throw new IllegalArgumentException( String.format("Must supply exactly 1 non-null JAAS mechanism configuration (size was %d)", jaasConfigEntries.size())); this.moduleOptions = Collections.unmodifiableMap((Map<String, String>) jaasConfigEntries.get(0).getOptions()); configured = true; } public boolean isConfigured(){ return this.configured; } @Override public void close() { } @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { if (!isConfigured()) throw new IllegalStateException("Callback handler not configured"); for (Callback callback : callbacks) { if (callback instanceof OAuthBearerTokenCallback) try { handleCallback((OAuthBearerTokenCallback) callback); } catch (KafkaException e) { throw new IOException(e.getMessage(), e); } else throw new UnsupportedCallbackException(callback); } } private void handleCallback(OAuthBearerTokenCallback callback){ if (callback.token() != null) throw new IllegalArgumentException("Callback had a token already"); log.info("Try to acquire token!"); OauthBearerTokenJwt token = OauthHttpCalls.login(null); log.info("Retrieved token.."); if(token == null){ throw new IllegalArgumentException("Null token returned from server"); } callback.token(token); } } |
第二個類實現相同的類,能讓Kafka使用OAuth令牌自查來驗證傳送令牌。
public class OauthAuthenticateValidatorCallbackHandler implements AuthenticateCallbackHandler { private final Logger log = LoggerFactory.getLogger(OauthAuthenticateValidatorCallbackHandler.class); private List<AppConfigurationEntry> jaasConfigEntries; private Map<String, String> moduleOptions = null; private boolean configured = false; private Time time = Time.SYSTEM; @Override public void configure(Map<String, ?> map, String saslMechanism, List<AppConfigurationEntry> jaasConfigEntries) { if (!OAuthBearerLoginModule.OAUTHBEARER_MECHANISM.equals(saslMechanism)) throw new IllegalArgumentException(String.format("Unexpected SASL mechanism: %s", saslMechanism)); if (Objects.requireNonNull(jaasConfigEntries).size() != 1 || jaasConfigEntries.get(0) == null) throw new IllegalArgumentException( String.format("Must supply exactly 1 non-null JAAS mechanism configuration (size was %d)", jaasConfigEntries.size())); this.moduleOptions = Collections.unmodifiableMap((Map<String, String>) jaasConfigEntries.get(0).getOptions()); configured = true; } public boolean isConfigured(){ return this.configured; } @Override public void close() { } @Override public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { if (!isConfigured()) throw new IllegalStateException("Callback handler not configured"); for (Callback callback : callbacks) { if (callback instanceof OAuthBearerValidatorCallback) try { OAuthBearerValidatorCallback validationCallback = (OAuthBearerValidatorCallback) callback; handleCallback(validationCallback); } catch (KafkaException e) { throw new IOException(e.getMessage(), e); } else throw new UnsupportedCallbackException(callback); } } private void handleCallback(OAuthBearerValidatorCallback callback){ String accessToken = callback.tokenValue(); if (accessToken == null) throw new IllegalArgumentException("Callback missing required token value"); log.info("Trying to introspect Token!"); OauthBearerTokenJwt token = OauthHttpCalls.introspectBearer(accessToken); log.info("Trying to introspected"); // Implement Check Expire Token.. long now = time.milliseconds(); if(now > token.expirationTime()){ OAuthBearerValidationResult.newFailure("Expired Token, needs refresh!"); } log.info("Validated! token.."); callback.token(token); } } |
server.properties檔案
在這個檔案中,我們將設定將用於在OAuth2伺服器中進行登入和驗證的類。完整的server.properties檔案位於GitHub儲存庫中。
# ###########################的OAuth類################### ########## listener.name.sasl_plaintext.oauthbearer.sasl.login.callback.handler.class = br.com.jairsjunior.security.oauthbearer.OauthAuthenticateLoginCallbackHandler listener.name.sasl_plaintext.oauthbearer.sasl.server.callback.handler.class = br.com.jairsjunior.security.oauthbearer.OauthAuthenticateValidatorCallbackHandler |
啟動OAuth2伺服器和我們的Kafka
此專案需要OAuth2伺服器來提供客戶端或代理的令牌和驗證。一個簡單而開源的替代方案是使用ORY Hydra,這是一個用Go編寫的認證OAuth2伺服器。對於此示例,我們使用docker-compose檔案來設定伺服器並建立3個帳戶:
- consumer-kafka:用於消費者容器
- producer-kafka:用於生產者容器
- broker-kafka:用於interbroker身份驗證
為了啟動我們的OAuth2伺服器和我們的Kafka代理,我們需要克隆kafka-playground GitHub儲存庫並在根資料夾中執行docker-compose檔案。在執行docker-compose之前,我們需要設定一個名為HOST_IP的環境變數。
HOST_IP=XXX.XXX.XXX.XXX docker-compose up |
配置我們的客戶端(生產者/消費者/流)
在Git的儲存庫中,我們有一個名為kafka-using-java的資料夾,它包含一個生成器示例,使用我們的.jar檔案。 要執行此示例,您需要設定HOST_IP環境變數,其中包含正在執行的計算機的IP地址。
HOST_IP=XXX.XXX.XXX.XXX docker-compose up |
原始碼: Github
相關文章
- 實戰Kafka ACL機制Kafka
- Kafka Consumer 的 Rebalance 機制Kafka
- Uber如何安全保護Kafka基礎設施?Kafka
- Kafka消費與心跳機制Kafka
- 深入理解 Kafka 副本機制Kafka
- kafka和raft共識機制KafkaRaft
- Kafka 訊息儲存機制Kafka
- win10電腦 tls安全設定怎麼設定為預設設定Win10TLS
- 微信隱私安全設定教程 如何設定微信隱私安全?
- Linux安全機制Linux
- 如何設定iis服務更安全
- 如何設定印表機共享
- 印表機彩色列印怎麼設定 如何設定彩色印表機
- 印表機的埠如何設定 設定印表機埠的方法
- 一文讀懂Kafka副本機制Kafka
- 快速失敗機制&失敗安全機制
- win10系統如何設定印表機預設方向為橫向Win10
- 行為驗證碼安全策略設定
- 360安全衛士如何設定白名單
- kafka ISR設計及水印與leader epoch副本同步機制深入剖析-kafka 商業環境實戰Kafka
- Fabric基於Kafka的共識機制剖析Kafka
- Kafka核心中的分散式機制實現Kafka分散式
- kafka 副本機制和容錯處理 -2Kafka
- AWS DocumentDB 如何設定為預設 write concern
- win10耳機設定方法_win10如何設定耳機Win10
- 小程式技術科普:執行機制&安全機制
- Android系統安全機制Android
- Spring Boot Security 整合 OAuth2 設計安全API介面服務Spring BootOAuthAPI
- 【轉】kafka-檔案儲存機制詳解Kafka
- 機制設計
- css如何為圖片設定圓角CSS
- win10印表機共享設定方法 win10如何設定印表機共享Win10
- 電腦定時關機怎麼設定?360安全衛士設定電腦定時關機的兩種方法步驟
- Linux 系統中如何設定印表機?Linux
- 如何設定跨網段共享印表機?
- 安全篇-AES/RSA加密機制加密
- JVM--java沙箱安全機制JVMJava
- HTTPS的安全通訊機制HTTP