DBS学习笔记(二):RDS Security
概述
支持的引擎:PostgreSQL,MySQL,MariaDB,Oracle,Microsoft SQL Server,Aurora
在一个VPC内启动:常使用私有子网,用 security groups 控制权限(如使用 Lambda 时)
使用 EBS 储存:gp2 或 io1,可自动扩展容量
备份:自动根据时间点恢复,备份过期
监控:使用 CloudWatch
RDS Events:SNS 事件提醒
1 credit = CPU 核心利用率100%一分钟
参数组 Parameter groups
动态参数(修改立即生效,可能会导致停机)和静态参数(需要手动重启,状态从 in-sync -> pending-reboot -> in-sync)
选项组 Option groups
数据库引擎功能选项(默认为空),修改则需要创建新的选项组
Security - Network
数据库创建(通常是在子网中 )后 VPC 就无法修改了
Security - IAM 身份验证
- 您不需要密码,只需通过 IAM 和 RDS API 调用获得身份验证令牌
- 身份验证令牌的生存期为15分钟
- 优点:
- 进出流量必须使用SSL
- 取代数据库,IAM 集中化管理用户
如何使用 IAM DB 身份认证?
- 在数据库群集上启用 IAM 数据库身份验证
- 创建数据库用户(不带密码)
- 附加 IAM 策略以将 DB 用户映射到 IAM 角色
- 将 IAM 角色附加到 IAM 用户(或 EC2 实例)
- 现在您可以通过 SSL 使用 IAM 令牌连接到 DB
MySQL 实现方式:
-- 创建用户
CREATE USER {db_username} IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';
-- 授予SSL权限
GRANT USAGE ON *.* TO '{db_username}'@'REQUIRE SSL;
-- 下载SSL密钥
wget "https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem"
-- 使用CLI生成token
TOKEN="$(aws rds generate-db-auth-token
--hostname {db_or_cluster_endpoint}
--port 3306 --username {db_username})"
-- 连接数据库
mysql --host={db_or_cluster_endpoint} --port=3306
--ssl-ca=/home/ec2-user/rds-combined-ca-bundle.pem
--enable-cleartext-plugin
--user={db_username} --password=$TOKEN
PostgreSQL 实现方式:
不需要修改配置文件pg_hba.conf
CREATE USER {db_username};
GRANT rds_iam to {db_username};
wget "https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem"
export PGPASSWORD="$(aws rds generate-db-auth-token
--hostname={db_endpoint} --port=5432 --username={db_username}
--region us-west-2)"
psql -h {db_endpoint} -p 5432 "dbname={db_name} user={db_username} password=$PGPASSWORD sslrootcert=/home/ec2-user/rds-combined-ca-bundle.pem sslmode=verify-ca"
轮换 RDS DB 证书
- 使用 AWS Security Manager
- 集中、安全地存储凭证,支持审计
- 支持 secrets 的自动轮换
- Secrets Manager 提供了一个 Lambda 轮换函数,并自动用 ARN(Amazon Resource Name)填充 secret
- 与 RDS 中的 MySQL、PostgreSQL 和 Aurora 集成
RDS SQL Server 的 Windows 身份认证
- 创建 AWS 托管的 Microsoft AD 目录,并在您的公司 AD 和 AWS 托管的AD之间建立信任关系(称为 forest trust 域信任)
- 如果您有超过5000个用户,并且需要与您的前置目录建立信任关系,则 AWS 托管 AD 是最佳选择
- 或者,您也可以使用 AD 连接器(用于现有的本地目录)或简单 AD(如果您的用户少于5000)
- 在 AD 中设置用户和组
- 在 RDS 实例中启用 SQL Server Windows 身份验证以将目录映射到 DB 实例(自动创建适当的lAM角色)
- 使用主用户凭据登录到数据库,并为 AD 用户创建 SQL Server Windows 登录
强制使用 SSL
- SQL Server 或 PostgreSQL:在参数组中设置参数
rds.force ssl=1
(静态参数,需要手动重新启动) - MySQL 或 MariaDB:
ALTER USER 'mysqluser'@'%' REQUIRE SSL
- Oracle:将 SSL 选项添加到 DB 实例选项组
SSL连接选项
# PostgreSQL
sslrootcert=rds-cert.pem sslmode=[verify-ca | verify-full]
# MySQL
--ssl-ca=rds-cert.pem --ssl-mode=VERIFY_IDENTITY (MySQL 5.7+)
# MariaDB
--ss1-ca=rds-cert.pem --ssl-mode=REQUIRED (MaraDB 10.2+)
# MySOL/MariaDB (older versions)
--ss1-ca=rds-cert.pem --ssl-verify-server-cert
RDS 数据加密
- RDS 支持 AES-256 加密算法
- 通过 KMS 管理的密钥
- 可以同时加密主副本和读取副本必须在启动时定义加密
- RDS 还支持 TDE(透明数据加密)
- For SQL Server(仅限 Enterprise Edition)和 Oracle DB 实例
- 通过设置选项组启用
- 对 Oracle 启用 TDE 选项
- 对 SQL Server 启用 TRANSPARENT_DATA_ENCRYPTION 选项
- 如果同时使用 TDE 和 静态加密,可能会略微影响数据库性能
复制和分享加密的 snapshots
- 使用默认RDSencryption密钥加密的快照不能直接共享
- 使用自定义加密密钥复制快照,然后共享[密钥+快照]
- 无法共享具有某些自定义选项组的快照(例如TDE)