2017-01-25 3 views
0

У меня есть ведро на AWS s3, которое обеспечивает шифрование всего объекта KMS. Я запускаю Presto на emr-5.2.1Presto S3 AccessDenied при вставке данных в кодированное шифрование KMS

У меня есть внешняя таблица на s3 (нет данных). Когда я использую

INSERT INTO hive.s3.new_table 
SELECT * FROM src_table 

Я получаю AccessDenied ошибку. Я протестировал несколько разных вариантов и добрался до поддержки, но без везения. Если я удаляю политику из ведра, Presto работает нормально, но файлы, созданные на s3, не зашифрованы.

Presto не имеет проблем с чтением зашифрованных внешних таблиц s3 или их созданием локально на hdfs. Я не могу разрешить незашифрованные данные. Пример

Политика:

{ 
    "Version":"2012-10-17", 
    "Id":"PutObjPolicy", 
    "Statement":[{ 
     "Sid":"DenyUnEncryptedObjectUploads", 
     "Effect":"Deny", 
     "Principal":"*", 
     "Action":"s3:PutObject", 
     "Resource":"arn:aws:s3:::YourBucket/*", 
     "Condition":{ 
      "StringNotEquals":{ 
       "s3:x-amz-server-side-encryption":"aws:kms" 
      } 
     } 
     } 
    ] 
} 

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingKMSEncryption.html

Престо конфигурации /etc/presto/conf/catalog/hive.properties

hive.s3.ssl.enabled=true 
hive.s3.use-instance-credentials=true 
hive.s3.sse.enabled = true 
hive.s3.kms-key-id = long_key_id_here 

...

Error: 
com.facebook.presto.spi.PrestoException: Error committing write to Hive 
    at com.facebook.presto.hive.HiveRecordWriter.commit(HiveRecordWriter.java:132) 
    at com.facebook.presto.hive.HiveWriter.commit(HiveWriter.java:49) 
    at com.facebook.presto.hive.HivePageSink.doFinish(HivePageSink.java:152) 
    at com.facebook.presto.hive.authentication.NoHdfsAuthentication.doAs(NoHdfsAuthentication.java:23) 
    at com.facebook.presto.hive.HdfsEnvironment.doAs(HdfsEnvironment.java:76) 
    at com.facebook.presto.hive.HivePageSink.finish(HivePageSink.java:144) 
    at com.facebook.presto.spi.classloader.ClassLoaderSafeConnectorPageSink.finish(ClassLoaderSafeConnectorPageSink.java:49) 
    at com.facebook.presto.operator.TableWriterOperator.finish(TableWriterOperator.java:156) 
    at com.facebook.presto.operator.Driver.processInternal(Driver.java:394) 
    at com.facebook.presto.operator.Driver.processFor(Driver.java:301) 
    at com.facebook.presto.execution.SqlTaskExecution$DriverSplitRunner.processFor(SqlTaskExecution.java:622) 
    at com.facebook.presto.execution.TaskExecutor$PrioritizedSplitRunner.process(TaskExecutor.java:534) 
    at com.facebook.presto.execution.TaskExecutor$Runner.run(TaskExecutor.java:670) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.io.IOException: com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: xxxxxx), S3 Extended Request ID: xxxxxxxxxxxxxx+xxx= 
    at com.facebook.presto.hive.PrestoS3FileSystem$PrestoS3OutputStream.uploadObject(PrestoS3FileSystem.java:1003) 
    at com.facebook.presto.hive.PrestoS3FileSystem$PrestoS3OutputStream.close(PrestoS3FileSystem.java:967) 
    at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:74) 
    at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:108) 
    at org.apache.hadoop.hive.ql.io.orc.WriterImpl.close(WriterImpl.java:2429) 
    at org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat$OrcRecordWriter.close(OrcOutputFormat.java:106) 
    at com.facebook.presto.hive.HiveRecordWriter.commit(HiveRecordWriter.java:129) 
    ... 15 more 
Caused by: com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: xxxxxxx) 
    at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1387) 
    at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:940) 
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:715) 
    at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:466) 
    at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:427) 
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:376) 
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4039) 
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1583) 
    at com.amazonaws.services.s3.AmazonS3EncryptionClient.access$101(AmazonS3EncryptionClient.java:80) 
    at com.amazonaws.services.s3.AmazonS3EncryptionClient$S3DirectImpl.putObject(AmazonS3EncryptionClient.java:603) 
    at com.amazonaws.services.s3.internal.crypto.S3CryptoModuleBase.putObjectUsingMetadata(S3CryptoModuleBase.java:175) 
    at com.amazonaws.services.s3.internal.crypto.S3CryptoModuleBase.putObjectSecurely(S3CryptoModuleBase.java:161) 
    at com.amazonaws.services.s3.internal.crypto.CryptoModuleDispatcher.putObjectSecurely(CryptoModuleDispatcher.java:108) 
    at com.amazonaws.services.s3.AmazonS3EncryptionClient.putObject(AmazonS3EncryptionClient.java:483) 
    at com.amazonaws.services.s3.transfer.internal.UploadCallable.uploadInOneChunk(UploadCallable.java:131) 
    at com.amazonaws.services.s3.transfer.internal.UploadCallable.call(UploadCallable.java:123) 
    at com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:139) 
    at com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:47) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    ... 3 more 

Могу ли я ssing что-то в конфигурации или Presto не использует KMS при вставке в таблицы?

Согласно амазонке: «Все запросы GET и PUT для объекта, защищенного AWS KMS, потерпят неудачу, если они не сделаны через SSL или с использованием SigV4».

+0

Можете ли вы поделиться командой create table этой таблицы? Я специально ищу место s3. Используете ли вы s3 или s3a или s3n? – Chirag

+0

Получил ответ от поддержки 'Можно использовать SSE-KMS с Presto? К сожалению, нет. В настоящее время Presto поддерживает SSE-S3 (AES256) или ClientSideEncryption (CSE-KMS) EMR поддерживает SSE-KMS для всех приложений, использующих EMRFSFilesystem как Hive, Spark, MR и т. Д. К сожалению, Presto использует PrestoFileSystem. По этой причине любые изменения/улучшения необходимо добавить непосредственно в Presto.' – KonradK

+0

Поддержка AWS предоставила билет для этого [link] (https://github.com/prestodb/presto/issues/7264) – KonradK

ответ

0

Presto теперь поддерживает SSE-KMS через свойство конфигурации соединительного разъема .

Смежные вопросы