《Spark 官方文檔》Spark安全性
Spark安全性
Spark目前已經支持以共享秘鑰的方式進行身份認證。開啟身份認證配置參數為 spark.authenticate 。這個配置參數決定了Spark通訊協議是否使用共享秘鑰做身份驗證。驗證過程就是一個基本的握手過程,確保通訊雙方都有相同的秘鑰並且可以互相通信。如果共享秘鑰不同,雙方是不允許通信的。共享秘鑰可用以下方式創建:
- 對於以YARN 方式部署的Spark,將 spark.authenticate 設為true可以自動生成並分發共享秘鑰。每個Spark應用會使用唯一的共享秘鑰。
- 而對於其他部署類型,需要在每個節點上設置 spark.authenticate.secret 參數。這個秘鑰將會在由所有 Master/Workers以及各個Spark應用共享。
Web UI
Spark UI 也可以通過配置 spark.ui.filters 來使用 javax servlet filters 確保安全性,因為某些用戶可能希望web UI上的某些數據應該保密,並對其他用戶不可見。用戶可以自定義 javax servlet filter 來對登陸用戶進行認證,Spark會根據用戶的ACL(訪問控製列表)來確保該登陸用戶有權限訪問某個Spark應用的web UI。Spark ACL的行為可由 spark.acls.enable 和 spark.ui.view.acls 共同控製。注意,啟動Spark應用的用戶總是會有權限訪問該應用對應的UI。而在YARN模式下,Spark web UI會使用YARN的web應用代理機製,通過Hadoop過濾器進行認證。
Spark還支持修改運行中的Spark應用對應的ACL以便更改其權限控製,不過這可能會導致殺死應用或者殺死任務的動作。這一特性由 spark.acls.enable 和 spark.modify.acls 共同控製。注意,如果你需要web UI的認證,比如為了能夠在web UI上使用殺死應用的按鈕,那麼就需要將用戶同時添加到modify ACL和view ACL中。在YARN上,控製用戶修改權限的modify ACL是通過YARN接口傳進來的。
Spark可以允許多個管理員共同管理ACL,而且這些管理員總是能夠訪問和修改所有的Spark應用。而管理員本身是由 spark.admin.acls 配置的。在一個共享的多用戶集群中,你可能需要配置多個管理員,另外,該配置也可以用於支持開發人員調試Spark應用。
事件日誌
如果你啟用了事件日誌(event logging),那麼這些日誌對應的目錄(spark.eventLog.dir)需要事先手動創建並設置好權限。如果你要限製這些日誌文件的權限,首先還是要將日誌目錄的權限設為 drwxrwxrwxt,目錄owner應該是啟動history server的超級用戶,對應的組限製為該超級用戶所在組。這樣其他所有用戶就隻能往該目錄下寫日誌,但同時又不能刪除或改名。事件日誌文件隻有在用戶或者用戶組具有讀寫權限時才能寫入。
加密
Spark對Akka和HTTP協議(廣播和文件服務器中使用)支持SSL。同時,對數據塊傳輸服務(block transfer service)支持SASL加密。Spark web UI暫時還不支持任何加密。
Spark的臨時數據存儲,如:混洗中間文件、緩存數據或其他應用相關的臨時文件,目前也沒有加密。如果需要加密這些數據,隻能通過配置集群管理器將數據存儲到加密磁盤上。
SSL配置
Spark SSL相關配置是層級式的。用戶可以配置SSL的默認配置,以便支持所有的相關通訊協議,當然,如果設置了針對某個具體協議配置值,其值將會覆蓋默認配置對應的值。這種方式主要是為了方便用戶,用戶可以輕鬆地為所有協議都配置好默認值,同時又不會影響針對某一個具體協議的特殊配置需求。通用的SSL默認配置在 spark.ssl 這一配置命名空間下,對於Akka的SSL配置,在spark.ssl.akka下,而對用於廣播和文件服務器中的HTTP協議,其配置在 spark.ssl.fs 下。詳細的清單見配置指南(configuration page)。
SSL必須在每個節點上都配置好,並且包括各個使用特定通訊協議的相關模塊。
YARN模式
key-store 文件可以由客戶端準備好,然後作為Spark應用的一部分分發到各個執行器(executor)上使用。用戶也可以在Spark應用啟動前,通過配置 spark.yarn.dist.files 或者 spark.yarn.dist.archives 來部署key-store文件。這些文件傳輸過程的加密是由YARN本身負責的,和Spark就沒什麼關係了。
對於一些長期運行並且可以寫HDFS的Spark應用,如:Spark Streaming 上的應用,可以用 spark-submit 的 –principal 和 –keytab 參數分別設置principal 和 keytab 信息。keytab文件將會通過 Hadoop Distributed Cache(如果YARN配置了 SSL並且HDFS啟用了加密,那麼分布式緩存的傳輸也會被加密) 複製到Application Master所在機器上。Kerberos的登陸信息將會被principal和keytab周期性地刷新,同時HDFS所需的代理token也會被周期性的刷新,這樣Spark應用就能持續地寫入HDFS了。
獨立模式
獨立模式下,用戶需要為master和worker分別提供key-store和相關配置選項。這些配置可以通過在SPARK_MASTER_OPTS 和 SPARK_WORKER_OPTS,或者 SPARK_DEAMON_JAVA_OPTS環境變量中添加相應的java係統屬性來設置。獨立模式下,用戶可以通過worker的SSL設置來改變執行器(executor)的配置,因為這些執行器進程都是worker的子進程。不過需要注意的是,執行器如果需要啟用本地SSL配置值(如:從worker進程繼承而來的環境變量),而不是用戶在客戶端設置的值,就需要將 spark.ssl.userNodeLocalConf 設為 true。
準備key-stores
key-stores 文件可以由 keytool 程序生成。keytool 相關參考文檔見這裏:here。獨立模式下,配置key-store和trust-store至少有這麼幾個基本步驟:
- 為每個節點生成一個秘鑰對
- 導出各節點秘鑰對中的公匙(public key)到一個文件
- 將所有這些公匙導入到一個 trust-store 文件中
- 將該trust-store文件發布到所有節點
配置SASL加密
啟用認證後(spark.authenticate),數據塊傳輸服務(block transfer service)可以支持SASL加密。如需啟用SASL加密的話,還需要在 Spark 應用中設置 spark.authenticate.enableSaslEncryption 為 true。
如果是開啟了外部混洗服務(external shuffle service),那麼隻需要將 spark.network.sasl.serverAlwaysEncrypt 設為true即可禁止非加密的網絡連接。因為這個配置一旦啟用,所有未使用 SASL加密的Spark應用都無法連接到外部混洗服務上。
配置網絡安全端口
Spark計算過程中大量使用網絡通信,而有些環境中對網絡防火牆的設置要求很嚴格。下表列出來Spark用於通訊的一些主要端口,以及如何配置這些端口。
僅獨立部署適用
訪問源 | 訪問目標 | 默認值 | 用途 | 配置 | 注意 |
---|---|---|---|---|---|
Browser | Standalone Master | 8080 | Web UI | spark.master.ui.port / |
基於Jetty。僅獨立模式有效。 |
Browser | Standalone Worker | 8081 | Web UI | spark.worker.ui.port / |
基於Jetty。僅獨立模式有效。 |
Driver / Standalone Worker |
Standalone Master | 7077 | 提交作業 / 合並集群 | SPARK_MASTER_PORT |
基於Akka。設為0表示隨機。僅獨立模式有效。 |
Standalone Master | Standalone Worker | (random) | 調度執行器 | SPARK_WORKER_PORT |
基於Akka。設為0表示隨機。僅獨立模式有效。 |
所有集群管理器適用
訪問源 | 訪問目標 | 默認值 | 用途 | 配置 | 注意 |
---|---|---|---|---|---|
Browser | Application | 4040 | Web UI | spark.ui.port |
基於Jetty |
Browser | History Server | 18080 | Web UI | spark.history.ui.port |
基於Jetty |
Executor / Standalone Master |
Driver | (random) | 連接Spark應用 / 執行器狀態變化通知 | spark.driver.port |
基於Akka。設為0表示隨機。 |
Driver | Executor | (random) | 任務調度 | spark.executor.port |
基於Akka。設為0表示隨機。 |
Executor | Driver | (random) | 傳輸文件和jar包的文件服務器 | spark.fileserver.port |
基於Jetty |
Executor | Driver | (random) | HTTP廣播 | spark.broadcast.port |
基於Jetty。TorrentBroadcast通過block manager發送數據,所以不會用這個端口。 |
Executor | Driver | (random) | 類文件服務器 | spark.replClassServer.port |
基於Jetty。僅Spark shell使用。 |
Executor / Driver | Executor / Driver | (random) | 數據塊管理器端口 | spark.blockManager.port |
基於ServerSocketChannel使用原始socket通信。 |
最後更新:2017-05-19 16:02:05