【问题标题】:SSL certificates for 3rd party services over sparkSpark 上的 3rd 方服务的 SSL 证书
【发布时间】:2019-09-17 22:12:11
【问题描述】:

我试图访问需要 SSL 的服务(比如说 mongodb),但连接被执行程序拒绝,因为我没有设置正确的 SSL 配置。

我知道spark在提交job的时候支持如下配置:

spark.executor.extraJavaOptions
spark.driver.extraJavaOptions

然后我们可以设置jvm ssl路径(和密码):

javax.net.ssl.trustStore
javax.net.ssl.keyStore

但是,jvm 要求这些路径是物理路径,这在使用亚马逊的 Spark EMR 或任何其他不提供磁盘访问权限的 Spark 集群时会导致问题,其中可以预先部署所需的文件。

所以基本上我的问题是:

  1. spark 作业有没有办法将信任库/密钥库文件推送给所有执行者? --files 可以将文件推送到所有执行程序,但是我必须在每个执行程序中获取绝对路径才能设置正确的配置。
  2. 是否可以在所有执行程序上运行作业? (在该工作中,我们可以将信任库/密钥库从中立位置推送到执行程序上下文中的 tmp 文件)
  3. jvm 是否可以配置为处理 URI,即 javax.net.ssl.trustStore=s3a://path/to/keystore.key ?

【问题讨论】:

    标签: java scala apache-spark ssl emr


    【解决方案1】:

    更新: 对于 AWS EMR 解决方案,您可以使用引导操作启动从 s3 复制到服务器上预定义路径的脚本。将在 EMR 集群下创建的每台服务器都将单独运行此脚本。

    不幸的是,YARN 的工作方式是 spark 作业从 YARN 请求资源,因此运行一个从 s3 复制文件并将其下载到共享路径的 spark 作业 (注意Files.createTempFile(..) 在这里不起作用,因为 tmp 文件夹被覆盖到执行程序上下文文件夹中) 不能保证所有节点都有这条路径。此外,一旦作业完成,执行器不再具有指定 SSL 配置的 JVM 参数,因此一旦创建新的执行器,它就不再具有与前一个相同的 JVM。

    此问题的另一个解决方案是为每个正在运行的 spark 作业设置此 SSL 参数,但此代码必须在 spark 库中,因为它需要在与 RDD 源建立任何连接之前执行。例如 mongo 连接器:一旦应用程序进入

    val rdd = MongoSpark.load(..) 
    

    连接到 mongo 已经太晚了。

    【讨论】:

    • 是的,使用 EMR 引导操作将证书文件从 s3 存储桶检索到实例。编辑 spark executor/driver cmd arg 以指向 cert filea 并添加 jvm 和 spark 其他 jvm 属性以指向 certfile。
    • 嗨,卡尔,感谢您的回复。这是我正在使用的 spark 提交命令:--conf 'spark.driver.extraJavaOptions=-Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.trustStore=/tmp/trustfile1.jks -Djavax.net .ssl.trustStorePassword=password' --conf 'spark.executor.extraJavaOptions=-Djavax.net.ssl.trustStoreType=jks -Djavax.net.ssl.trustStore=/tmp/trustfile1.jks -Djavax.net.ssl.trustStorePassword =password' --class class app.jar
    • 是的,我也在使用引导操作将文件下载到机器中。我仍然无法让它工作。这是我得到的错误: 引起:sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在 sun.security.validator 找到请求目标的有效认证路径.PKIXValidator.doBuild(PKIXValidator.java:397) 在 sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:302) 在 sun.security.validator.Validator.validate(Validator.java:262)
    • 这个问题解决了吗?
    【解决方案2】:

    jvm 是否可以配置为处理 URI,即 javax.net.ssl.trustStore=s3a://path/to/keystore.key ?

    不,发生在完全不同的 IO 级别。

    通常推出这样的事情是通过集群管理工具完成的。您也可以使用 YARN 的作业提交 API 来复制文件,但我不知道 spark-submit 设置得如何让您添加任意文件然后设置 JVM 属性关闭它们。

    当然,如果它不这样做,而您确实希望它这样做,那都是 OSS:您可以添加它,甚至(通过测试)将其贡献回来

    【讨论】:

      【解决方案3】:

      这与建立任何其他 SSL 连接相同。将您的证书导入密钥库并使用以下代码引用该密钥库

      System.setProperty("javax.net.ssl.trustStore", "keystoreFilefullpath")
      System.setProperty("javax.net.ssl.trustStorePassword", "password")
      

      一旦设置了这些参数,Kafka SSL 就应该可以工作了。如果您从 Spark 发布,则必须使用 --files 选项将密钥库文件上传到驱动程序/执行程序

      --files 选项也适用于在集群模式下运行的 spark 应用程序

      【讨论】:

        猜你喜欢
        • 2020-08-04
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        • 2014-01-25
        • 1970-01-01
        • 2013-11-01
        • 2021-04-05
        • 2017-05-19
        相关资源
        最近更新 更多