如何加密数据

- 传输加密

ALB

为您的 Application Load Balancer 创建 HTTPS 侦听器

EC2

使用 SSH 连接到 Linux 实例

Windows系统使用OpenSSH 连接到您的 Linux 实例

如果您运行的是 Windows Server 2019 或更高版本,我们建议使用 OpenSSH,这是一款使用 SSH 协议进行远程登录的开源连接工具。

通过 Amazon PrivateLink 访问 Amazon Web Services

EC2传输中加密

在 Amazon Linux 2023 上配置 SSL/TLS

在 Amazon Linux 2 上配置 SSL/TLS

在Amazon Linux AMI 配置 SSL/TLS

物理层加密/Amazon VPC 和 Transit Gateway 跨区域对等连接提供的加密/实例之间的加密/远程访问加密 的情况说明

S3

Amazon S3 如何保护从服务到其他位置的连接。

数据库

使用 SSL/TLS 加密与数据库实例的连接

API接口

API接口采用 SigV4 签名实现传输数据保密性验证;

其余需要保证传输过程中保密性的数据都可以使用Amazon KMS做数据加密。

CloudFront

如何部署ACM证书到CloudFront

注意使用的限制条件,Requirements for using SSL/TLS certificates with CloudFront

Configuring alternate domain names and HTTPS

Amazon ECS

实现客户端到ECS的传输加密:Maintaining Transport Layer Security All the Way to Your Container: Using the Network Load Balancer with Amazon ECS

- 静态加密

S3静态加密

S3存储桶使用加密保护数据

https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html

默认S3里的文件会通过SSE-S3进行加密,也可以使用AWS Key Management Service (AWS KMS) keys (SSE-KMS)替代SSE-S3进行加密。

以下是三种可选的加密方式:

Amazon S3-Managed Keys (SSE-S3)

默认的情况下,亚马逊S3对新上传的对象自动启用使用亚马逊S3管理的密钥(SSE-S3)的服务器端加密。不需要额外的权限,跟没有做加密时使用是一样的。

AWS KMS-Managed Keys (SSE-KMS)

你可以使用AWS Key Management Service (AWS KMS) keys (SSE-KMS)替代SSE-S3进行加密。此时获取S3的对象必须要有KMS的解密权限,否则会拒绝访问。

如果你没有指定的customer managed key客户管理密钥,Amazon S3会自动创建一个,之后会默认使用这么密钥完成加密。你也可以在SSE-KMS中使用创建一个客户管理的钥匙。这样,你能有更多的灵活性和控制。例如,你可以创建、轮换和禁用客户管理钥匙。你也可以定义访问控制和审计这个客户管理密钥。

Amazon S3 Bucket Keys

你可以配置S3 Bucket Keys for SSE-KMS来加密你的S3存储桶,使用桶级别的密钥可以节省成本最高达99%。参见 Reducing the cost of SSE-KMS with Amazon S3 Bucket Keys.

注意

  • Amazon S3 只支持对称加密KMS密钥。

  • 当你使用 SSE-KMS 加密S3 存储桶时,这个AWS KMS keys 必须和桶在同一个区域。

  • 要上传用AWS KMS密钥加密的对象到Amazon S3,你需要密钥的kms:GenerateDataKey的权限。要下载一个用AWS KMS密钥加密的对象,你需要kms:Decrypt权限。有关多部分上传所需的AWS KMS权限的信息,请参阅Multipart upload API and permissions

Server-side encryption with customer-provided keys (SSE-C)

在这种加密方案中,你在上传对象时提供加密密钥,AWS承诺立即忘记它。因此,当你检索对象时,你需要发送相同的密钥。

这改变了上传对象的命令。除了桶和密钥外,你还需要定义算法、密钥和密钥的MD5。假设你使用gL6RsUG2fPElqDyMghs1yCrRJMJFLgR9MN密钥进行加密的请求实例:

aws s3api put-object \
	--bucket <bucket> \
	--key <key> \
	--body text.txt \
	--sse-customer-algorithm "AES256" \
	--sse-customer-key gL6RsUG2fPElqDyMghs1yCrRJMJFLgR9MN/Z8vjALUI= \
	--sse-customer-key-md5 XaroTmmABjK75669+kj/xw==

配置完成以后,你再获取对象的时候需要加密密钥。如果你不这样做,S3服务会报告一个错误:

An error occurred (InvalidRequest) when calling the GetObject operation: The object was stored using a form of Server Side Encryption. The correct parameters must be provided to retrieve the object.

正确的获取方式如下:

aws s3api get-object \
	--bucket <bucket> \
	--key <key> \
	--sse-customer-algorithm "AES256" \
	--sse-customer-key gL6RsUG2fPElqDyMghs1yCrRJMJFLgR9MN/Z8vjALUI= \
	--sse-customer-key-md5 XaroTmmABjK75669+kj/xw== \
	/dev/stderr > /dev/null

contents

Client-side encryption with an AWS KMS-managed CMK

确保上传的文件都经过了加密

如果制定了规范,用于存储敏感数据的Amazon S3桶中的所有对象进行服务器端加密,可以使用桶策略。例如,如果请求没有x-amz-server-side-encryption头,也就是要求用SSE-KMS进行服务器端加密。下面的桶策略Bucket policy将拒绝每个人的上传对象(s3:PutObject)的权限,

当你上传一个对象时,你可以通过使用x-amz-server-side-encryption-aws-kms-key-id头来指定KMS密钥。这样如果上传文件的时候没有使用SSE-KMS的方式加密,Amazon S3将拒绝该请求。其中 "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*",替换成你需要管理的S3存储桶。

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

你还可以通过使用加密密钥的Amazon Resource Name (ARN) 比如 arn:aws:kms:region:acct-id:key/key-id 来指定用于加密的密钥必须是哪一个。其中 "Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET1/*",替换成你需要管理的S3存储桶。加密密钥的ARN也注意需要进行替换。

// with specified key id
{
    "Sid": "EnforceKMS",
    "Effect": "Deny",
    "Principal": "*",
    "Action": "s3:PutObject",
    "Resource": "arn:aws:s3:::BUCKET_NAME/*",
    "Condition": {
        "StringNotLikeIfExists": {
            "s3:x-amz-server-side-encryption-aws-kms-key-id": "KEY_ARN"
        }
    }
}

更多的存储桶管理策略样例参见:https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html?icmpid=docs_amazons3_console

https://repost.aws/knowledge-center/s3-bucket-store-kms-encrypted-objects

Amazon EBS加密

Amazon EBS 加密

Amazon RDS加密

加密 Amazon RDS 资源

[blog]Securing data in Amazon RDS using AWS KMS encryption

How can I encrypt an unencrypted Amazon RDS DB instance for MySQL or MariaDB with minimal downtime?

其他资源加密

[workshop] Encryption at Rest Workshop

This workshop aims to prepare you for working with KMS and CloudHSM with hands-on capabilities. Go through each section within your own AWS accounts, and use the newly deployed EC2 instance as a disposable environment.

- 加密密钥选择

AWS KMS keys

AWS KMS keys (KMS keys)是AWS托管的加密密钥,你可以用加密密钥完成对数据的加密和解密操作。

对称KMS密钥的密钥材料和非对称KMS密钥的私钥永远不会离开AWS KMS,因此你不能提取、导出、查看或管理KMS keys的私钥。如果需要完全自定义管理密钥,则可以考虑CloudHSM这个产品。你可以将你自己的密钥材料导入KMS key,或使用自定义密钥存储来创建KMS密钥,这些密钥使用你的AWS CloudHSM集群中的密钥材料,或你在AWS之外拥有和管理的外部密钥管理器中的密钥材料。

AWS KMS还支持多区域密钥 multi-Region keys,让你在一个AWS区域加密数据,在另一个AWS区域解密。

关于如何使用AWS KMS keys可以参考此文档:AWS Key Management Service API Reference.

参考资料

How can I secure the files in my Amazon S3 bucket?

How to Use Bucket Policies and Apply Defense-in-Depth to Help Secure Your Amazon S3 Data

Architecting for database encryption on AWS

最后更新于