Spark 安全性
Spark 安全性:您需要知道的
預設情況下,安全性功能(例如驗證)並未啟用。在部署對網際網路或不受信任網路開放的叢集時,保護對叢集的存取非常重要,以防止未經授權的應用程式在叢集上執行。
Spark 支援多種部署類型,每種類型支援不同的安全性等級。並非所有部署類型在所有環境中都是安全的,而且預設情況下沒有任何類型是安全的。務必評估您的環境、Spark 支援的內容,並採取適當措施來保護您的 Spark 部署。
有許多不同類型的安全性疑慮。Spark 並非一定能防範所有事物。以下是 Spark 支援的部分內容。此外,請查看您所使用的部署類型的部署文件,以取得部署特定設定。Spark 不支援未記載的任何內容。
Spark RPC(Spark 程序之間的通訊協定)
驗證
Spark 目前支援使用共用密碼對 RPC 通道進行驗證。驗證可透過設定 spark.authenticate
組態參數來開啟。
用於產生和分發共用密碼的確切機制取決於部署。除非在下方指定,否則必須透過設定 spark.authenticate.secret
組態選項來定義密碼。在這種情況下,所有 Spark 應用程式和守護程式共用相同的密碼,這會限制這些部署的安全性,特別是在多租戶叢集中。
REST 提交伺服器和 MesosClusterDispatcher 不支援驗證。您應確保對 REST API 和 MesosClusterDispatcher 的所有網路存取(預設情況下分別為連接埠 6066 和 7077)都限制在受信任提交作業的主機上。
YARN
對於 Spark on YARN,Spark 會自動處理共用密碼的產生和分發。每個應用程式將使用唯一的共用密碼。在 YARN 的案例中,此功能仰賴 YARN RPC 加密,才能確保密碼分發的安全。
屬性名稱 | 預設值 | 意義 | 版本起 |
---|---|---|---|
spark.yarn.shuffle.server.recovery.disabled |
false | 對於具有較高安全性需求且偏好其機密不儲存在資料庫中的應用程式,設定為 true。此類應用程式的洗牌資料在外部洗牌服務重新啟動後將不會復原。 | 3.5.0 |
Kubernetes
在 Kubernetes 上,Spark 也會自動產生每個應用程式獨有的驗證機密。此機密會使用環境變數傳播給執行器 pod。這表示任何可以在 Spark 應用程式執行所在命名空間中列出 pod 的使用者也可以看到他們的驗證機密。Kubernetes 管理員應適當設定存取控制規則,以確保 Spark 驗證安全。
屬性名稱 | 預設值 | 意義 | 版本起 |
---|---|---|---|
spark.authenticate |
false | Spark 是否驗證其內部連線。 | 1.0.0 |
spark.authenticate.secret |
無 | 用於驗證的機密金鑰。請參閱上述內容,了解應在何時設定此組態。 | 1.0.0 |
或者,可以使用檔案和使用者掛載到其 pod 中的 Kubernetes 機密來掛載驗證機密。
屬性名稱 | 預設值 | 意義 | 版本起 |
---|---|---|---|
spark.authenticate.secret.file |
無 | 指向用於保護連線的機密金鑰的路徑。請確保檔案的內容已安全產生。此檔案會載入驅動程式和執行器,除非其他設定覆寫此設定(請參閱下方)。 | 3.0.0 |
spark.authenticate.secret.driver.file |
spark.authenticate.secret.file 的值 |
如果已指定,則會覆寫 Spark 驅動程式讀取以載入機密的位址。在用戶端模式下很有用,因為機密檔案的位址在 pod 中可能與驅動程式執行的節點不同。如果已指定,則必須指定 spark.authenticate.secret.executor.file ,以便驅動程式和執行器都可以使用檔案來載入機密金鑰。請確保驅動程式上的檔案內容與執行器上的檔案內容相同。
|
3.0.0 |
spark.authenticate.secret.executor.file |
spark.authenticate.secret.file 的值 |
如果已指定,則會覆寫 Spark 執行器讀取以載入機密的位址。在用戶端模式下很有用,因為機密檔案的位址在 pod 中可能與驅動程式執行的節點不同。如果已指定,則必須指定 spark.authenticate.secret.driver.file ,以便驅動程式和執行器都可以使用檔案來載入機密金鑰。請確保驅動程式上的檔案內容與執行器上的檔案內容相同。
|
3.0.0 |
請注意,使用檔案時,Spark 絕不會將這些檔案掛載到容器中。您必須確保機密檔案已安全部署到容器中,而且驅動程式的機密檔案與執行器的機密檔案一致。
加密
Spark 支援 RPC 連線的 AES 加密。若要啟用加密,也必須啟用 RPC 驗證並妥善設定。AES 加密使用 Apache Commons Crypto 函式庫,而 Spark 的設定系統允許進階使用者存取該函式庫的設定。
也支援 SASL 加密,儘管應視為已棄用。在與低於 2.2.0 版 Spark 的 Shuffle 服務通訊時,仍需要 SASL 加密。
下表說明設定此功能的不同選項。
屬性名稱 | 預設值 | 意義 | 版本起 |
---|---|---|---|
spark.network.crypto.enabled |
false | 啟用 AES 加密 RPC,包括 2.2.0 版中新增的驗證協定。 | 2.2.0 |
spark.network.crypto.config.* |
無 |
commons-crypto 函式庫的設定值,例如要使用的加密演算法實作。設定名稱應為 commons-crypto 設定的名稱,不含 commons.crypto 字首。
|
2.2.0 |
spark.network.crypto.saslFallback |
true | 如果使用 Spark 內部機制驗證失敗,是否改用 SASL 驗證。當應用程式連線到不支援 Spark 內部驗證協定的舊式 Shuffle 服務時,此功能會很有用。在 Shuffle 服務端,停用此功能會阻擋舊式客戶端進行驗證。 | 2.2.0 |
spark.authenticate.enableSaslEncryption |
false | 啟用基於 SASL 的加密通訊。 | 2.2.0 |
spark.network.sasl.serverAlwaysEncrypt |
false | 停用使用 SASL 驗證的埠的未加密連線。這會拒絕啟用驗證但未要求基於 SASL 的加密的客戶端連線。 | 1.4.0 |
本機儲存加密
Spark 支援加密寫入至本機磁碟的暫時資料。這涵蓋 Shuffle 檔案、Shuffle 溢位和儲存在磁碟上的資料區塊(用於快取和廣播變數)。它不涵蓋使用 API(例如 saveAsHadoopFile
或 saveAsTable
)產生的加密輸出資料。它也可能不涵蓋使用者明確建立的暫時檔案。
下列設定涵蓋啟用寫入至磁碟資料的加密
屬性名稱 | 預設值 | 意義 | 版本起 |
---|---|---|---|
spark.io.encryption.enabled |
false | 啟用本機磁碟 I/O 加密。目前由 Mesos 以外的所有模式支援。強烈建議在使用此功能時啟用 RPC 加密。 | 2.1.0 |
spark.io.encryption.keySizeBits |
128 | IO 加密金鑰大小(以位元為單位)。支援的值為 128、192 和 256。 | 2.1.0 |
spark.io.encryption.keygen.algorithm |
HmacSHA1 | 產生 IO 加密金鑰時要使用的演算法。支援的演算法說明請參閱 Java 密碼學架構標準演算法名稱文件中的 KeyGenerator 區段。 | 2.1.0 |
spark.io.encryption.commons.config.* |
無 |
commons-crypto 函式庫的設定值,例如要使用的加密演算法實作。設定名稱應為 commons-crypto 設定的名稱,不含 commons.crypto 字首。
|
2.1.0 |
Web UI
驗證和授權
使用 javax servlet 篩選器 來啟用 Web UI 的驗證。您需要一個篩選器來實作您要部署的驗證方法。Spark 沒有提供任何內建的驗證篩選器。
當驗證篩選器存在時,Spark 也支援對 UI 的存取控制。每個應用程式都可以設定自己的個別存取控制清單 (ACL)。Spark 區分「檢視」權限(誰有權限查看應用程式的 UI)和「修改」權限(誰可以執行終止正在執行的應用程式等動作)。
ACL 可以設定為使用者或群組。設定項目接受以逗號分隔的清單作為輸入,表示可以賦予多個使用者或群組所需的權限。如果您在共用叢集上執行,並且有一組管理員或開發人員需要監控他們可能沒有自己啟動的應用程式,可以使用這個功能。特定 ACL 中新增的萬用字元 (*
) 表示所有使用者都將擁有相對應的權限。預設情況下,只有提交應用程式的使用者會新增到 ACL 中。
群組成員資格是使用可設定的群組對應提供者來建立。對應器是使用下表中說明的 spark.user.groups.mapping
設定選項來設定。
下列選項控制 Web UI 的驗證
屬性名稱 | 預設值 | 意義 | 版本起 |
---|---|---|---|
spark.ui.allowFramingFrom |
SAMEORIGIN |
透過 X-Frame-Options 允許對特定命名 URI 進行框架化。預設情況下,只允許來自相同來源。 |
1.6.0 |
spark.ui.filters |
無 | 請參閱 Spark UI 設定,了解如何設定篩選器。 | 1.0.0 |
spark.acls.enable |
false | 是否應啟用 UI ACL。如果啟用,這會檢查使用者是否有權限檢視或修改應用程式。請注意,這需要使用者經過驗證,因此如果未安裝驗證篩選器,這個選項不會執行任何動作。 | 1.1.0 |
spark.admin.acls |
無 | 以逗號分隔的使用者清單,這些使用者有權限檢視和修改 Spark 應用程式。 | 1.1.0 |
spark.admin.acls.groups |
無 | 以逗號分隔的群組清單,這些群組有權限檢視和修改 Spark 應用程式。 | 2.0.0 |
spark.modify.acls |
無 | 具有修改 Spark 應用程式存取權限的使用者清單(以逗號分隔)。 | 1.1.0 |
spark.modify.acls.groups |
無 | 具有修改 Spark 應用程式存取權限的群組清單(以逗號分隔)。 | 2.0.0 |
spark.ui.view.acls |
無 | 具有檢視 Spark 應用程式存取權限的使用者清單(以逗號分隔)。 | 1.0.0 |
spark.ui.view.acls.groups |
無 | 具有檢視 Spark 應用程式存取權限的群組清單(以逗號分隔)。 | 2.0.0 |
spark.user.groups.mapping |
org.apache.spark.security.ShellBasedGroupsMappingProvider |
使用特質 org.apache.spark.security.GroupMappingServiceProvider 定義的群組對應服務決定使用者的群組清單,此服務可透過此屬性設定。
預設使用基於 Unix shell 的實作,它會從主機作業系統收集此資訊。 注意:此實作僅支援基於 Unix/Linux 的環境。目前不支援 Windows 環境。不過,可透過實作上述特質來支援新的平台/通訊協定。 |
2.0.0 |
在 YARN 上,提交應用程式時會將檢視和修改 ACL 提供給 YARN 服務,並透過 YARN 介面控管擁有相關權限的人員。
Spark 歷程伺服器 ACL
SHS 網頁使用者介面的驗證方式與一般應用程式相同,使用 servlet 篩選器。
若要啟用 SHS 中的授權,請使用下列幾個額外的選項
屬性名稱 | 預設值 | 意義 | 版本起 |
---|---|---|---|
spark.history.ui.acls.enable |
false |
指定是否應檢查 ACL 以授權使用者檢視歷史伺服器中的應用程式。如果啟用,則執行存取控制檢查,而不論個別應用程式對 spark.ui.acls.enable 設定為何。應用程式擁有者永遠有權限檢視自己的應用程式,而透過 spark.ui.view.acls 指定的任何使用者和透過 spark.ui.view.acls.groups 指定的任何群組在執行應用程式時,也將有權限檢視該應用程式。如果停用,則不會對透過歷史伺服器提供的任何應用程式使用者介面進行存取控制檢查。
|
1.0.1 |
spark.history.ui.admin.acls |
無 | 具有檢視歷史伺服器中所有 Spark 應用程式存取權限的使用者清單(以逗號分隔)。 | 2.1.1 |
spark.history.ui.admin.acls.groups |
無 | 具有檢視歷史伺服器中所有 Spark 應用程式存取權限的群組清單(以逗號分隔)。 | 2.1.1 |
SHS 使用與一般應用程式相同的選項來設定群組對應提供者。在此情況下,群組對應提供者將套用至 SHS 提供的所有使用者介面,而個別應用程式設定將會略過。
SSL 設定
SSL 設定會以階層方式組織。使用者可以設定預設 SSL 設定,除非被通訊協定特定設定覆寫,否則會用於所有支援的通訊協定。這樣一來,使用者可以輕鬆地提供所有協定的共用設定,而不會停用個別設定每個協定的功能。下表說明 SSL 設定名稱空間
設定名稱空間 | 元件 |
---|---|
spark.ssl |
預設的 SSL 組態。這些值會套用至以下所有命名空間,除非在命名空間層級明確覆寫。 |
spark.ssl.ui |
Spark 應用程式 Web UI |
spark.ssl.standalone |
獨立主控程式/工作器 Web UI |
spark.ssl.historyServer |
歷程伺服器 Web UI |
可用的 SSL 選項的完整細目如下。${ns}
佔位符應替換為上述其中一個命名空間。
屬性名稱 | 預設值 | 意義 |
---|---|---|
${ns}.enabled |
false | 啟用 SSL。啟用時,需要 ${ns}.ssl.protocol 。 |
${ns}.port |
無 |
SSL 服務會監聽的連接埠。
必須在特定命名空間組態中定義連接埠。讀取此組態時會忽略預設命名空間。 未設定時,SSL 連接埠會衍生自相同服務的非 SSL 連接埠。「0」值會讓服務繫結至臨時連接埠。 |
${ns}.enabledAlgorithms |
無 |
以逗號分隔的密碼清單。指定的密碼必須受 JVM 支援。
可以在 Java 安全指南的「JSSE 密碼組名稱」區段找到參考協定清單。Java 8 的清單可以在 此 頁面找到。 注意:如果未設定,將會使用 JRE 的預設密碼組。 |
${ns}.keyPassword |
無 | 金鑰庫中私人金鑰的密碼。 |
${ns}.keyStore |
無 | 金鑰庫檔案的路徑。路徑可以是絕對路徑,也可以是相對於程序啟動目錄的相對路徑。 |
${ns}.keyStorePassword |
無 | 金鑰庫的密碼。 |
${ns}.keyStoreType |
JKS | 金鑰庫的類型。 |
${ns}.protocol |
無 |
要使用的 TLS 協定。協定必須受 JVM 支援。
可以在 Java 安全指南的「其他 JSSE 標準名稱」區段找到參考協定清單。對於 Java 8,可以在 此 頁面找到清單。 |
${ns}.needClientAuth |
false | 是否需要用戶端驗證。 |
${ns}.trustStore |
無 | 信任庫檔案的路徑。路徑可以是絕對路徑,也可以是相對於程序啟動目錄的相對路徑。 |
${ns}.trustStorePassword |
無 | 信任庫的密碼。 |
${ns}.trustStoreType |
JKS | 信任庫的類型。 |
Spark 也支援從 Hadoop 憑證提供者 中擷取 ${ns}.keyPassword
、${ns}.keyStorePassword
和 ${ns}.trustStorePassword
。使用者可以將密碼儲存在憑證檔案中,並讓不同元件存取,例如
hadoop credential create spark.ssl.keyPassword -value password \
-provider jceks://hdfs@nn1.example.com:9001/user/backup/ssl.jceks
若要設定憑證提供者的位置,請在 Spark 使用的 Hadoop 設定中設定 hadoop.security.credential.provider.path
設定選項,例如
<property>
<name>hadoop.security.credential.provider.path</name>
<value>jceks://hdfs@nn1.example.com:9001/user/backup/ssl.jceks</value>
</property>
或透過 SparkConf “spark.hadoop.hadoop.security.credential.provider.path=jceks://hdfs@nn1.example.com:9001/user/backup/ssl.jceks”。
準備金鑰庫
金鑰儲存可以透過 keytool
程式產生。Java 8 此工具的參考文件 在此。設定 Spark 獨立部署模式的金鑰儲存和信任儲存的最基本步驟如下
- 為每個節點產生金鑰對
- 將金鑰對的公開金鑰匯出到每個節點上的檔案
- 將所有匯出的公開金鑰匯入單一信任儲存
- 將信任儲存分發到叢集節點
YARN 模式
若要提供本機信任儲存或金鑰儲存檔案給在叢集模式下執行的驅動程式,可以使用 --files
命令列引數(或等效的 spark.files
設定)將它們與應用程式一起分發。檔案將會放置在驅動程式的作業目錄中,因此 TLS 設定應該只參照檔案名稱,而沒有絕對路徑。
以這種方式分發本機金鑰儲存可能需要將檔案暫存在 HDFS(或叢集使用的其他類似分散式檔案系統)中,因此建議將基礎檔案系統設定為具有安全性(例如,啟用驗證和線路加密)。
獨立模式
使用者需要提供主控程式和工作機的金鑰儲存和設定選項。必須透過附加適當的 Java 系統屬性在 SPARK_MASTER_OPTS
和 SPARK_WORKER_OPTS
環境變數中,或僅在 SPARK_DAEMON_JAVA_OPTS
中設定。
使用者可以允許執行器使用從工作程序繼承的 SSL 設定。可以透過將 spark.ssl.useNodeLocalConf
設定為 true
來達成。在這種情況下,不會使用使用者在用戶端提供的設定。
Mesos 模式
Mesos 1.3.0 和更新版本支援 Secrets
基本元素,做為基於檔案和基於環境的秘密。Spark 允許使用 spark.mesos.driver.secret.filenames
和 spark.mesos.driver.secret.envkeys
分別指定基於檔案和基於環境變數的秘密。
根據秘密儲存後端,秘密可以使用 spark.mesos.driver.secret.names
和 spark.mesos.driver.secret.values
設定屬性分別按參考或按值傳遞。
參考類型機密由機密儲存庫提供,並以名稱參照,例如 /mysecret
。值類型機密會在命令列中傳遞,並轉換為其適當的檔案或環境變數。
HTTP 安全標頭
可以將 Apache Spark 設定為包含 HTTP 標頭,以協助防止跨網站指令碼 (XSS)、跨框架指令碼 (XFS)、MIME 偵測,以及強制執行 HTTP 嚴格傳輸安全性。
屬性名稱 | 預設值 | 意義 | 版本起 |
---|---|---|---|
spark.ui.xXssProtection |
1; mode=block |
HTTP X-XSS-Protection 回應標頭的值。您可以從以下內容中選擇適當的值
|
2.3.0 |
spark.ui.xContentTypeOptions.enabled |
true |
啟用後,X-Content-Type-Options HTTP 回應標頭會設定為「nosniff」。 | 2.3.0 |
spark.ui.strictTransportSecurity |
無 |
HTTP 嚴格傳輸安全性 (HSTS) 回應標頭的值。您可以從以下內容中選擇適當的值,並相應設定 expire-time 。此選項僅在啟用 SSL/TLS 時使用。
|
2.3.0 |
設定網路安全連接埠
一般來說,Spark 集群及其服務並未部署在公共網際網路上。它們通常是私人服務,而且應該只能在部署 Spark 的組織網路中存取。應將 Spark 服務所使用的主機和埠的存取權限限制給需要存取這些服務的來源主機。
以下是 Spark 用於其通訊的主要埠,以及如何設定這些埠。
僅限獨立模式
從 | 到 | 預設埠 | 目的 | 設定 | 備註 |
---|---|---|---|---|---|
瀏覽器 | 獨立主控 | 8080 | Web UI | spark.master.ui.port / |
基於 Jetty。僅限獨立模式。 |
瀏覽器 | 獨立工作 | 8081 | Web UI | spark.worker.ui.port / |
基於 Jetty。僅限獨立模式。 |
驅動程式 / 獨立工作 |
獨立主控 | 7077 | 提交工作至叢集 / 加入叢集 |
SPARK_MASTER_PORT |
設定為「0」以隨機選擇埠。僅限獨立模式。 |
外部服務 | 獨立主控 | 6066 | 透過 REST API 提交工作至叢集 | spark.master.rest.port |
使用 spark.master.rest.enabled 啟用/停用此服務。僅限獨立模式。 |
獨立主控 | 獨立工作 | (隨機) | 排程執行器 | SPARK_WORKER_PORT |
設定為「0」以隨機選擇埠。僅限獨立模式。 |
所有叢集管理員
從 | 到 | 預設埠 | 目的 | 設定 | 備註 |
---|---|---|---|---|---|
瀏覽器 | 應用程式 | 4040 | Web UI | spark.ui.port |
基於 Jetty |
瀏覽器 | 歷史伺服器 | 18080 | Web UI | spark.history.ui.port |
基於 Jetty |
執行器 / 獨立主控 |
驅動程式 | (隨機) | 連線至應用程式 / 通知執行器狀態變更 |
spark.driver.port |
設為「0」以隨機選取一個埠。 |
執行器 / 驅動程式 | 執行器 / 驅動程式 | (隨機) | 區塊管理員埠 | spark.blockManager.port |
透過 ServerSocketChannel 的原始 Socket |
Kerberos
Spark 支援在使用 Kerberos 進行驗證的環境中提交應用程式。在多數情況下,Spark 在驗證 Kerberos 感知服務時,仰賴目前已登入使用者的憑證。此類憑證可透過使用 kinit
等工具登入已設定的 KDC 來取得。
與 Hadoop 為基礎的服務交談時,Spark 需要取得委派權杖,以便非本機程序可以進行驗證。Spark 附帶對 HDFS 和其他 Hadoop 檔案系統、Hive 和 HBase 的支援。
使用 Hadoop 檔案系統(例如 HDFS 或 WebHDFS)時,Spark 會取得主機使用者家目錄的服務相關權杖。
如果 HBase 在應用程式的類別路徑中,且 HBase 設定已開啟 Kerberos 驗證(hbase.security.authentication=kerberos
),則會取得 HBase 權杖。
類似地,如果 Hive 在類別路徑中,且設定包含遠端 Metastore 服務的 URI(hive.metastore.uris
不為空),則會取得 Hive 權杖。
如果應用程式需要與其他安全的 Hadoop 檔案系統互動,則需要在啟動時明確提供其 URI 給 Spark。這可透過在 spark.kerberos.access.hadoopFileSystems
屬性中列出這些 URI 來完成,如下面的設定區段所述。
Spark 也支援使用 Java 服務機制(請參閱 java.util.ServiceLoader
)自訂委派權杖提供者。可透過在 JAR 的 META-INF/services
目錄中對應檔案中列出其名稱,讓 Spark 使用 org.apache.spark.security.HadoopDelegationTokenProvider
的實作。
目前僅在 YARN 和 Mesos 模式中支援委派權杖支援。請參閱特定於部署的頁面以取得更多資訊。
下列選項提供更精細的控制功能
屬性名稱 | 預設值 | 意義 | 版本起 |
---|---|---|---|
spark.security.credentials.${service}.enabled |
true |
控制在啟用安全性時是否取得服務憑證。預設情況下,會在設定這些服務時擷取所有支援服務的憑證,但如果這會與正在執行的應用程式產生衝突,則可以停用此行為。 | 2.3.0 |
spark.kerberos.access.hadoopFileSystems |
(無) |
Spark 應用程式將存取的安全 Hadoop 檔案系統的逗號分隔清單。例如,spark.kerberos.access.hadoopFileSystems=hdfs://nn1.com:8032,hdfs://nn2.com:8032, webhdfs://nn3.com:50070 。Spark 應用程式必須有權存取所列出的檔案系統,且 Kerberos 必須正確設定才能存取這些檔案系統(在同一個領域或受信任的領域中)。Spark 為每個檔案系統取得安全權杖,以便 Spark 應用程式可以存取那些遠端的 Hadoop 檔案系統。
|
3.0.0 |
使用者可以在資源排程器中排除 Kerberos 委派權杖更新。目前僅在 YARN 上支援。設定涵蓋在 在 YARN 上執行 Spark 頁面中。
長時間執行應用程式
如果長時間執行的應用程式的執行時間超過其需要存取的服務中設定的最大委派權杖生命週期,則可能會遇到問題。
此功能並非在所有地方都可用。特別是,它僅在 YARN 和 Kubernetes(用戶端和叢集模式)以及在使用用戶端模式時在 Mesos 上實作。
Spark 支援為這些應用程式自動建立新的權杖。有兩種方式可以啟用此功能。
使用 Keytab
透過提供 Spark 一個主體和 keytab(例如,使用 spark-submit
搭配 --principal
和 --keytab
參數),應用程式將維護一個有效的 Kerberos 登入,可無限期地用來擷取委派權杖。
請注意,在叢集模式中使用 keytab 時,它將複製到執行 Spark 驅動程式的機器上。在 YARN 的情況下,這表示使用 HDFS 作為 keytab 的暫存區域,因此強烈建議至少將 YARN 和 HDFS 使用加密保護。
使用驗證快取
透過在 Spark 的設定中將 spark.kerberos.renewal.credentials
設定為 ccache
,將使用本機 Kerberos 權杖快取進行驗證。Spark 會在可更新的生命週期內持續更新權杖,但在權杖過期後,需要取得新的權杖(例如,執行 kinit
)。
使用者有責任維護 Spark 可以使用的更新權杖快取。
可以透過設定 KRB5CCNAME
環境變數自訂權杖快取的位置。
與 Kubernetes 的安全互動
在與 Kerberos 背後的 Hadoop-based 服務通訊時,請注意 Spark 需要取得委派權杖,以便非本機程序可以驗證。Kubernetes 中的這些委派權杖儲存在驅動程式及其執行器共享的 Secrets 中。因此,有以下三種提交 Kerberos 工作的方式
在所有情況下,您都必須定義環境變數:HADOOP_CONF_DIR
或 spark.kubernetes.hadoop.configMapName.
另外,請注意 KDC 必須在容器內部可見。
如果使用者想要使用遠端的 HADOOP_CONF 目錄,其中包含 Hadoop 組態檔,這可以透過設定 spark.kubernetes.hadoop.configMapName
為預先存在的 ConfigMap 來達成。
- 使用儲存在本機票證快取中的 TGT 提交
/usr/bin/kinit -kt <keytab_file> <username>/<krb5 realm> /opt/spark/bin/spark-submit \ --deploy-mode cluster \ --class org.apache.spark.examples.HdfsTest \ --master k8s://<KUBERNETES_MASTER_ENDPOINT> \ --conf spark.executor.instances=1 \ --conf spark.app.name=spark-hdfs \ --conf spark.kubernetes.container.image=spark:latest \ --conf spark.kubernetes.kerberos.krb5.path=/etc/krb5.conf \ local:///opt/spark/examples/jars/spark-examples_<VERSION>.jar \ <HDFS_FILE_LOCATION>
- 使用本機 Keytab 和 Principal 提交
/opt/spark/bin/spark-submit \ --deploy-mode cluster \ --class org.apache.spark.examples.HdfsTest \ --master k8s://<KUBERNETES_MASTER_ENDPOINT> \ --conf spark.executor.instances=1 \ --conf spark.app.name=spark-hdfs \ --conf spark.kubernetes.container.image=spark:latest \ --conf spark.kerberos.keytab=<KEYTAB_FILE> \ --conf spark.kerberos.principal=<PRINCIPAL> \ --conf spark.kubernetes.kerberos.krb5.path=/etc/krb5.conf \ local:///opt/spark/examples/jars/spark-examples_<VERSION>.jar \ <HDFS_FILE_LOCATION>
- 使用預先填入的機密提交,其中包含委派權杖,且已存在於命名空間中
/opt/spark/bin/spark-submit \ --deploy-mode cluster \ --class org.apache.spark.examples.HdfsTest \ --master k8s://<KUBERNETES_MASTER_ENDPOINT> \ --conf spark.executor.instances=1 \ --conf spark.app.name=spark-hdfs \ --conf spark.kubernetes.container.image=spark:latest \ --conf spark.kubernetes.kerberos.tokenSecret.name=<SECRET_TOKEN_NAME> \ --conf spark.kubernetes.kerberos.tokenSecret.itemKey=<SECRET_ITEM_KEY> \ --conf spark.kubernetes.kerberos.krb5.path=/etc/krb5.conf \ local:///opt/spark/examples/jars/spark-examples_<VERSION>.jar \ <HDFS_FILE_LOCATION>
3b. 以 (3) 中的方式提交,但指定預先建立的 krb5 ConfigMap 和預先建立的 HADOOP_CONF_DIR
ConfigMap
/opt/spark/bin/spark-submit \
--deploy-mode cluster \
--class org.apache.spark.examples.HdfsTest \
--master k8s://<KUBERNETES_MASTER_ENDPOINT> \
--conf spark.executor.instances=1 \
--conf spark.app.name=spark-hdfs \
--conf spark.kubernetes.container.image=spark:latest \
--conf spark.kubernetes.kerberos.tokenSecret.name=<SECRET_TOKEN_NAME> \
--conf spark.kubernetes.kerberos.tokenSecret.itemKey=<SECRET_ITEM_KEY> \
--conf spark.kubernetes.hadoop.configMapName=<HCONF_CONFIG_MAP_NAME> \
--conf spark.kubernetes.kerberos.krb5.configMapName=<KRB_CONFIG_MAP_NAME> \
local:///opt/spark/examples/jars/spark-examples_<VERSION>.jar \
<HDFS_FILE_LOCATION>
事件記錄
如果您的應用程式使用事件記錄,則事件記錄所在的目錄 (spark.eventLog.dir
) 應手動建立並具有適當的權限。若要保護記錄檔,目錄權限應設定為 drwxrwxrwxt
。目錄的所有者和群組應對應到執行 Spark 歷程記錄伺服器的超級使用者。
這將允許所有使用者寫入目錄,但會阻止沒有權限的使用者讀取、移除或重新命名檔案,除非他們擁有該檔案。Spark 將建立事件記錄檔,並設定權限,讓只有使用者和群組具有讀取和寫入權限。
在用戶端模式中保留驅動程式記錄
如果您的應用程式在用戶端模式中透過啟用 spark.driver.log.persistToDfs.enabled
來保留驅動程式記錄,則驅動程式記錄所在的目錄 (spark.driver.log.dfsDir
) 應手動建立並具有適當的權限。若要保護記錄檔,目錄權限應設定為 drwxrwxrwxt
。目錄的所有者和群組應對應到執行 Spark 歷程記錄伺服器的超級使用者。
這將允許所有使用者寫入目錄,但會阻止沒有權限的使用者讀取、移除或重新命名檔案,除非他們擁有該檔案。Spark 將建立驅動程式記錄檔,並設定權限,讓只有使用者和群組具有讀取和寫入權限。