# GaussDB安全配置建议
安全性是华为云与您的共同责任。华为云负责云服务自身的安全，提供安全的云。作为租户，您需要合理使用云服务提供的安全能力对数据进行保护，安全地使用云。详情请参见[责任共担](https://support.huaweicloud.com/resp-pcre/index.html?product=gaussdb)。
本文提供了GaussDB使用过程中的安全配置建议，旨在为提高整体安全能力提供可操作的规范性指导。根据该指导文档您可以持续评估GaussDB的安全状态，更好的组合使用GaussDB提供的多种安全能力，提高对GaussDB的整体安全防御能力，保护存储在GaussDB的数据不泄露、不被篡改，以及数据传输过程中不泄露、不被篡改。
本文从以下几个维度给出建议，您可以评估GaussDB的使用情况，并根据业务需要在本指导的基础上进行安全配置。
- [最大连接数配置]
- [安全认证配置]
- [客户端接入认证配置]
- [用户密码的安全策略]
- [权限管理]
  
- [数据库审计]
- [WAL 归档配置]
- [备份管理]
- [恢复管理]
- [数据库实例配置多个可用区]
- [开启敏感操作保护]
- [开启传输加密]
- [完善数据库连接相关配置]
 #### 最大连接数配置
如果GaussDB连接数过高，会消耗服务器大量资源，导致操作响应变慢，可以修改max_connections参数进行优化，具体内容请参见[连接设置](https://support.huaweicloud.com/distributed-devg-v3-gaussdb/gaussdb-10-0259.html)。
max_connections：允许和数据库连接的最大并发连接数，此参数会影响集群的并发能力。
 #### 安全认证配置
为了保证用户体验，同时为了防止账户被人通过暴力破解，GaussDB设置了账户登录重试次数及失败后自动解锁时间的保护措施，GaussDB针对账户提供了以下能力：
- failed_login_attempts：允许用户设置最大登录失败次数。
- password_lock_time：此参数允许用户修改账户被锁定后自动解锁时间，单位为天。 若管理员发现某账户被盗、非法访问等异常情况，可手动锁定该账户。当管理员认为账户恢复正常后，可手动解锁该账户。
  以手动锁定和解锁用户joe为例，命令格式如下：
  - 手动锁定
    ```
    gaussdb=# ALTER USER joe ACCOUNT LOCK;
    ALTER ROLE
    ```
    
  
  - 手动解锁
    ```
    gaussdb=# ALTER USER joe ACCOUNT UNLOCK;
    ALTER ROLE
    ```
    
   
 
 #### 客户端接入认证配置
当主机远程连接数据库时，需要在数据库系统的配置文件中增加此主机的信息，并进行客户端接入认证。为提升用户使用数据库的便利性，GaussDB实例在发放时会在客户端接入认证配置文件中增加如下默认配置。
- 集中式版实例默认配置（假设实例所属子网的网段为192.168.0.0）
  ```
  TYPE   DATABASE        USER    ADDRESS           METHOD
  host    all            all     0.0.0.0/0         sha256
  host    all            all     192.168.0.0/16    sha256
  host    replication    all     192.168.0.0/16    sha256
  ```
  - 第一条：表示允许所有用户，所有IPv4客户端，使用sha256协议访问所有数据库。
  
  - 第二条：表示允许所有用户，当前实例所在子网的所有IPv4客户端，使用sha256协议访问所有数据库。
  
  - 第三条：表示允许所有用户，当前实例所在子网的所有IPv4客户端，使用sha256协议请求一个复制连接。
   
- 分布式版实例默认配置
  该配置表示允许所有用户，所有IPv4客户端，使用sha256协议访问所有数据库。
  ```
  TYPE   DATABASE        USER    ADDRESS           METHOD
  host    all            all     0.0.0.0/0         sha256
  ```
  
 
通常情况下，默认配置可以满足大部分客户端的远程连接需求。如果您在后续的使用中，有更细粒度控制客户端接入的需求，或者已有的接入认证配置不满足您的日常使用，您可以参考[客户端接入认证配置](https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_871.html)进行管理。
为了提高安全性，建议您结合业务使用场景，修改默认配置，使用更细粒度的接入认证配置管理客户端接入。
 #### 用户密码的安全策略
GaussDB为了客户账号的安全，对用户密码进行了以下设置：
- 用户密码存储在系统表pg_authid中，为防止用户密码泄露，GaussDB对用户密码进行加密存储，所采用的加密算法由配置参数password_encryption_type决定。
- GaussDB数据库用户的密码都有密码有效期，如果需要修改密码有效期，可以通过修改[password_effect_time](https://support.huaweicloud.com/distributed-devg-v8-gaussdb/gaussdb-10-0260.html#section35)来更改。
 
 #### 权限管理
- 虚拟私有云可以为GaussDB实例构建隔离的、用户自主配置和管理的虚拟网络环境。子网提供与其他网络隔离的、可以独享的网络资源，以提高网络安全性，可以使用IAM为企业中的员工设置不同的访问权限，以达到不同员工之间的权限隔离，通过IAM进行精细的权限管理。具体内容请参见[权限管理](https://support.huaweicloud.com/productdesc-gaussdb/gaussdb_01_057.html)。
- 保障数据库的安全性和稳定性在使用数据库实例之前务必先设置安全组，具体内容请参见[设置安全组规则](https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_171.html)。
- 为防止PUBLIC拥有CREATE权限，导致数据库任何账户都可以在PUBLIC模式下创建表或者其他数据库对象，其他用户也可以修改这些数据，可以如下SQL语句来查询： **SELECT CAST(has_schema_privilege('public','public','CREATE') AS TEXT);**
  - 如果返回为TRUE，执行如下SQL语句进行修复： **REVOKE CREATE ON SCHEMA public FROM PUBLIC;**
    
   
- PUBLIC角色属于任何用户，如果将对象的所有权限授予PUBLIC角色，则任意用户都会继承此对象的所有权限，违背权限最小化原则，为了保障数据库数据的安全，此角色应该拥有尽可能少的权限。通过执行如下SQL语句来确定所有权限是否授权PUBLIC角色： **SELECT relname,relacl FROM pg_class WHERE (CAST(relacl AS TEXT) LIKE '%,=arwdDxt/%}' OR CAST(relacl AS TEXT) LIKE '{=arwdDxt/%}') AND (CAST(relacl AS TEXT) LIKE '%,=APmiv/%}' OR CAST(relacl AS TEXT) LIKE '{=APmiv/%}');**
  - 为空则说明已授权，如果已授权，可通过执行如下SQL语句来修复： **REVOKE ALL ON \<OBJECT_NAME\> FROM PUBLIC;**
    
   
- pg_catalog模式下的pg_authid系统表中包含了数据库中所有的角色信息。由于所有用户会继承PUBLIC角色的权限，为了防止敏感信息泄露或被更改，PUBLIC角色不允许拥有pg_authid系统表的任何权限，执行如下SQL语句，如果查询结果显示不为空，则已经被授权： **SELECT relname,relacl FROM pg_class WHERE relname = 'pg_authid' AND CAST(relacl AS TEXT) LIKE '%,=%}';**
  - 如果已授权，通过执行如下SQL语句进行修复： **REVOKE ALL ON pg_authid FROM PUBLIC;**
    
   
- 普通用户指用于执行普通业务操作的非管理员用户。作为普通用户，不应该拥有超出其正常权限范围的管理权限，例如创建角色权限，创建数据库权限，审计权限，监控权限，运维权限，安全策略权限等，在满足正常业务需求的前提下，为了确保普通用户权限最小化，应撤销普通用户非必须的管理权限。
- 在创建函数时声明SECURITY DEFINER表示函数以创建它的用户权限执行，如果使用不当会导致函数执行者借助创建者的权限执行越权操作，所以一定确保这样的函数不被滥用。为了安全考虑，禁止PUBLIC角色执行SECURITY DEFINER类型的函数，执行如下SQL语句查询PUBLIC角色是否有SECURITY DEFINER类型的函数： **S** **ELECT a.proname, b.nspname FROM pg_proc a, pg_namespace b where a.pronamespace=b.oid and b.nspname \<\> 'pg_catalog' and a.prosecdef='t';**
  - 如果返回非空，执行如下SQL语句检查是否有执行权限： **SELECT CAST(has_function_privilege('public', 'function_name(\[arg_type\]\[, ...\])', 'EXECUTE') AS TEXT);**
    - 返回TRUE，则代表拥有，执行下面的SQL语句进行修复： **REVOKE EXECUTE ON FUNCTION function_name(\[arg_type\]\[, ...\]) FROM PUBLIC;**
      
     
   
- SECURITY INVOKER函数是以调用它的用户的权限来执行，使用不当会导致函数创建者借助执行者的权限执行越权操作，所以在调用非自身创建的这类函数时，一定要先检查函数执行内容，避免造成函数创建者借助执行者的权限执行了越权的操作。
 
 #### 数据库审计
- GaussDB可以记录实例相关的操作，但是仅针对支持的审计操作，请在操作前查询操作列表，具体内容请参见[支持审计的关键操作列表](https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_248.html)。
- 确保配置开启数据库对象的添加、删除、修改审计，具体内容请参见[数据库审计](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0027.html)。
- 支持审计日志可视化查看，可通过对接云日志服务LTS实现，对接后会将实例所请求的所有详细日志上传至云日志服务（LTS），用户可以通过云日志服务快速高效地进行日志查看、处理等操作。如何对接LTS请参考[对接LTS并查看数据库审计日志](https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_250.html)。
  - 访问日志提供了实例所请求的所有详细日志，日志存在LTS云日志服务中。
  
  - 配置完成后不会立即生效，存在10分钟左右的时延。
  
  - 配置成功后，会产生一定费用。
  
  - 在您进行LTS审计日志配置后，会默认上传所有审计策略。
  
  - 若您的审计策略为打开状态，将会复用您之前的审计策略，且会在原有的审计日志计费基础上增加您LTS的审计日志收费。原有的审计日志费用会在您关闭原有审计策略后终止。
  
  - 出于对您实例的正常运行考虑，若您原有审计策略开启的情况下，配置了LTS审计日志，建议保留原有审计策略一段时间，待您LTS审计日志运转正常后，再行关闭。
   
 
 #### WAL 归档配置
WAL(Write Ahead Log)即预写式日志，也称为Xlog。wal_level决定了写入WAL的信息量。为了在备机上开启只读查询，wal_level需要在主机上设置成hot_standby，并且备机设置hot_standby参数为on。
 #### 备份管理
GaussDB支持数据库实例的备份和恢复，以保证数据可靠性。备份目前将以未加密的方式存储，防止客户误操作或者服务异常的情况下，因没有开启备份而造成数据丢失的情况，GaussDB针对备份提供了以下能力：
- 提供了自动和手动的备份功能，具体内容请参见[备份概述](https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_214.html)，在创建GaussDB实例时，系统默认开启实例级自动备份策略。实例创建成功后，您可根据业务需要修改实例级自动备份策略。
- 提供了自动备份策略，定时定期对数据库进行备份。具体内容请参见[设置自动备份策略](https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_216.html)。
- 提供了导出备份文件的能力，具体内容请参见[导出备份信息](https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_222.html)。
 
 #### 恢复管理
云数据库GaussDB服务支持使用已有的自动备份，恢复实例数据到指定时间点。实例恢复到指定时间点，会从OBS备份空间中选择一个距离该时间点最近的全量备份下载到实例上进行全量恢复，基于时间点恢复能够提升云数据库在面对数据丢失或损坏时的安全响应能力。详情请参见[恢复GaussDB实例到指定时间点](https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_230.html)。
 #### 数据库实例配置多个可用区
GaussDB支持跨AZ高可用。当用户购买实例时，可以选择主可用区和备可用区不在同一个可用区（AZ）。主机和备机部署在不同的可用区，提供不同可用区之间的故障转移能力和高可用性。
 #### 开启敏感操作保护
GaussDB控制台支持敏感操作保护，开启后执行删除实例等敏感操作时，系统会进行身份验证，进一步保证GaussDB配置和数据的安全性。开启敏感操作保护需要在IAM上启用MFA，详情请参见[开启敏感操作](https://support.huaweicloud.com/usermanual-iam/iam_07_0002.html)。
 #### 开启传输加密
服务端默认支持SSL连接。客户端在使用时应尽可能利用SSL进行TCP/IP连接，使用SSL加密通信可确保客户端和服务器之间的所有通信都经过加密，防止数据被泄露和篡改，确保数据的完整性。具体请参考[SSL连接](https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_503.html#section4)。
 #### 完善数据库连接相关配置
1. **避免直接绑定EIP方式从公网访问GaussDB**
   避免GaussDB部署在公网或者DMZ里，应该将GaussDB部署在华为云内部网络，使用路由器或者防火墙技术把GaussDB保护起来，避免直接绑定EIP方式从公网访问GaussDB，通过这种方式防止未授权的访问及DDos攻击等。建议解绑弹性公网IP，如果您的业务必须绑定EIP，请务必通过设置安全组规则限制访问数据库的源IP。
   
2. **避免使用默认端口号**
   如果您使用已知端口创建GaussDB实例，攻击者可能猜测到数据库的信息，从而利用端口信息与其他信息结合对GaussDB实例进行攻击。建议修改数据库的默认端口，详情请参见[修改GaussDB数据库端口](https://support.huaweicloud.com/usermanual-gaussdb/gaussdb_01_521.html)。
   
 
