Bota5ky

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)
posted @ 2023-07-07 14:41  Bota5ky  阅读(48)  评论(0编辑  收藏  举报