如何加密数据
- 传输加密
ALB
为您的 Application Load Balancer 创建 HTTPS 侦听器
EC2
Windows系统使用OpenSSH 连接到您的 Linux 实例
如果您运行的是 Windows Server 2019 或更高版本,我们建议使用 OpenSSH,这是一款使用 SSH 协议进行远程登录的开源连接工具。
通过 Amazon PrivateLink 访问 Amazon Web Services
在 Amazon Linux 2023 上配置 SSL/TLS;
物理层加密/Amazon VPC 和 Transit Gateway 跨区域对等连接提供的加密/实例之间的加密/远程访问加密 的情况说明
S3
数据库
API接口
API接口采用 SigV4 签名实现传输数据保密性验证;
其余需要保证传输过程中保密性的数据都可以使用Amazon KMS做数据加密。
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.
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 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
最后更新于