1. 程式人生 > >《Spark 官方文件》Spark安全性

《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 /
SPARK_MASTER_WEBUI_PORT
基於Jetty。僅獨立模式有效。
Browser Standalone Worker 8081 Web UI spark.worker.ui.port /
SPARK_WORKER_WEBUI_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通訊。