当我们把数据搬上云端,为了保护敏感数据一定要对数据存储进行加密。而对于 S3 上的数据加密最简单莫过于启用服务端数据加密,可以是 AES-256 或 AWS-KMS。进行了服务端加密码的文件有什么不同呢?首先从 AWS S3 文件列表视图中看到的文件大小与原始文件大小是一样的,其实数据在 AWS 机房是加密存储了的,比如说直接在 AWS 服务器上拷出那些 S3 文件是不能理解的。

本文涉及的内容包括:

服务器端加密后的 S3 文件有何不同

不启用 Bucket 的默认加密如何进行服务端数据加密(含 AWS CLI 和  Java 代码操作)

启用及应用 Bucket 的默认加密

上传与下载文件的 IAM role 需要的权限

服务器端加密后的 S3 文件有何不同

首先看现象,后面才能确认我们的操作是否对数据真的进行了服务端加密。查看使用 AWS-KMS key 加密后的 S3 文件的 Overview, 看到下面两个属性

Server-side encryption

AWS-KMS

KMS key ID

arn:aws:kms:us-east-1:123456789012:key/e4ce859b-786b-4b8e-8b73-4968adb6e4ed

没加密的话, Server-side encryption 是 None, 并且没有 KMS key ID 属性。

点击 Make public 把该文件设置为 public,  然后直接打开下方的链接(如 https://s3.amazonaws.com/yanbin-test-encryption-bucket/123.txt), 下载不了了

必须提供更丰富的请求头信息才能下载该文件了。

注意到,文件大小仍然是原始文件大小,前面提到过,这只是一个视图显示,实际在 AWS 数据中心存储就不同的。文件的 Metadata 也没有什么不同。

总之以后可以从文件的 Overview 中 Server-side encrytpion 和 KMS key ID 来确认 S3 文件是否被服务端加密了。

不启用 Bucket 的默认加密如何进行服务端数据加密

如果某个 Bucket 中允许混杂存储加密与非加密的数据,或者单个 Bucket 的数据混合选用不同的 KMS key 来加密数据文件,这时候我们不一定会启用 Bucket 的默认加密选项。这种情况下要求我们在上传文件时指定是否启用服务端加密以及所使用的 KMS key。我们这儿只讨论用 AWS-KMS 的方式来加密文件,所以我们应该事先在 AWS 的 IAM/Encryption keys 中创建好我们下面要用到的 KMS key。 下面第一个是 AWS 默认的 S3 KMS key 和两个自定义的 Key, - 前后分别为 Key 的别名和 ARN

aws/s3  -   arn:aws:kms:us-east-1:123456789012:key/d133e4fd-3dd1-4fee-a090-c0b5c1cc7c6a, 这是 AWS 默认的 S3 KMS key

demo/test1  - arn:aws:kms:us-east-1:123456789012:key/1a3f0285-f1ab-4e38-915d-c7a9fcd16d30

demo/test2  - arn:aws:kms:us-east-1:123456789012:key/fa6b91b4-d18d-4961-84e4-6150ff5bcc31

下面的各种上传操作及产生的效果

$ aws s3 cp test.txt s3://yanbin-test-encryption-bucket --sse aws:kms

这个命令将会用默认的 KMS key aws/s3 来加密文件。另外,如果不指定 aws:kms, 写成下面的方式

$ aws s3 cp test.txt s3://yanbin-test-encryption-bucket --sse

也会启用服务端加密文件,只不过加密方式为 Server-side encryption: AES-256

如果要使用指定的 KMS key 来加密文件,必须写成下面的两种方式

$ aws s3 cp test test.txt s3://yanbin-test-encryption-bucket --sse aws:kms --sse-kms-key-id arn:aws:kms:us-east-1:123456789012:key/1a3f0285-f1ab-4e38-915d-c7a9fcd16d30

$ aws s3 cp test test.txt s3://yanbin-test-encryption-bucket --sse aws:kms --sse-kms-key-id 1a3f0285-f1ab-4e38-915d-c7a9fcd16d30  # 也可以只指定 ID

上面的用 aws cli 的命令方式来指定服务端数据加密,下面来看看应用 Java SDK 如何操作

AmazonS3 amazonS3 = AmazonS3ClientBuilder.defaultClient();

ObjectMetadata objectMetadata = new ObjectMetadata();

objectMetadata.setSSEAlgorithm("aws:kms");

amazonS3.putObject("yanbin-test-encryption-bucket", "test.txt",

new ByteArrayInputStream("hello".getBytes()), objectMetadata);

1

2

3

4

5

AmazonS3amazonS3=AmazonS3ClientBuilder.defaultClient();

ObjectMetadataobjectMetadata=newObjectMetadata();

objectMetadata.setSSEAlgorithm("aws:kms");

amazonS3.putObject("yanbin-test-encryption-bucket","test.txt",

newByteArrayInputStream("hello".getBytes()),objectMetadata);

使用默认的 KMS key aws/s3 来加密文件。

如果要选用其他的 KMS key 来加密文件,可用下面两种写法

AmazonS3 amazonS3 = AmazonS3ClientBuilder.defaultClient();

ObjectMetadata objectMetadata = new ObjectMetadata();

objectMetadata.setSSEAlgorithm("aws:kms");

objectMetadata.setHeader("x-amx-server-side-encryption-aws-kms-key-id",

"arn:aws:kms:us-east-1:123456789012:key/fa6b91b4-d18d-4961-84e4-6150ff5bcc31")

amazonS3.putObject("yanbin-test-encryption-bucket", "test.txt",

new ByteArrayInputStream("hello".getBytes()), objectMetadata);

1

2

3

4

5

6

7

AmazonS3amazonS3=AmazonS3ClientBuilder.defaultClient();

ObjectMetadataobjectMetadata=newObjectMetadata();

objectMetadata.setSSEAlgorithm("aws:kms");

objectMetadata.setHeader("x-amx-server-side-encryption-aws-kms-key-id",

"arn:aws:kms:us-east-1:123456789012:key/fa6b91b4-d18d-4961-84e4-6150ff5bcc31")

amazonS3.putObject("yanbin-test-encryption-bucket","test.txt",

newByteArrayInputStream("hello".getBytes()),objectMetadata);

AmazonS3 amazonS3 = AmazonS3ClientBuilder.defaultClient();

ObjectMetadata objectMetadata = new ObjectMetadata();

PubObjectRequest putObjectRequest = new PutObjectRequest("yanbin-test-encrytpion-bucket",

"test.txt", new ByteArrayInputStream("hello".getBytes()), objectMetadata);

putObjectMetadata.setSSEAwsKeyManagementParams(new SSEAwsKeyManagementParams(

"arn:aws:kms:us-east-1:123456789012:key/fa6b91b4-d18d-4961-84e4-6150ff5bcc31"));

amazonS3.putObject(putObjectRequest);

1

2

3

4

5

6

7

AmazonS3amazonS3=AmazonS3ClientBuilder.defaultClient();

ObjectMetadataobjectMetadata=newObjectMetadata();

PubObjectRequestputObjectRequest=newPutObjectRequest("yanbin-test-encrytpion-bucket",

"test.txt",newByteArrayInputStream("hello".getBytes()),objectMetadata);

putObjectMetadata.setSSEAwsKeyManagementParams(newSSEAwsKeyManagementParams(

"arn:aws:kms:us-east-1:123456789012:key/fa6b91b4-d18d-4961-84e4-6150ff5bcc31"));

amazonS3.putObject(putObjectRequest);

aws cli 和 Java 代码指定 KMS key 时都可以用 ID 或完整的 key ARN。用 Java 代码上传本地文件加密方式存储到 S3 也是类似的,Java 代码读取服务端加密的 S3 文件与读未加密的文件是一样的。

对于未启用默认加密的 Bucket, 我们可以设定 Bucket 的 Deny Policy 来限制只有指定了服务端加密,并且采用了特定的 KMS key 的 pubObject 才能接受,否则拒绝该操作。AWS Policy Generator 能帮助我们生成各种 AWS 的 Policy

启用及应用 Bucket 的默认加密

在创建 Bucket 的过程中或 Bucket 创建之后的 Properties 中,点击 Default encryption, 选择 AWS-KMS 并事先创建好的 KMS key。启用了 Default encryption 后看起来就是这样子的

一个 S3 Bucket 启用了 Default encryption 意味着什么呢?

Bucket 中原有的数据是不会被加密的,但新上传的文件是会被加密的

对原数据文件的加密存储必须进行一个拷贝操作

有了 Bucket 的默认加密设置,aws cli 和 Java 代码只需要用最简单的操作来上传文件,文件将会采用默认加密中指定的 KMS key

$ aws s3 cp test.txt s3://yanbin-test-encryption-bucket

或 Java 代码

AmazonS3 amazonS3 = AmazonS3ClientBuilder.defaultClient();

ObjectMetadata objectMetadata = new ObjectMetadata();

amazonS3.putObject("yanbin-test-encryption-bucket", "test.txt",

new ByteArrayInputStream("hello".getBytes()), objectMetadata);

1

2

3

4

AmazonS3amazonS3=AmazonS3ClientBuilder.defaultClient();

ObjectMetadataobjectMetadata=newObjectMetadata();

amazonS3.putObject("yanbin-test-encryption-bucket","test.txt",

newByteArrayInputStream("hello".getBytes()),objectMetadata);

如果要使用非默认的 KMS key 来上传文件则可运用上一节介绍的方式。

而且启用了默认加密,通过网页来上传,Encryption 即使为 None, 文件也会应用默认的 KMS key 进行加密,也能在该界面中选择别的 KMS key 来加密。

我们同时也发现一个问题,Bucket 在启用的默认加密后,好像没有办法让新上传的文件不进行服务端加密了。用默认的 KMS key, 或指定别的 key, 就是不能不加密。

上传与下载文件的 IAM role 需要的权限

我们执行 aws cli 或从本地执行 Java 代码所使用的 profile 基本感受不到 AWS 操作权限的约束。而假如是一个 Lambda 要访问 S3 中的加密数据,执行该 Lambda 的 role 除了对 Bucket 有相应的对写权限外,还需要对所用的 KMS key 有相应的权限。否则对 S3 的操作就会失败,这也从另一个侧面验证了数据是被加密了,因为操作触及了对 KMS key 的相应操作。

经试验测定,putObject 与 getObject 分别需要待访问 KMS key 的以下两个权限

putObject  --  kms:GenerateDataKey

getObject  --  kms:Decrypt

比如说该 Lambda 需要对某个启用了默认加密(KMS) 的 Bucket 的读写权限,那么执行 role 的 Attach policy 就是

{

"Effect": "Allow",

"Action": [

"kms:GenerateDataKey*",

"kms:Decrypt"

],

"Resource": [

"arn:aws:kms:us-east-1:123456789012:key/1a3f0285-f1ab-4e38-915d-c7a9fcd16d30"

]

}

1

2

3

4

5

6

7

8

9

10

{

"Effect":"Allow",

"Action":[

"kms:GenerateDataKey*",

"kms:Decrypt"

],

"Resource":[

"arn:aws:kms:us-east-1:123456789012:key/1a3f0285-f1ab-4e38-915d-c7a9fcd16d30"

]

}

如果只往 Bucket 中写数据就只给 kms:GenerateDataKey, 只读就只需 kms:Decrypt 权限。

FCD网站服务器加密,AWS S3 应用 KMS Key 进行服务端数据加密相关推荐

  1. 我的世界Minecraft基岩版开服服务器教程(Windows)开服器开服包下载开服网站服务器要多少钱开服核心开服端下载

    我的世界Minecraft基岩版开服服务器教程(Windows)开服器开服包下载开服网站服务器要多少钱开服核心开服端 前言:大家好我是艾西,最近很多小伙伴问我Minecraft我的世界怎么开服以及服务 ...

  2. windows服务器搭建原神私服教程(附客户端+服务端+环境配置)

    今天给大家带来的是windows服务器搭建原神私服的教程,服务端搭建于私人windows服务器,客户端支持情况:PC.iOS支持国服 /国际服均可,Android仅支持国际服.本篇文章附有客户端和服务 ...

  3. aws s3 静态网站_使用AWS S3存储桶启动静态网站

    aws s3 静态网站 This article explores the AWS S3 bucket to configure a static website. 本文探讨了用于配置静态网站的AWS ...

  4. 网站服务器 加密狗,致远软件自助服务网站

    问题解析: 想要正常通过M1访问,需要检查以下几点是否已按标准设置: ① M1服务正常启动: ② M1访问端口已经确认开通: ③ 配置文件中的参数是否正确: ④ 下载的M1客户端是否与服务器安装的版本 ...

  5. 无盘服务器 安装客户机程序,顺网云服务端和客户端安装

    在维护云网站或 APP 端,进行平台账号注册: 访问维护云平台注册页面 访问维护云 App 下载界面 新用户注册完成,系统即自动为您定制专属安装包. 服务端安装 双击服务端 exe 安装程序,输入网吧 ...

  6. javascript 实现blob加密视频(html video),服务端为php

    现在大部分的网站视频链接都是  blob:http://...... 例如: 出于好奇,研究了一番 其实这种是 视频mp4格式转码m3u8格式  再分为多个小切片(多个小视频)结合 video.js ...

  7. 助讯通服务器没有运行什么原因,助讯通服务端

    助讯通服务端wineim server是助讯通的服务器软件,作为一款企业通讯软件,这款服务端功能特色丰富,保密性高:软件目前使用广泛,是企业信息交流的好帮手,有需要的赶快下载吧! 基本简介 助讯通(W ...

  8. Linux C++服务器项目——网络编程1 (socket通信,服务端,客户端)

    牛客 C++高并发服务器开发 参考笔记 1.MAC地址 2 IP地址 2.1 简介 2.2 IP地址编址方式 2.3 子网掩码 3 端口 3.1 简介 3.2 端口类型 4 网络模型 4.1 OSI七 ...

  9. 服务器响应回调函数,解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)...

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

最新文章

  1. 《Windows Server 2012 Hyper-V虚拟化管理实践》一3.3 远程管理Hyper-V主机
  2. sparksql(1)——Dataframe
  3. javascript小游戏_个人网站集成js小游戏《圈小猫》教程及源码
  4. 数据结构-线性表之用队列实现栈用栈实现队列
  5. python函数和方法概念_python基础学习——函数和方法的区别与联系
  6. es6遍历树结构并判断_实现树形结构数据 es6
  7. 用python画熊猫代码_python-使用Pandas绘制包含列表的列
  8. Java-Spring Boot集成银联在线网关支付及回调处理(银联扫码等方式支付)
  9. 美国计算机科学奥林匹克竞赛试题,2019USAAAO美国天文奥林匹克竞赛预赛试题(答案)...
  10. 微信小程序工具的使用及其参数含义。
  11. IDEA 读取maven本地仓库jar包,而不是读取module项目代码的解决方案
  12. Linux几种检测rootkit隐藏进程的方法
  13. unity3d shader ar任意门(传送门)
  14. 蓝桥杯官网题2(含VIP试题且带详细解析!小白看过来!!
  15. 计算机应用新教程,计算机应用基础教程(新)-李久仲 第1单元 计算机基础知识
  16. ABA问题的解决方法
  17. OEC管理模式的具体形式
  18. Cisco Firepower 4100 Series FTD Software 7.2.0 ASA Software 9.18.1
  19. 管理员管理留言php,自定义WordPress管理员留言头像
  20. | 移动端性能专项测试之CPU资源

热门文章

  1. linux内核启动第一个进程,ARM64的启动过程之(一):内核第一个脚印
  2. Introduction to Flash NetConnection/NetStream
  3. Review cpp day08
  4. Kerberos : Unable to obtain password from user
  5. zookeeper在Hbase中的作用
  6. Linux中查看Tomcat日志输出
  7. (十六)模板与泛型编程
  8. [HEOI2014]人人尽说江南好 博弈论
  9. 《MySQL 入门教程》第 32 篇 存储过程(二)
  10. 鸿蒙碎片八零,天道天骄_第2688章 一方鸿蒙的碎片!上(1/2)_邂逅小说网