Spark目前通过共享密钥支持身份验证。 可以通过spark.authenticate配置参数将身份验证配置为打开。 此参数控制Spark通信协议是否使用共享密钥进行身份验证。 此身份验证是一种基本握手,可确保双方具有相同的共享密钥并允许进行通信。 如果共享密钥不相同,则不允许它们进行通信。 共享密钥创建如下:
可以通过spark.ui.filters设置使用javax servlet过滤器以及通过SSL设置使用https / SSL来保护Spark UI。
Authentication(认证)
如果用户具有不允许其他用户看到的数据,则用户可能希望保护用户界面。用户指定的javax servlet过滤器可以对用户进行身份验证,然后一旦用户登录,Spark就可以将该用户与视图ACL进行比较,以确保他们有权查看UI。配置spark.acls.enable,spark.ui.view.acls和spark.ui.view.acls.groups控制ACL的行为。请注意,启动应用程序的用户始终具有UI的视图访问权限。在YARN上,Spark UI使用标准的YARN Web应用程序代理机制,并将通过任何已安装的Hadoop过滤器进行身份验证。
Spark还支持修改ACL以控制谁有权修改正在运行的Spark应用程序。这包括杀死应用程序或任务等内容。这由configs spark.acls.enable,spark.modify.acls和spark.modify.acls.groups控制。请注意,如果您要对Web UI进行身份验证,那么为了在Web UI上使用kill按钮,可能还需要将修改请求中的用户添加到视图中。在YARN上,传入修改acls并控制谁通过YARN接口修改访问权限。 Spark允许在总是具有查看和修改所有应用程序权限的acls中指定一组管理员。由configs spark.admin.acls和spark.admin.acls.groups控制。这在您可能拥有帮助用户调试应用程序的管理员或支持人员的共享群集上非常有用。
如果您的应用程序正在使用事件日志记录,则应手动创建事件日志所在的目录(spark.eventLog.dir)并在其上设置适当的权限。 如果您希望这些日志文件受到保护,则应将该目录的权限设置为drwxrwxrwxt。 目录的所有者应该是运行历史记录服务器的超级用户,并且组权限应限制为超级用户组。 这将允许所有用户写入目录,但会阻止非特权用户删除或重命名文件,除非他们拥有该文件或目录。 Spark将创建事件日志文件,其权限使得只有用户和组具有读写访问权限。
Spark支持HTTP协议的SSL。 块传输服务和RPC端点支持SASL加密。 如果需要,也可以加密随机文件。
SSL Configuration
SSL的配置按层次结构组织。 用户可以配置默认SSL设置,这些设置将用于所有支持的通信协议,除非它们被特定于协议的设置覆盖。 这样,用户可以轻松地为所有协议提供通用设置,而无需单独配置每个协议。 常见的SSL设置位于Spark配置中的spark.ssl命名空间。 下表描述了用于覆盖默认设置的特定于组件的配置命名空间:
Config Namespace | Component |
---|---|
spark.ssl.fs | 文件下载客户端(用于从启用HTTPS的服务器下载jar和文件)。 |
spark.ssl.ui | Spark application Web UI |
spark.ssl.standalone | Standalone Master / Worker Web UI |
spark.ssl.historyServer | History Server Web UI |
YARN mode
密钥库可以在客户端准备,然后由执行程序分发和使用,作为应用程序的一部分。这是可能的,因为用户可以使用spark.yarn.dist.files或spark.yarn.dist.archives配置设置在YARN中启动应用程序之前部署文件。转移这些文件的加密责任在YARN方面,与Spark无关。
对于像Spark Streaming应用程序这样长时间运行的应用程序能够写入HDFS,可以通过–principal和–keytab参数分别将主体和keytab传递给spark-submit。传入的密钥表将通过Hadoop分布式缓存复制到运行Application Master的计算机上(安全地 - 如果YARN配置了SSL并启用了HDFS加密)。将使用此主体和密钥表定期更新Kerberos登录,并且将定期生成HDFS所需的委派令牌,以便应用程序可以继续写入HDFS。
Standalone mode
用户需要为master和worker提供密钥库和配置选项。 必须通过在SPARK_MASTER_OPTS和SPARK_WORKER_OPTS环境变量中附加适当的Java系统属性来设置它们,或者仅在SPARK_DAEMON_JAVA_OPTS中附加它们。 在此模式下,用户可以允许执行程序使用从生成该执行程序的worker继承的SSL设置。 可以通过将spark.ssl.useNodeLocalConf设置为true来完成。 如果设置了该参数,则执行者不会使用用户在客户端提供的设置。
Mesos mode
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。 值类型机密在命令行上传递并转换为适当的文件或环境变量。
Preparing the key-stores
密钥库可以通过keytool程序生成。 此工具的参考文档在此处。 为独立部署模式配置密钥库和信任库的最基本步骤如下:
启用身份验证(spark.authenticate)时,块传输服务当前支持SASL加密。 要为应用程序启用SASL加密,请在应用程序的配置中将spark.authenticate.enableSaslEncryption设置为true。
使用外部shuffle服务时,可以通过在shuffle服务的配置中将spark.network.sasl.serverAlwaysEncrypt设置为true来禁用未加密的连接。 如果启用该选项,则未设置为使用SASL加密的应用程序将无法连接到shuffle服务。
Spark大量使用网络,某些环境对使用严密的防火墙设置有严格的要求。 以下是Spark用于通信的主要端口以及如何配置这些端口。
Standalone mode only
from | to | Default port | Purpose | configuration Setting | Notes |
---|---|---|---|---|---|
Browser | Standalone Master | 8080 | Web UI | spark.master.ui.port /SPARK_MASTER_WEBUI_PORT | Jetty-based. Standalone mode only. |
Browser | Standalone worker | 8081 | Web UI | spark.worker.ui.port /SPARK_WORKER_WEBUI_PORT | Jetty-based. Standalone mode only. |
Driver /Standalone Worker | Standalone Master | 7077 | Submit job to cluster /Join cluster | SPARK_MASTER_PORT | Set to “0” to choose a port randomly. Standalone mode only. |
Standalone Master | Standalone Worker | (random) | Schedule executors | SPARK_WORKER_PORT | Set to “0” to choose a port randomly. Standalone mode only. |
All cluster managers
from | to | Default port | Purpose | configuration Setting | Notes |
---|---|---|---|---|---|
Browser | Application | 4040 | Web UI | spark.ui.port | Jetty-based |
Browser | History Server | 18080 | Web UI | spark.history.ui.port | Jetty-based |
Executor /Standalone Master | Driver | (random) | Connect to application /Notify executor state changes | spark.driver.port | Set to “0” to choose a port randomly. |
Executor / Driver | Executor / Driver | (random) | Block Manager port | spark.blockManager.port | Raw socket via ServerSocketChannel |
HTTP Security Headers
Apache Spark可以配置为包含HTTP标头,它有助于防止跨站点脚本(XSS),跨框架脚本(XFS),MIME嗅探以及强制HTTP严格传输安全性。
Property Name | Default | Meaning |
---|---|---|
spark.ui.xXssProtection | 1; mode=block | Value for HTTP X-XSS-Protection response header. You can choose appropriate value from below:0 (Disables XSS filtering)1 (Enables XSS filtering. If a cross-site scripting attack is detected, the browser will sanitize the page.)1; mode=block (Enables XSS filtering. The browser will prevent rendering of the page if an attack is detected.) |
spark.ui.xContentTypeOptions.enabled | true | When value is set to “true”, X-Content-Type-Options HTTP response header will be set to “nosniff”. Set “false” to disable. |
spark.ui.strictTransportSecurity | none | Value for HTTP Strict Transport Security (HSTS) Response Header. You can choose appropriate value from below and set expire-time accordingly, when Spark is SSL/TLS enabled. max-age=expire-time max-age=expire-time; includeSubDomains max-age=expire-time; preload |
有关安全性配置参数的详细信息,请参阅配置页面;有关安全性的实现详细信息,请参阅org.apache.spark.SecurityManager。