aws-doc/课程/第三阶段-安全与身份/第21天-加密与密钥管理.md
2026-05-08 10:24:39 +08:00

152 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第21天加密与密钥管理——保护你的数据
## 今天你将学到什么
今天学习如何保护数据安全KMS密钥管理负责加密数据Secrets Manager 负责管理密码和密钥。学完你会明白为什么"加密一切"是 AWS 的基本原则。
---
## 为什么需要加密
**场景一**:你的数据库存储了用户的手机号和地址。如果有人偷走了数据库的硬盘(物理盗窃或黑客入侵),他们能直接读取所有用户信息。
**加密后**:即使硬盘被偷,看到的也是一堆乱码。没有密钥就无法解读。
**场景二**:你的应用配置文件里写着数据库密码 `password123`。如果代码仓库泄露了,黑客就能直接连上你的数据库。
**用 Secrets Manager 后**:配置文件里只有一个引用 ID真正的密码存在 AWS 的保险箱里,只有有权限的程序才能取出来。
---
## 加密的两种场景
| 场景 | 含义 | 类比 |
|------|------|------|
| 静态加密 | 数据存在磁盘上时是加密的 | 保险箱里的文件是锁着的 |
| 传输加密 | 数据在网络上传输时是加密的 | 快递包裹是密封的 |
AWS 的大多数服务**默认启用**这两种加密。你几乎不需要额外操作。
---
## KMSKey Management Service
KMS 是 AWS 的"密钥保险箱"——帮你创建、存储和管理加密密钥。
### 工作原理(简化版)
你不需要自己写加密算法。只需要告诉 AWS"帮我加密这段数据"AWS 用 KMS 里的密钥帮你加密。解密时也一样。
**类比**KMS 就像银行的保险箱服务。你把贵重物品(数据)交给银行,银行帮你锁好(加密)。需要取的时候,验证你的身份后帮你打开(解密)。
### 哪些 AWS 服务用 KMS 加密
几乎所有存储数据的服务都支持 KMS
- S3存储的文件自动加密
- EBS硬盘上的数据自动加密
- RDS数据库文件自动加密
- DynamoDB表数据自动加密
- SQS消息内容加密
- Lambda环境变量加密
**你要做的**:创建资源时勾选"启用加密"(很多服务现在默认就是启用的)。
### 密钥类型
| 类型 | 谁管理 | 费用 | 适合 |
|------|--------|------|------|
| AWS 托管密钥 | AWS 自动管理 | 免费 | 大多数场景 |
| 客户托管密钥 | 你自己管理 | $1/月/密钥 | 需要精细控制的场景 |
学习阶段用 AWS 托管密钥就够了。
---
## Secrets Manager——密码的保险箱
### 问题:密码放哪里?
你的应用需要连接数据库,需要一个密码。这个密码放哪里?
**错误做法**
- 写在代码里 → 代码泄露密码就泄露
- 写在配置文件里 → 配置文件可能被误提交到 Git
- 写在环境变量里 → 环境变量可能出现在日志中
**正确做法**:放在 Secrets Manager 里。
### 工作流程
```
1. 你把数据库密码存入 Secrets Manager
2. 应用启动时,调用 Secrets Manager API 获取密码
3. 用获取到的密码连接数据库
4. 密码永远不会出现在代码或配置文件中
```
### Secrets Manager 的杀手锏:自动轮换
**传统方式**:数据库密码设置后就不变了。如果泄露了,你可能很久才发现。
**Secrets Manager 自动轮换**
- 每 30 天(你设置的周期)自动更换数据库密码
- 自动在数据库中更新新密码
- 应用下次获取时自动拿到新密码
- 全程无需人工干预,无需重启应用
**就像银行定期帮你换保险箱密码,而且自动通知所有需要知道的人。**
---
## 实际应用场景
### 场景Web 应用连接数据库
**不安全的做法**
```
数据库地址mydb.xxx.rds.amazonaws.com
用户名admin
密码MyP@ssw0rd123 ← 写死在代码里
```
**安全的做法**
```
数据库地址mydb.xxx.rds.amazonaws.com
用户名:从 Secrets Manager 获取
密码:从 Secrets Manager 获取
```
应用运行时动态获取凭证,代码里看不到任何密码。
---
## 加密最佳实践
1. **默认加密一切**:创建任何存储资源时都启用加密,成本几乎为零
2. **不要硬编码密码**所有密码、API 密钥都放 Secrets Manager
3. **启用自动轮换**:密码定期更换,减少泄露风险
4. **最小权限**:只有需要解密的服务才给 KMS 权限
5. **审计**:通过 CloudTrail 监控谁在什么时候使用了密钥
---
## 今天的小测验
1. "静态加密"和"传输加密"分别保护什么场景?
2. 为什么不应该把数据库密码写在代码里?
3. Secrets Manager 的"自动轮换"解决了什么问题?
4. KMS 的作用是什么?用一句话概括。
---
## 延伸阅读
- [KMS 开发者指南](https://docs.aws.amazon.com/kms/latest/developerguide/)
- [Secrets Manager 用户指南](https://docs.aws.amazon.com/secretsmanager/latest/userguide/)
---
## 明天预告
明天学习 AWS 的网络安全服务WAFWeb 应用防火墙)和 ShieldDDoS 防护)——保护你的网站不被黑客攻击。