不支持Spark / Hadoop在AWS S3上支持SSE-KMS加密

时间:2017-09-12 05:40:33

标签: amazon-web-services hadoop apache-spark encryption amazon-s3

我正在尝试使用KMS密钥(SSE-KMS)在服务器端加密的S3上保存rdd,但我收到以下异常:

  

线程中的异常" main"   com.amazonaws.services.s3.model.AmazonS3Exception:状态代码:400,   AWS服务:Amazon S3,AWS请求ID:695E32175EBA568A,AWS错误   代码:InvalidArgument,AWS错误消息:加密方法   不支持指定,S3扩展请求ID:   PI + HFLg0WsAWtkdI2S / xViOcRPMCi7zdHiaO5n1f7tiwpJe2z0lPY1C2Cr53PnnUCj3358Gx3AQ =

以下是我使用SSE-KMS进行加密在S3上编写rdd的测试代码:

val sparkConf = new SparkConf().
  setMaster("local[*]").
  setAppName("aws-encryption")
val sc = new SparkContext(sparkConf)

sc.hadoopConfiguration.set("fs.s3a.access.key", AWS_ACCESS_KEY)
sc.hadoopConfiguration.set("fs.s3a.secret.key", AWS_SECRET_KEY)
sc.hadoopConfiguration.setBoolean("fs.s3a.sse.enabled", true)
sc.hadoopConfiguration.set("fs.s3a.server-side-encryption-algorithm", "SSE-KMS")
sc.hadoopConfiguration.set("fs.s3a.sse.kms.keyId", KMS_ID)

val s3a = new org.apache.hadoop.fs.s3a.S3AFileSystem
val s3aName = s3a.getClass.getName
sc.hadoopConfiguration.set("fs.s3a.impl", s3aName)

val rdd = sc.parallelize(Seq("one", "two", "three", "four"))
println("rdd is: " + rdd.collect())
rdd.saveAsTextFile(s"s3a://$bucket/$objKey")

虽然,我可以使用AES256加密在s3上编写rdd。

对于KMS密钥加密而言,spark / hadoop是否具有不同的值而不是" SSE-KMS"?

任何人都可以建议我在这里错过或做错了。

环境详情如下:

  • Spark:1.6.1
  • Hadoop:2.6.0
  • Aws-Java-Sdk:1.7.4

提前谢谢。

1 个答案:

答案 0 :(得分:1)

不幸的是,似乎现有版本的Hadoop即2.8不支持SSE-KMS :(

以下是观察结果:

  1. 直到Hadoop 2.8.1
  2. 才支持SSE-KMS
  3. SSE-KMS应该在Hadoop 2.9中引入
  4. 在Hadoop 3.0.0alpha版本中,支持SSE-KMS。
  5. 同样的观察w.r.t. AWS SDK for Java

    1. SSE-KMS在aws-java-sdk 1.9.5
    2. 中引入