
# RDS for PostgreSQL安全最佳实践
PostgreSQL数据库在可靠性、稳定性、数据一致性等获得了业内极高的声誉，已成为许多企业的首选开源关系数据库，业界简称PG。RDS for PostgreSQL是一种基于云计算平台的即开即用、稳定可靠、弹性伸缩、便捷管理的在线云数据库服务。
为加强RDS for PostgreSQL数据库安全性，本文将从以下几个维度给出建议，您可以根据业务需要在本指导的基础上进行安全配置。
- [配置数据库的最大连接数]
- [配置客户端认证超时时间]
- [配置SSL连接和加密算法]
- [配置密码加密功能]
- [配置合理的pg_hba规则]
- [配置服务器拒绝带反斜杠转义的引号]
- [定期检查并删除业务不再使用的角色]
- [建议回收public模式的所有权限]
- [设置合理的用户角色密码有效期]
- [建议使用DEW服务托管数据库密码]
- [配置日志级别记录发生错误的SQL语句]
- [确保数据库账号的最低权限]
- [开启备份功能]
- [开启数据库审计功能]
- [避免绑定EIP直接通过公网访问RDS for PostgreSQL]
- [数据库版本更新到最新版本]
- [配置账号认证失败延迟时间]
- [建议将数据库主备实例部署在不同可用区]
- [建议开启敏感操作保护]
- [建议修改数据库的默认端口]
- [建议开启数据库磁盘加密]
- [建议使用基于时间点恢复数据]
- [建议对接云日志服务LTS]
 #### 配置数据库的最大连接数
max_connections 决定了数据库的最大并发连接数。增加这个参数值可能引起RDS for PostgreSQL请求更多的System V共享内存或者信号量，会导致超出操作系统默认配置允许的值。请根据业务的复杂度，合理配置max_connections，具体可参考[实例使用规范](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_12_0002.html)。
 #### 配置客户端认证超时时间
authentication_timeout控制完成客户端认证的时间上限，单位是秒。该参数可以防止客户端长时间占用连接通道，默认是60s。如果在指定的时间内没有完成认证，连接将被强制关闭。该超时时间的配置是为了增强PostgreSQL的安全性。
 #### 配置SSL连接和加密算法
尽可能利用SSL进行TCP/IP连接，使用SSL加密通信可确保客户端和服务器之间的所有通信都经过加密，防止数据被泄露和篡改，确保数据的完整性。在设置SSL加密时，服务端默认开启SSL加密，但RDS for PostgreSQL数据库的SSL加密还取决于客户端配置，请参考[SSL加密相关配置](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_11_0029.html)。推荐使用TLSv1.2及以上加密协议，加密算法推荐使用EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EDH+aRSA+AESGCM:EDH+aDSS+AESGCM:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!SRP:!RC4，具体请参考[SSL连接](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_connect_05.html)。
可通过修改参数"ssl_min_protocol_version"配置TLS协议，修改参数"ssl_ciphers"配置加密算法。
 #### 配置密码加密功能
密码必须要加密。使用**CREATE USER** 或者**ALTER ROLE**修改密码时候，默认使用加密的方式，推荐使用scram-sha-256，可通过修改参数"password_encryption"进行配置。
MD5选项仅供与低版本兼容场景使用，新建数据库实例默认使用scram-sha-256。
![](https://support.huaweicloud.com/bestpractice-rds-pg/public_sys-resources/notice_3.0-zh-cn.png)
参数"password_encryption"修改后需要重置密码后才能生效。
 #### 配置合理的pg_hba规则
为了确保PostgreSQL数据库的安全性，配置合理的pg_hba规则至关重要。建议仅允许必要的用户和主机访问数据库，限制特定IP地址或子网的访问，定期审查和更新pg_hba文件以确保规则符合当前的业务需要。具体配置方法请参考[修改pg_hba配置](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_05_0027.html)。
 #### 配置服务器拒绝带反斜杠转义的引号
参数"backslash_quote"控制字符串里面引号是否可以被\\'代替。推荐使用SQL标准方法，表示一个引号是写两遍 ('')，如果客户端代码不能正确的转义，可能发生SQL注入攻击。建议配置参数"backslash_quote"值为"safe_encoding"，拒绝带反斜杠转义的引号的查询，可以避免SQL注入的风险。
 #### 定期检查并删除业务不再使用的角色
对于每个查询出来的角色，检查是否必须存在，任何未知的角色都需要被审视，确保每个角色都是正常使用的，否则删除这些角色。可通过如下命令进行查询：
**SELECT rolname FROM pg_roles;**
 #### 建议回收public模式的所有权限
在PostgreSQL中，public模式默认允许所有用户创建对象并访问其内容，为保障数据库安全，建议回收public模式对所有用户的默认权限。应基于最小权限原则，仅对有需要的用户或角色授予USAGE和必要的对象权限，可以有效防止未授权访问，提升整体系统的安全性。root用户可通过如下命令回收权限：
**revoke all on schema public from public;**
 #### 设置合理的用户角色密码有效期
当创建角色时候，使用++[VALID UNTIL](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0040.html)++关键字设置过多长时间后角色的密码不再有效。如果这个关键字被忽略，密码会长期有效。建议定期更改密码，例如每三个月更改一次密码。可通过如下命令进行设置：
**CREATE ROLE name WITH PASSWORD** *'password'* **VALID UNTIL 'timestamp';**
检查是否设置密码有效期：
**SELECT rolname,rolvaliduntil FROM pg\\_roles WHERE rolsuper = false AND rolvaliduntil IS NULL;**
 #### 建议使用DEW服务托管数据库密码
用户或应用程序使用RDS for PostgreSQL数据库时，不同的用户密码分散在不同业务，可能存在管理混乱，密码泄露或丢失的风险。建议使用[DEW服务](https://support.huaweicloud.com/productdesc-dew/dew_01_0093.html)托管RDS for PostgreSQL数据库密码，通过DEW的凭据管理[创建凭据](https://support.huaweicloud.com/usermanual-dew/dew_01_9993.html)，实现RDS for PostgreSQL数据库用户密码的托管服务。
 #### 配置日志级别记录发生错误的SQL语句
参数"log_min_error_statement"控制哪些引起错误的SQL语句记录到服务器日志中。对于大于等于当前配置等级的SQL语句消息，会记录到日志里。有效的值包括debug5, debug4, debug3, debug2, debug1, info, notice, warning, error, log, fatal, panic。"log_min_error_statement"至少配置为"error"，具体可参考++[日志配置管理](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_08_0036.html)++。
 #### 确保数据库账号的最低权限
RDS for PostgreSQL支持"基于角色"的方法授予账号对数据和命令的访问权限。建议管理员结合业务需要，遵从最低授权原则，创建合适的[数据库账号](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_05_0009.html)，对账号进行授权。如果发现存在不符合该角色的账号权限，请结合业务需要，对账号权限进行更新或者++[删除](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_05_0013.html)++ 。由于PostgreSQL存在一些[内置账号](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0040.html)，用于给数据库实例提供完善的后台运维管理服务，禁止用户使用和删除。
 #### 开启备份功能
创建云数据库RDS实例时，系统默认开启自动备份策略，默认自动备份保留7天，可根据业务需要调整备份保留时长。RDS for PostgreSQL实例支持[自动备份](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0027.html)和++[手动备份](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0028.html)++ ，您可以定期对数据库进行备份，当数据库故障或数据损坏时，可以++[通过备份文件恢复数据库](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0030.html)++ ，从而保证数据可靠性，详情请参见++[数据备份](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_08_0047.html)++。
 #### 开启数据库审计功能
通过将PostgreSQL审计扩展（pgAudit）与RDS for PostgreSQL数据库实例一起使用，可以捕获审计员通常需要或满足法规要求的详细记录。例如，您可以设置pgAudit扩展来跟踪对特定数据库和表所做的更改、记录进行更改的用户以及许多其他详细信息。pgAudit默认不开启，根据业务需要开启插件。具体配置可参考[使用pgAudit插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0063.html)。
 #### 避免绑定EIP直接通过公网访问RDS for PostgreSQL
避免RDS for PostgreSQL部署在公网或者DMZ里，应该将RDS for PostgreSQL部署在华为云内部网络，使用路由器或者防火墙技术把RDS for PostgreSQL保护起来，避免直接绑定EIP方式从公网访问RDS for PostgreSQL。通过这种方式防止未授权的访问及DDos攻击等。建议解绑弹性公网IP，如果您的业务必须绑定EIP，请务必通过设置++[安全组规则](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0030969470.html)++限制访问数据库的源IP。
 #### 数据库版本更新到最新版本
对于PostgreSQL社区停止维护的版本，云上RDS for PostgreSQL服务也会相应发布[产品生命周期](https://support.huaweicloud.com/bulletin-rds-pg/rds_bulletin_0007.html)。使用较老的版本可能存在安全风险，运行最新版本的软件可以避免受到某些攻击。如果业务需要，可通过++[升级内核小版本](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_05_0003.html)++ 或者++[使用转储与还原升级大版本](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0053.html)++。
 #### 配置账号认证失败延迟时间
PostgreSQL数据库默认内置了auth_delay插件，auth_delay会使服务器在返回认证失败之前短暂停止，使得暴力破解数据库密码更难。可通过[修改RDS for PostgreSQL实例参数](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_configuration.html)设置auth_delay.milliseconds参数（该参数为返回认证失败之前等待的毫秒数）延迟账号登录认证失败的等待时间，缺省值是3000。
 #### 建议将数据库主备实例部署在不同可用区
为确保数据库的高可用性和故障切换能力，建议将数据库主备实例部署在不同可用区。该配置可在主可用区发生故障时，自动切换至备用实例，减少停机时间，保障业务连续性。
 #### 建议开启敏感操作保护
RDS控制台支持敏感操作保护，开启后执行删除实例等敏感操作时，系统会进行身份验证，进一步保证RDS配置和数据的安全性。开启敏感操作保护需要在IAM上启用MFA，详见[敏感操作保护](https://support.huaweicloud.com/usermanual-iam/iam_07_0002.html)。
 #### 建议修改数据库的默认端口
如果您使用业界已知的默认端口创建RDS实例，攻击者可能猜测到数据库的信息，从而利用端口信息与其他信息结合对RDS实例进行攻击。建议修改数据库的默认端口，详见[修改数据库端口](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_change_database_port.html)。
 #### 建议开启数据库磁盘加密
建议您在购买数据库实例时开启"磁盘加密"功能，开启磁盘加密能够提高数据库的安全性。开启磁盘加密后，存放在OBS上的备份数据库不会被加密。详见[购买RDS for PostgreSQL实例](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_10_0028.html)中的"磁盘加密"说明。
 #### 建议使用基于时间点恢复数据
云数据库RDS服务支持使用已有的备份恢复实例数据到指定时间点。实例恢复到指定时间点，会从OBS备份空间中选择一个该时间点最近的全量备份下载到实例上进行全量恢复，基于时间点恢复能够提升云数据库在面对数据丢失或损坏时的安全响应能力。详见[全量数据恢复：恢复到指定时间点](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0029.html)。
 #### 建议对接云日志服务LTS
服务支持将错误日志和慢日志上传至云日志服务（LTS），LTS可以配置日志存储时间。用户可以通过云日志服务快速高效地进行日志处理与分析等操作。详见[日志配置管理](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_08_0036.html)。
