1. 总体安全合规准备与前置条件
- 硬件/云账密管理:确认云账号具有管理员权限或可申请KMS/网络/VPC权限。
- 选择目标DB类型:确定使用MySQL/MariaDB或PostgreSQL或托管服务(如RDS类型)。不同引擎步骤有差异。
- 备份现有数据与配置快照:执行完整备份并验证恢复流程,确保能回滚配置改动。
2. 磁盘(静态数据)加密 — 推荐采用云KMS或系统级LUKS
- 云托管磁盘(首选):在创建磁盘/数据库实例时启用“加密/Encryption at rest”,选择云KMS密钥或客户管理密钥(CMK)。
- 自建VM上使用LUKS:示例命令:1) 创建分区后:cryptsetup luksFormat /dev/sdb1;2) 打开:cryptsetup open /dev/sdb1 dbcrypt;3) 格式化并挂载:mkfs.ext4 /dev/mapper/dbcrypt; mount /dev/mapper/dbcrypt /var/lib/mysql。
- 验证:重启后确保自动解密脚本(使用initramfs或systemd挂载)并妥善保管解密密钥。
3. 传输加密(TLS)——生成证书并启用数据库TLS
- 生成自签CA与服务端证书(示例OpenSSL):openssl genrsa -out ca.key 4096;openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt;然后为server生成:openssl genrsa -out server.key 2048;openssl req -new -key server.key -out server.csr;openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365。
- MySQL启用TLS(my.cnf):在[mysqld]下配置ssl-ca=/path/ca.crt ssl-cert=/path/server.crt ssl-key=/path/server.key require_secure_transport=ON;重启mysqld。
- PostgreSQL启用(postgresql.conf):ssl = on;将server.key/server.crt放在$PGDATA并chmod 600 server.key;在pg_hba.conf使用hostssl并选择认证方法如 scram-sha-256 或 cert。
4. 强化TLS策略与客户端配置
- 强制最小TLS版本并禁用弱加密:MySQL可通过TLS配置和OpenSSL强制,Postgres通过ssl_ciphers与ssl_min_protocol_version(若支持)。
- 客户端证书与双向TLS(如需):生成客户端证书并在pg_hba.conf或MySQL用户设置中要求客户端证书。MySQL示例SQL:CREATE USER 'app'@'%' IDENTIFIED BY '强密码' REQUIRE X509;。
- 验证连接:使用mysql --ssl-mode=VERIFY_IDENTITY --ssl-ca=ca.crt --ssl-cert=client.crt --ssl-key=client.key 来测试。
5. 数据库表级/列级加密(应用或数据库内实现)
- MySQL透明数据加密(InnoDB):启用keyring插件(例如keyring_file),配置innodb_encryption_threads=4,innodb_encrypt_tables=ON,innodb_encrypt_log=ON,重建表空间以应用。
- PostgreSQL列级加密:安装并使用pgcrypto,示例:UPDATE table SET secret = pgp_sym_encrypt(data::text, '密钥'); 查询:SELECT pgp_sym_decrypt(secret, '密钥');。注意密钥管理需与KMS结合,不在代码中硬编码。
- 应用层加密:推荐对敏感字段在应用层加密(例如使用libsodium或AES-GCM),并把密钥存储在专用密钥管理系统中。
6. 密钥管理(KMS / Vault)实操建议
- 云KMS通用流程:1) 在云控制台/CLI创建对称密钥(CMK);2) 为数据库实例、备份与应用分配密钥访问策略(仅允许必要的服务主体);3) 在数据库或存储层启用KMS加密并指向该CMK。
- 使用HashiCorp Vault:1) 部署Vault并启用KV与Transit引擎;2) 在Transit创建加密密钥:vault write -f transit/keys/db-key;3) 应用通过Vault API请求加解密,不保存明文密钥。
- 密钥轮换策略:设定定期轮换(30-90天)并做兼容策略,测试密钥轮换后旧数据可解密。
7. 访问控制与最小权限原则
- 数据库用户与角色设计:为不同应用/服务创建独立用户,只授予最少权限(SELECT/INSERT/UPDATE/EXECUTE)。示例MySQL:CREATE USER 'app'@'10.0.0.5' IDENTIFIED BY '强密码'; GRANT SELECT, INSERT ON db.* TO 'app'@'10.0.0.5';。
- 使用强认证方式:启用scram-sha-256(Postgres/MySQL支持)或LDAP/AD集成,与MFA结合管理控制台访问。
- 管理账户保护:禁用root/sa远程登录,创建审计管理员账号并启用MFA;设置session超时与登录失败锁定策略。
8. 网络层防护:VPC、子网与堡垒机(Bastion)实操
- 网络隔离:将数据库实例放在私有子网,无公网IP。仅允许应用服务器或堡垒机所在安全组访问数据库端口(3306/5432)。
- 安全组/防火墙规则:仅开放必要端口与源IP,示例iptables/nft规则或云安全组配置。
- 堡垒机与跳板:使用跳板主机并通过SSH证书登录,堡垒机做审计并开启连接录制(session recording)。禁止直接对外管理数据库端口。
9. 审计、日志与备份加密
- 启用审计插件:MySQL使用audit_log或MariaDB audit,Postgres启用pgaudit记录DDL/DML。配置日志远传至集中化SIEM(例如ELK、Splunk)。
- 备份策略:定期全备+增量,备份文件在生成时使用KMS或GPG/OpenSSL加密(示例:openssl enc -aes-256-cbc -salt -in dump.sql -out dump.sql.enc -pass file:/path/keyfile)。
- 备份恢复演练:定期做恢复演练并验证加密备份的密钥可用性和恢复速度。
10. 运维与合规监控、定期检查
- 合规检查清单:检查加密启用、TLS版本、弱密码、开放端口、审计是否开启、密钥轮换记录。
- 自动化检测:使用脚本或工具(如OpenSCAP、inspec)定期扫描配置偏离,并将警报接入运维告警系统。
- 文档与SOP:制定密钥管理、证书更新、应急解密流程与责任人,保存操作审计记录以满足审计合规要求。
11. 常见问题与快速排查(Q&A)
- 问:数据库启用TLS后客户端连接报错“certificate verify failed”,如何排查?
- 答:确认客户端使用了正确的CA证书进行验证;检查server.crt的CN或SAN是否包含服务器主机名;确保证书链完整并且时间有效;客户端使用的ssl-mode需要为VERIFY_IDENTITY或等效选项。
12. 常见问题与快速排查(Q&A)
- 问:如何在不停机的情况下对表启用InnoDB加密?
- 答:对于MySQL,一般需逐表在线重建表空间:ALTER TABLE tbl ENGINE=InnoDB;(重建表时会应用加密)。若表非常大,建议使用pt-online-schema-change或复制延迟切换到加密实例后完成切换。
13. 常见问题与快速排查(Q&A)
- 问:密钥遗失或KMS不可用时如何应急?
- 答:预先准备应急计划:1) 离线备份的明文或加密备份管理策略(仅限受信任的极少数人);2) 为关键数据设置密钥恢复流程与多角色审批;3) 定期验证备份可在备用KMS或手动解密流程下恢复。
来源:安全合规越南云服务器数据库 数据加密与访问控制配置建议