指南:從防火墻端口到 Kerberos 認證與授權(quán))
大數(shù)據(jù)流處理后端【免費下載鏈接】stormApache Storm項目地址https://gitcode.com/gh_mirrors/storm6/storm點擊查看免費下載本文基于 Apache Storm 官方安全文檔倉庫根目錄 SECURITY.md并結(jié)合 conf/defaults.yaml 默認配置與 storm-client 安全插件源碼編寫。默認情況下Storm 的認證與授權(quán)全部關(guān)閉集群安全需要按本文檔逐層開啟讀完本文你將掌握 Storm 的端口清單與網(wǎng)絡(luò)層隔離、UI/Logviewer 的過濾器與 SSL、基于 Kerberos 的 Thrift/SASL 認證鏈路、SimpleACLAuthorizer 授權(quán)模型、多租戶調(diào)度與 worker 進程用戶隔離以及憑證自動推送與拓撲規(guī)模限制等完整加固方案。1. 安全模型概述Apache Storm 提供一整套可插拔的安全配置能力用于加固集群。默認狀態(tài)下所有認證Authentication與授權(quán)Authorization都是關(guān)閉的storm.thrift.transport的默認值是org.apache.storm.security.auth.SimpleTransportPlugin見 conf/defaults.yaml即不做任何身份校驗。你可以在需要時逐層開啟防火墻 / OS 層安全不開啟認證授權(quán)時靠系統(tǒng)級網(wǎng)絡(luò)限制保證集群安全UI / Logviewer 訪問控制通過 servlet 過濾器或反向代理做 Web 層認證Kerberos 認證通過 Thrift SASL 實現(xiàn) Nimbus / Supervisor / DRPC / ZooKeeper 之間的身份認證授權(quán)插件SimpleACLAuthorizer控制誰能對集群執(zhí)行什么操作ImpersonationAuthorizer控制用戶模擬數(shù)據(jù)面安全worker 間 Netty 連接鑒權(quán)、worker 進程按提交者用戶運行、SSL/TLS 加密。另外關(guān)于 Storm 認為哪些屬于安全漏洞的假設(shè)、信任邊界與范圍請先閱讀官方 Apache Storm Security Model在提交安全問題時建議先讀它。2. 防火墻 / OS 層安全即使不開啟正式的認證與授權(quán)也可以通過操作系統(tǒng)限制來獲得一個相對安全的集群。這通常需要配置防火墻、限制網(wǎng)絡(luò)訪問、只允許集群內(nèi)部和可信主機/服務(wù)之間的連接。即便計劃開啟 Auth也建議做好 OS 層加固。如果集群處理的數(shù)據(jù)敏感還可在集群主機之間配置 IPsec 加密所有流量。具體 OS 配置細節(jié)因發(fā)行版而異超出本文范圍。2.1 Storm 使用的端口清單加固的第一步是明確哪些端口需要暴露給誰。下表來自 SECURITY.md端口默認值與 conf/defaults.yaml 中的配置一一對應(yīng)默認端口Storm 配置項客戶端主機/進程服務(wù)端2181storm.zookeeper.portNimbus、Supervisor、Worker 進程ZooKeeper6627nimbus.thrift.portStorm 客戶端、Supervisor、UINimbus6628supervisor.thrift.portNimbusSupervisor8080ui.port客戶端 Web 瀏覽器UI8000logviewer.port客戶端 Web 瀏覽器Logviewer3772drpc.port外部 DRPC 客戶端DRPC3773drpc.invocations.portWorker 進程DRPC3774drpc.http.port外部 HTTP DRPC 客戶端DRPC670{0,1,2,3}supervisor.slots.portsWorker 進程Worker 進程注意worker 端口6700~6703只是默認值conf/defaults.yaml 中以列表形式定義實際端口隨部署而異。建議防火墻只放行上述端口且來源僅限集群自身與受信任主機。2.2 UI / Logviewer 訪問控制UI 與 Logviewer 進程不僅能查看集群狀態(tài)還能操縱正在運行中的拓撲因此一般不應(yīng)直接暴露給集群用戶之外的人。通常需要某種形式的認證典型做法有方式一Java servlet 過濾器ui.filter: filter.class ui.filter.params: param1:value1 logviewer.filter: filter.class logviewer.filter.params: param1:value1默認值均為null見 conf/defaults.yaml 與logviewer.filter。方式二反向代理將 UI/Logviewer 端口限制為僅接受本機連接再用 Apache httpd 等 Web 服務(wù)器做認證/授權(quán)并反向代理到 Storm 進程。此時 UI 進程storm.yaml中的logviewer.port要設(shè)為代理端口而各 logviewer 進程要設(shè)為自身實際綁定的端口。servlet 過濾器更受推薦因為它允許每個拓撲單獨指定誰能誰不能訪問與該拓撲相關(guān)的頁面——這與SimpleACLAuthorizer結(jié)合topology.users/topology.groups的逐拓撲授權(quán)模型是一致的。使用 hadoop-auth 的 AuthenticationFilterStorm UI或 Logviewer可直接復(fù)用 hadoop-auth 的AuthenticationFilter做 Kerberos SPNEGO 認證ui.filter: org.apache.hadoop.security.authentication.server.AuthenticationFilter ui.filter.params: type: kerberos kerberos.principal: HTTP/nimbus.witzend.com kerberos.keytab: /vagrant/keytabs/http.keytab kerberos.name.rules: RULE:2:$1$0s/.*/$MAPRED_USER/ RULE:2:$1$0s/.*/$HDFS_USER/DEFAULT配置前需為 UI 守護進程所在主機創(chuàng)建HTTP/{hostname}主體hostname 即 UI 守護進程所在主機名。配置完成后訪問 UI 前必須先執(zhí)行kinit。啟用后可用如下命令訪問 Storm 的 REST APIcurl -i --negotiate -u:anyUser -b ~/cookiejar.txt -c ~/cookiejar.txt http://storm-ui-hostname:8080/api/v1/cluster/summary各瀏覽器啟用 SPNEGO 協(xié)商的方式Firefox進入about:config搜索network.negotiate-auth.trusted-uris雙擊后添加值http://storm-ui-hostname:8080Google Chrome命令行啟動參數(shù)google-chrome --auth-server-whitelist*storm-ui-hostname --auth-negotiate-delegate-whitelist*storm-ui-hostnameIE將storm-ui-hostname加入受信任網(wǎng)站并允許對該網(wǎng)站進行協(xié)商。注意Caution在 AD MIT Kerberos 環(huán)境下Kerberos 票據(jù)的 key size 大于 UI Jetty 服務(wù)器默認的請求頭大小需要在storm.yaml中把ui.header.buffer.bytes設(shè)置為 65536默認值僅為 4096見 conf/defaults.yaml否則 UI 請求可能因請求頭過大而失敗。此問題詳見 STORM-633。3. UI / DRPC 的 SSL 配置UI 與 DRPC 都支持 SSL。生成含正確密鑰與證書的 keystore 需由用戶提前完成。3.1 UI 啟用 HTTPS在storm.yaml中設(shè)置以下配置ui.https.portHTTPS 監(jiān)聽端口ui.https.keystore.type例jksui.https.keystore.path例/etc/ssl/storm_keystore.jksui.https.keystore.passwordkeystore 密碼ui.https.key.password私鑰密碼可選配置ui.https.truststore.path例/etc/ssl/storm_truststore.jksui.https.truststore.passwordtruststore 密碼ui.https.truststore.type例jks雙向認證mTLS配置ui.https.want.client.auth設(shè)為 true 時服務(wù)端請求客戶端證書認證但即使客戶端未提供認證也保持連接ui.https.need.client.auth設(shè)為 true 時服務(wù)端強制要求客戶端提供認證否則拒絕連接。3.2 DRPC 啟用 HTTPS與 UI 配置結(jié)構(gòu)完全一致僅配置項前綴不同drpc.https.portdrpc.https.keystore.type例jksdrpc.https.keystore.path例/etc/ssl/storm_keystore.jksdrpc.https.keystore.passwordkeystore 密碼drpc.https.key.password私鑰密碼可選配置drpc.https.truststore.path例/etc/ssl/storm_truststore.jksdrpc.https.truststore.passwordtruststore 密碼drpc.https.truststore.type例jks雙向認證配置drpc.https.want.client.authdrpc.https.need.client.auth在 conf/defaults.yaml 中可以看到drpc.https.port默認為-1即關(guān)閉drpc.https.keystore.type默認為JKSdrpc.https.keystore.password默認為空——需要你在storm.yaml中顯式覆蓋。本地測試 SSL 環(huán)境生成證書腳本下面的腳本可生成本地測試所需的自簽名證書鏈keyalg必須設(shè)為RSA#!/bin/bash DIR/Users/user/certs/dir/ keytool -keystore $DIR/server.keystore.jks -alias localhost -validity 365 -keyalg RSA -genkey openssl req -new -x509 -keyout $DIR/ca-key -out $DIR/ca-cert -days 365 keytool -keystore $DIR/server.truststore.jks -alias CARoot -import -file $DIR/ca-cert keytool -keystore $DIR/client.truststore.jks -alias CARoot -import -file $DIR/ca-cert keytool -keystore $DIR/server.keystore.jks -alias localhost -certreq -file $DIR/cert-file openssl x509 -req -CA $DIR/ca-cert -CAkey $DIR/ca-key -in $DIR/cert-file -out $DIR/cert-signed -days 365 -CAcreateserial -passin pass:test12 keytool -keystore $DIR/server.keystore.jks -alias CARoot -import -file $DIR/ca-cert keytool -keystore $DIR/server.keystore.jks -alias localhost -import -file $DIR/cert-signed流程先生成服務(wù)器 keystore 與自簽名 CA → 將 CA 導(dǎo)入 server/client 兩個 truststore → 用服務(wù)器 keystore 生成 CSR → 用 CA 簽名 CSR → 最后把 CA 與簽名證書依次導(dǎo)入服務(wù)器 keystore。生產(chǎn)環(huán)境請?zhí)鎿Q為真實的 CA 簽發(fā)證書。4. Kerberos 認證Storm 通過 Thrift 與 SASL 提供可插拔的認證支持。文檔以 Kerberos 為例大數(shù)據(jù)生態(tài)最常見的方案。KDC 的搭建與各節(jié)點 Kerberos 配置不在本文范圍默認認為已就緒。4.1 創(chuàng)建無頭主體Headless Principals與 keytab每個 ZooKeeper Server、Nimbus、DRPC Server 都需要一個服務(wù)主體按慣例包含其運行主機的 FQDN。注意 ZooKeeper 用戶必須是zookeeper。Supervisor 與 UI 也需要一個用于運行的主體但它們是發(fā)起連接的一方不需要服務(wù)主體。# ZooKeeperZK ensemble 中每臺機器都需要一個 sudo kadmin.local -q addprinc zookeeper/zk1.example.comSTORM.EXAMPLE.COM sudo kadmin.local -q ktadd -k /tmp/zk.keytab zookeeper/zk1.example.comSTORM.EXAMPLE.COM # Nimbus 和 DRPC sudo kadmin.local -q addprinc storm/storm.example.comSTORM.EXAMPLE.COM sudo kadmin.local -q ktadd -k /tmp/storm.keytab storm/storm.example.comSTORM.EXAMPLE.COM # 所有 UI、Logviewer 和 Supervisor sudo kadmin.local -q addprinc stormSTORM.EXAMPLE.COM sudo kadmin.local -q ktadd -k /tmp/storm.keytab stormSTORM.EXAMPLE.COM務(wù)必把 keytab 分發(fā)到對應(yīng)主機并設(shè)置文件系統(tǒng)權(quán)限確保只有運行 ZK 或 Storm 的無頭用戶能讀取。4.2 Storm 的 Kerberos 配置Storm 與 ZooKeeper 都通過JAAS 配置文件登錄。每個 jaas 文件可包含多個 section對應(yīng)不同的接口。啟用 Kerberos 認證需要在storm.yaml中設(shè)置storm.thrift.transport: org.apache.storm.security.auth.kerberos.KerberosSaslTransportPlugin java.security.auth.login.config: /path/to/jaas.confKerberos 傳輸插件實現(xiàn)在 KerberosSaslTransportPlugin.java替換默認的SimpleTransportPlugin后Nimbus 的 Thrift 服務(wù)即要求 SASL 認證。Nimbus 與 Supervisor 進程還要連接 ZooKeeper需要給 nimbus、ui、supervisor 的 childopts 追加-Djava.security.auth.login.config/path/to/jaas.conf?;谖臋n寫作時的默認 childopts 示例nimbus.childopts: -Xmx1024m -Djava.security.auth.login.config/path/to/jaas.conf ui.childopts: -Xmx768m -Djava.security.auth.login.config/path/to/jaas.conf supervisor.childopts: -Xmx256m -Djava.security.auth.login.config/path/to/jaas.conf以上堆內(nèi)存值與 conf/defaults.yaml、conf/defaults.yaml、conf/defaults.yaml 的默認 childopts 對應(yīng)你只需在其后追加 login config 參數(shù)。storm 節(jié)點的 jaas.conf 應(yīng)包含以下 section倉庫中 conf/storm_jaas.conf 提供了帶占位符的模板StormServer供 nimbus 與 DRPC 節(jié)點使用Supervisor 節(jié)點無需包含StormClient供所有要與 nimbus 通信的 Storm 客戶端使用包括 ui、logviewer、supervisor網(wǎng)關(guān)gateway上也要用該 section但結(jié)構(gòu)略有不同Client供要與 ZooKeeper 通信的進程使用實際上只需要在 nimbus 和 supervisor 上包含Server供 ZooKeeper 服務(wù)端使用。jaas 中包含未使用的 section 沒有問題。模板StormServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue keyTab$keytab storeKeytrue useTicketCachefalse principal$principal; }; StormClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue keyTab$keytab storeKeytrue useTicketCachefalse serviceName$nimbus_user principal$principal; }; Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue keyTab$keytab storeKeytrue useTicketCachefalse serviceNamezookeeper principal$principal; }; Server { com.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue keyTab$keytab storeKeytrue useTicketCachefalse principal$principal; };基于上文生成的 keytab 的完整示例StormServer { com.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue keyTab/keytabs/storm.keytab storeKeytrue useTicketCachefalse principalstorm/storm.example.comSTORM.EXAMPLE.COM; }; StormClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue keyTab/keytabs/storm.keytab storeKeytrue useTicketCachefalse serviceNamestorm principalstormSTORM.EXAMPLE.COM; }; Client { com.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue keyTab/keytabs/storm.keytab storeKeytrue useTicketCachefalse serviceNamezookeeper principalstormSTORM.EXAMPLE.COM; }; Server { com.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue keyTab/keytabs/zk.keytab storeKeytrue useTicketCachefalse serviceNamezookeeper principalzookeeper/zk1.example.comSTORM.EXAMPLE.COM; };Nimbus 還會把主體principal翻譯成本地用戶名供其他服務(wù)使用。Kerberos 認證下配置storm.principal.tolocal: org.apache.storm.security.auth.KerberosPrincipalToLocal實現(xiàn)在 KerberosPrincipalToLocal.javaconf/defaults.yaml 的默認值是DefaultPrincipalToLocal。此項只在 nimbus 上必須其它節(jié)點配置也無害。還需要告訴拓撲從 ZooKeeper 的視角看supervisor 守護進程與 nimbus 守護進程以誰的身份運行storm.zookeeper.superACL: sasl:${nimbus-user}其中nimbus-user是 nimbus 向 ZooKeeper 認證時使用的 Kerberos 用戶。如果 ZooKeeper 會剝離 host 與 realm那么這里也要對應(yīng)地剝離。4.3 ZooKeeper Ensemble 加固安全 ZK 的完整細節(jié)超出本文范圍但通常需要在每臺服務(wù)器上啟用 SASL 認證并可選擇剝離 host 與 realmauthProvider.1 org.apache.zookeeper.server.auth.SASLAuthenticationProvider kerberos.removeHostFromPrincipal true kerberos.removeRealmFromPrincipal true并在啟動 ZK 服務(wù)端的命令行中加入 jaas.conf使其能找到 keytab-Djava.security.auth.login.config/jaas/zk_jaas.conf倉庫 conf/zookeeper_jaas.conf 提供了 ZK 側(cè) JAAS 模板可參考。4.4 網(wǎng)關(guān)Gateways理想情況下最終用戶只需在執(zhí)行與 Storm 交互前運行一次kinit。為此網(wǎng)關(guān)上的默認 jaas.conf 應(yīng)為StormClient { com.sun.security.auth.module.Krb5LoginModule required doNotPromptfalse useTicketCachetrue serviceName$nimbus_user; };如果用戶使用擁有 keytab 的無頭賬號也可以覆蓋此配置。5. 授權(quán)設(shè)置Authorization認證解決“你是誰”的問題授權(quán)解決“你能做什么”的問題二者缺一不可。5.1 SimpleACLAuthorizerNimbus 推薦授權(quán)插件Nimbus 首選的授權(quán)插件是SimpleACLAuthorizernimbus.authorizer: org.apache.storm.security.auth.authorizer.SimpleACLAuthorizerDRPC 有獨立的授權(quán)配置不要對 DRPC 使用 SimpleACLAuthorizer。從源碼看SimpleACLAuthorizer.java 把 Nimbus 的 Thrift 操作分為幾類L39-L83userCommandssubmitTopology、fileUpload、createStateInZookeeper、getNimbusConf、listBlobs、getClusterInfo、getTopologyHistory、getLeader、getTopologySummaries等通用集群操作supervisorCommandsfileDownload、processWorkerMetrics、getSupervisorAssignments、sendSupervisorWorkerHeartbeats等topoReadOnlyCommandsgetTopologyConf、getTopologyInfo、getTopologyPageInfo、getComponentPageInfo、getLogConfig等只讀操作topoCommandskillTopology、rebalance、activate、deactivate、uploadNewCredentials、setLogConfig等寫操作。permit()L141-L184的判定順序為管理員nimbus.admins/nimbus.admins.groups放行一切 → supervisor 用戶僅放行 supervisorCommands → 普通用戶按 userCommands 與 topoCommands 分別校驗其中拓撲級操作還會結(jié)合topology.users/topology.groups只讀操作額外參考topology.readonly.users/topology.readonly.groups逐拓撲授權(quán)。SimpleACLAuthorizer 需要知道 supervisor 用戶是誰以及所有管理員用戶包括運行 ui 守護進程的用戶nimbus.supervisor.userssupervisor 用戶列表nimbus.admins管理員用戶列表。兩者均可使用完整的 Kerberos 主體名或剝離 host 與 realm 后的用戶名。日志服務(wù)器有自己的授權(quán)配置logs.users與logs.groups應(yīng)設(shè)為集群所有節(jié)點的管理員用戶/組。拓撲提交時提交者還可以在拓撲配置中額外指定用戶/組配合集群級設(shè)置這些用戶/組將被授予在 logviewer 中查看該拓撲 worker 日志的權(quán)限——這正是 SimpleACLAuthorizer.java 中checkTopoPermission對topology.users/topology.groups的處理邏輯。5.2 限制誰能訪問 Storm默認情況下任何持有有效 Kerberos 票據(jù)的用戶都可以部署拓撲或執(zhí)行 activate/deactivate、查看集群信息等操作??梢酝ㄟ^在storm.yaml中指定nimbus.users或nimbus.groups來限制nimbus.users: - testuser或nimbus.groups: - storm配置了nimbus.users后只有列表內(nèi)的用戶能部署拓撲或訪問集群nimbus.groups則限制為屬于這些組的用戶。源碼中L164-L170只有在nimbus.users與nimbus.groups同時為空時才視為未做限制。5.3 Supervisor 無頭用戶與用戶組設(shè)置多租戶場景下為保證用戶隔離supervisor 必須運行在無頭用戶headless user和唯一用戶組之下在所有 supervisor 主機上添加所選的無頭用戶創(chuàng)建唯一用戶組并把它設(shè)為 supervisor 節(jié)點上無頭用戶的主組在這些 supervisor 節(jié)點上為 storm 設(shè)置相應(yīng)屬性。5.4 多租戶調(diào)度器Multitenant Scheduler為更好地支持多租戶Storm 提供了專門的新調(diào)度器storm.scheduler: org.apache.storm.scheduler.multitenant.MultitenantScheduler實現(xiàn)位于 MultitenantScheduler.java。注意該調(diào)度器的很多特性依賴 Storm 認證——沒有認證調(diào)度器就不知道用戶是誰也就無法正確隔離拓撲。多租戶調(diào)度器的目標(biāo)是隔離不同拓撲同時允許限制單個用戶在整個集群中占用的總資源。調(diào)度器配置可以通過storm.yaml或獨立配置文件multitenant-scheduler.yaml應(yīng)放在與storm.yaml相同的目錄設(shè)置推薦使用multitenant-scheduler.yaml因為它可以在不重啟 nimbus 的情況下熱更新。目前只有一個配置項multitenant.scheduler.user.pools從用戶名到該用戶拓撲可保證使用的最大節(jié)點數(shù)的映射。例如multitenant.scheduler.user.pools: evans: 10 derek: 10倉庫 conf/user-resource-pools-example.yaml 提供了用戶資源池的示例配置可參考。5.5 以提交拓撲的用戶身份運行 worker 進程默認情況下Storm 以運行 supervisor 的用戶身份運行 worker這對安全不理想。要改為以啟動拓撲的用戶身份運行supervisor.run.worker.as.user: true默認值為false見 conf/defaults.yaml。啟用后還需正確配置以下文件worker-launcher是一個特殊程序允許 supervisor 以不同用戶身份啟動 worker。它需要屬主為 root、屬組為只有 supervisor 無頭用戶所在的組且權(quán)限為6550octal。另有一個worker-launcher.cfg文件通常在/etc/storm下內(nèi)容大致如下storm.worker-launcher.group$(worker_launcher_group) min.user.id$(min_user_id)其中worker_launcher_group是 supervisor 用戶所在的組min.user.id設(shè)為系統(tǒng)上第一個真實用戶 id。該配置文件同樣需要屬主為 root且不能有 world 或 group 寫權(quán)限。相關(guān)實現(xiàn)可參考倉庫 storm-core/src/native/worker-launcher 目錄下的 worker-launcher 原生程序源碼。5.6 Storm-Netty 認證worker 之間 Netty 連接上的認證默認是關(guān)閉的conf/defaults.yaml 中storm.messaging.netty.authentication默認為false??梢栽诩杭壔虬赐負溟_啟開啟后將阻止任何未授權(quán)消息被處理storm.messaging.netty.authentication: true5.7 用戶模擬ImpersonationStorm 客戶端可以代表另一個用戶提交請求。例如userX提交一個 oozie 工作流工作流執(zhí)行過程中用戶oozie想代表userX提交拓撲就可以利用模擬impersonation特性。代表其他用戶提交拓撲可使用StormSubmitter.submitTopologyAsAPI或者使用NimbusClient.getConfiguredClientAs以其他用戶的身份獲取 nimbus 客戶端進而執(zhí)行任意 nimbus 操作如 kill/rebalance/activate/deactivate。要確保只有授權(quán)用戶能執(zhí)行模擬應(yīng)以nimbus.impersonation.authorizer啟動 nimbus設(shè)置為org.apache.storm.security.auth.authorizer.ImpersonationAuthorizer。該授權(quán)器使用nimbus.impersonation.acl作為授權(quán) ACL。從 ImpersonationAuthorizer.java 的prepare()L41-L46可以看到ACL 是模擬用戶 → {hosts、groups}的兩層映射結(jié)構(gòu)。以下是支持模擬的 nimbus 配置示例nimbus.impersonation.authorizer: org.apache.storm.security.auth.authorizer.ImpersonationAuthorizer nimbus.impersonation.acl: impersonating_user1: hosts: [comma separated list of hosts from which impersonating_user1 is allowed to impersonate other users] groups: [comma separated list of groups whose users impersonating_user1 is allowed to impersonate] impersonating_user2: hosts: [comma separated list of hosts from which impersonating_user2 is allowed to impersonate other users] groups: [comma separated list of groups whose users impersonating_user2 is allowed to impersonate]為支持 oozie 場景可提供如下配置nimbus.impersonation.acl: oozie: hosts: [oozie-host1, oozie-host2, 127.0.0.1] groups: [some-group-that-userX-is-part-of]即只允許來自 oozie 主機含 127.0.0.1的oozie用戶模擬some-group-that-userX-is-part-of組中的用戶。6. 憑證自動推送與續(xù)期單個拓撲可以自行把憑證票據(jù)與令牌推送給 worker以便訪問受保護的服務(wù)——但對所有用戶暴露這一能力是負擔(dān)。在常見場景下插件可以填充憑證 → 在另一端解包成 java Subject → 需要時由 Nimbus 續(xù)期。相關(guān)配置topology.auto-credentialsjava 插件列表所有插件必須實現(xiàn)IAutoCredentials接口在網(wǎng)關(guān)上填充憑證并在 worker 側(cè)解包。Kerberos 安全集群上默認應(yīng)指向org.apache.storm.security.auth.kerberos.AutoTGTnimbus.credential.renewers.classes也應(yīng)設(shè)為此值以便 Nimbus 定期代表用戶續(xù)期 TGT。nimbus.credential.renewers.freq.secs控制續(xù)期器多久輪詢一次以判斷是否有需要續(xù)期的憑證默認值600 秒見 conf/defaults.yaml通常夠用。從 AutoTGT.java 源碼看AutoTGT同時實現(xiàn)IAutoCredentials、ICredentialsRenewer與IMetricsRegistrantL42populateCredentials()通過 JAASLoginContext完成登錄并取出 Kerberos TGT序列化后以TGT鍵存入憑證 mapL71-L79worker 側(cè)再由populateSubject()反序列化回Subject續(xù)期窗口約為票據(jù)生命周期的 80%TICKET_RENEW_WINDOW 0.80f。此外Nimbus 自身也可以代表提交拓撲的用戶獲取憑證配置方式nimbus.autocredential.plugins.classes完全限定類名列表所有類必須實現(xiàn)INimbusCredentialPlugin。Nimbus 會在拓撲提交時調(diào)用所有已配置實現(xiàn)的populateCredentials方法。應(yīng)與topology.auto-credentials和nimbus.credential.renewers.classes配合使用使憑證能在 worker 側(cè)填充且 Nimbus 能自動續(xù)期。目前有兩個使用示例AutoHDFS 與 AutoHBase它們?yōu)橥負涮峤徽咦詣犹畛?hdfs 與 hbase 的 delegation token這樣用戶就不必把 keytab 分發(fā)到所有可能的 worker 主機上。7. 拓撲規(guī)模限制默認允許提交任意大小的拓撲但 ZooKeeper 等組件對拓撲大小存在實際限制。以下配置用于限制拓撲最大規(guī)模YAML 配置項說明nimbus.slots.perTopology單個拓撲最多可使用的 slot/worker 數(shù)量nimbus.executors.perTopology單個拓撲最多可使用的 executor/線程數(shù)量8. 日志清理Logviewer 守護進程還負責(zé)清理已死亡拓撲的舊日志文件YAML 配置項說明logviewer.cleanup.age.minsworker 日志必須老到多少分鐘按最后修改時間才被認為可清理存活 worker 的日志不會被 logviewer 清理它們由標(biāo)準(zhǔn)日志服務(wù)滾動如 0.11 中的 log4j2logviewer.cleanup.interval.secslogviewer 清理 worker 日志的時間間隔秒conf/defaults.yaml 中l(wèi)ogviewer.cleanup.age.mins默認值為 10080即 7 天可作為參考基準(zhǔn)。9. 配置匯總與實戰(zhàn)順序建議將本文涉及的關(guān)鍵配置按加固層次匯總均寫入storm.yaml或?qū)?yīng)的獨立配置文件層次關(guān)鍵配置說明傳輸層storm.thrift.transport默認SimpleTransportPlugin開啟 Kerberos 時改為KerberosSaslTransportPlugin主體映射storm.principal.tolocal默認DefaultPrincipalToLocalKerberos 時改為KerberosPrincipalToLocalNimbus 授權(quán)nimbus.authorizer設(shè)為SimpleACLAuthorizer用戶模擬nimbus.impersonation.authorizer/nimbus.impersonation.acl設(shè)為ImpersonationAuthorizer并配置 ACL集群訪問限制nimbus.users/nimbus.groups白名單限制管理員/監(jiān)管nimbus.admins/nimbus.supervisor.users/logs.users/logs.groups管理員與 supervisor 身份Web 層ui.filter/logviewer.filterhadoop-auth 過濾器或自定義 servlet filter加密ui.https.*/drpc.https.*HTTPS 與可選 mTLSworker 數(shù)據(jù)面storm.messaging.netty.authenticationNetty 連接鑒權(quán)進程隔離supervisor.run.worker.as.user配合 worker-launcher多租戶storm.scheduler/multitenant.scheduler.user.poolsMultitenantScheduler規(guī)模限制nimbus.slots.perTopology/nimbus.executors.perTopology防止超大拓撲日志生命周期logviewer.cleanup.age.mins/logviewer.cleanup.interval.secs日志清理推薦的加固順序先做 OS/防火墻層端口隔離 → 再為 UI/Logviewer 配置過濾器與 HTTPS → 搭建 KDC、生成主體與 keytab → 開啟 Kerberos 傳輸Nimbus/DRPC/Supervisor/ZK 的 JAAS 與 superACL→ 配置 SimpleACLAuthorizer 與 ImpersonationAuthorizer → 按需啟用 worker-as-user、Netty 認證與多租戶調(diào)度 → 最后設(shè)置拓撲規(guī)模上限與日志清理策略。倉庫中的 conf/jaas_digest.conf、conf/storm_jaas.conf、conf/zookeeper_jaas.conf 與 conf/storm.yaml.example 可作為落地配置的起點模板。10. 延伸閱讀SECURITY.md本文對應(yīng)的官方安全文檔原文conf/defaults.yaml全部配置項默認值端口、childopts、SSL、日志清理等storm-client/src/jvm/org/apache/storm/security/auth/kerberosKerberos 傳輸插件、AutoTGT、主體映射實現(xiàn)storm-client/src/jvm/org/apache/storm/security/auth/authorizerSimpleACLAuthorizer 與 ImpersonationAuthorizer 實現(xiàn)storm-server/src/main/java/org/apache/storm/scheduler/multitenant/MultitenantScheduler.java多租戶調(diào)度器實現(xiàn)storm-core/src/native/worker-launcherworker-launcher 原生程序源碼docs/SECURITY.mddocs 目錄下的安全文檔副本docs/STORM-UI-REST-API.mdUI REST APISPNEGO 認證后可訪問docs/Distributed-RPC.mdDRPC 協(xié)議與端口說明贊分享大數(shù)據(jù)流處理后端【免費下載鏈接】stormApache Storm項目地址https://gitcode.com/gh_mirrors/storm6/storm點擊查看免費下載相關(guān)推薦3分鐘完整解鎖WeMod專業(yè)版Wand-Enhancer純本地補丁新手指南3分鐘完整解鎖WeMod專業(yè)版Wand Enhancer純本地補丁新手指南 打開WeMod專業(yè)版入口鎖在灰色付費墻后面年費又不算便宜。Wand Enhan桌面應(yīng)用前端如何5分鐘掌握Mermaid Live Editor免費在線圖表編輯器的終極指南如何5分鐘掌握Mermaid Live Editor免費在線圖表編輯器的終極指南 你是否曾為創(chuàng)建流程圖、時序圖或甘特圖而煩惱Mermaid Live Edi前端開發(fā)者工具數(shù)據(jù)可視化Apache Druid 安全加固實戰(zhàn)TLS 加密、認證授權(quán)與權(quán)限模型詳解Apache Druid 安全加固實戰(zhàn)TLS 加密、認證授權(quán)與權(quán)限模型詳解 Apache Druid 默認關(guān)閉全部安全特性TLS、認證、授權(quán)以降低首次部數(shù)據(jù)庫OLAP大數(shù)據(jù)后端上一篇Weylus終極多點觸控交互系統(tǒng)讓你的平板秒變電腦繪圖板下一篇Checkmate數(shù)據(jù)庫備份自動化定時任務(wù)與恢復(fù)演練流程創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考