连接配置
禁止侦听主机上所有IP地址
说明
参数listen_addresses
指定服务器在哪些TCP/IP地址上侦听客户端连接。侦听地址配置参数listen_addresses
不允许包含表示所有IP地址的“*”或“0.0.0.0”或“::”字符串。对于包含多个网卡的主机,侦听所有IP地址将无法做到网络隔离,通过禁止侦听主机上所有IP地址可以阻止来自其他网络的恶意连接请求。
实现
检查方法:
执行如下SQL语句检查参数listen_addresses
配置,如果返回不为空则表示失败。
SELECT name,setting FROM pg_settings WHERE name = 'listen_addresses' AND
(position('*' in setting) OR position('0.0.0.0' in setting) OR position('::' in setting));
修复方法:
避免侦听主机上所有网卡地址,设置参数listen_addresses
为“localhost”或需要接收业务请求的网卡IP地址,多个地址用逗号隔开,然后重启数据库。侦听地址以localhost和192.168.1.1为例命令如下。
gs_guc set -Z datanode -N all -I all -c "listen_addresses='localhost,192.168.1.1'"
gs_om -t stop && gs_om -t start
确保对外服务端口使用非默认端口号
说明
参数port
为数据库服务侦听的TCP端口号。采用默认端口号容易被恶意攻击者获取并攻击,需将对外服务端口号配置为非默认端口号。默认端口号请参考产品相关文档说明。
实现
检查方法:
以端口号5432为例,如果port
参数值为默认端口号则失败。
SELECT name,setting FROM pg_settings WHERE name = 'port' AND setting = '5432';
修复方法:
用户需在安装数据库时通过配置文件指定各个实例的端口号。
确保数据库实例的最大连接数配置正确
说明
参数max_connections
控制数据库DN实例的最大连接数。参数设置过大可能引起数据库请求更多的System V共享内存或者信号量,导致超出操作系统默认配置允许的值。用户需要根据业务规格确定参数值的大小或咨询技术支持。
实现
检查方法:
检查max_connections
参数配置,用户需要根据业务规格确定配置多大并发连接数目。
openGauss=# show max_connections;
max_connections
-----------------
5000
(1 row)
修复方法:
以配置最大连接数为5000为例,通过如下命令修改参数 max_connections
的值,然后重启数据库。
gs_guc set -Z datanode -N all -I all -c "max_connections=5000"
gs_om -t stop && gs_om -t start
确保Database的最大连接数配置正确
说明
为了控制访问数据库的会话数量,推荐配置会话数量限制在1024个以内。若设置参数datconnlimit
为-1,表示不限制连接数据库的会话数量。
实现
检查方法:
执行如下SQL语句检查是否存在不限制连接数的数据库:
SELECT datname FROM pg_database WHERE datistemplate = false AND (datconnlimit = -1 OR datconnlimit > 1024);
修复方法:
UPDATE pg_database SET datconnlimit=<CONN_LIMIT_VALUE> WHERE datname=<DATABASE_NAME>;
其中<CONN_LIMIT_VALUE>
表示设置的数据库允许的最大会话连接数,<DATABASE_NAME>
为数据库名称。
确保系统管理员使用的连接数配置正确
说明
参数sysadmin_reserved_connections
表示预留给数据库系统管理员的最少连接数,为系统管理员预留连接通道,避免连接被普通用户或恶意用户占用导致管理员无法连接。此参数值必须小于max_connections
的值。
实现
检查方法:
openGauss=# show sysadmin_reserved_connections;
sysadmin_reserved_connections
-------------------------------
3
(1 row)
修复方法:
修改参数sysadmin_reserved_connections
为3,然后重启数据库。
gs_guc set -Z datanode -N all -I all -c "sysadmin_reserved_connections=3"
gs_om -t stop && gs_om -t start
确保用户的最大连接数配置正确
说明
在openGauss数据库中,不应该允许用户无限制数量的连接。如果用户参数rolconnlimit
设置为-1,表示允许无限制数量的并发连接。根据业务需求限制不同用户的最大连接数,可避免连接被某个用户全部占用。
实现
检查方法:
执行以下SQL语句检查是否存在不限制连接数的用户,其中以gs_role
开头的为内置角色不允许连接、无需检查。
SELECT rolname, rolconnlimit FROM pg_roles WHERE rolname NOT LIKE 'gs_role%' AND rolconnlimit = -1;
修复方法:
ALTER ROLE <role_name> CONNECTION LIMIT <connection_num>;
其中<role_name>
表示用户名,<connection_num>
表示配置的最大连接数。
确保UNIX域套接字的访问权限配置正确
说明
参数unix_socket_permissions
用于设置UNIX域套接字的访问权限。推荐配置是0700
(只有当前连接数据库的用户自己可以访问,同组或者其他人都没有权限),满足文件权限最小化要求,避免文件被其他用户访问或篡改而影响套接字通信功能。
实现
检查方法:
检查unix_socket_permissions
参数配置值是否为0700
,如果不是则失败。
openGauss=# show unix_socket_permissions;
unix_socket_permissions
-------------------------
0700
(1 row)
修复方法:
修改unix_socket_permissions
参数值为0700
,然后重启数据库。
gs_guc set -Z datanode -N all -I all -c "unix_socket_permissions=0700"
gs_om -t stop && gs_om -t start
确保除服务端节点外无host条目使用trust认证
说明
服务端节点部署在安全内网环境中,仅允许初始用户在服务端使用trust认证方式通讯。应配置pg_hba.conf
除服务端节点外没有host条目使用trust认证方法。trust认证即无需认证即可允许连接。目前仅允许与运行数据库的OS用户同名的初始用户在服务端本地连接使用trust认证,其他远程连接或非初始用户连接等场景都需要经过服务端认证。用户在pg_hba.conf
配置文件中增加客户端host条目时应避免使用trust认证方法,否则会导致与服务端连接失败。
实现
检查方法:
通过如下shell命令检查pg_hba.conf
配置中是否存在trust认证条目,其中${GAUSSDATA}
为DN的数据目录。此检查需要人工确认哪些是服务端节点IP和本地环回IP,其中127.0.0.1和::1为本地环回IP,需确保除服务端节点IP和本地环回IP外无host条目使用trust认证。
grep -P '^[^#]*host(ssl|nossl)?\s+.+[Tt][Rr][Uu][Ss][Tt]\s*$' ${GAUSSDATA}/pg_hba.conf
修复方法:
除了初始用户连接服务端节点外,文件pg_hba.conf
中其他host项配置为非trust认证方法。
确保没有host条目使用md5认证
说明
md5认证方式存在安全风险,可能导致密码被破解,应采用更安全的sha256认证或证书认证方式。保留md5认证方式是为了兼容开源社区工具,但在生产环境中禁止使用md5认证。
实现
检查方法:
通过如下shell命令检查pg_hba.conf
配置中是否存在md5认证条目,其中${GAUSSDATA}
为DN的数据目录。
grep -P '^[^#]*host(ssl|nossl)?\s+.+[Mm][Dd][5]\s*$' ${GAUSSDATA}/pg_hba.conf
修复方法:
为客户端host项配置认证方式为sha256。例如,配置用户user1
通过IP为192.168.0.1
的客户端连接数据库db1
,认证方式为sha256,配置命令如下。
gs_guc reload -Z datanode -N all -I all -h "host db1 user1 192.168.0.1/32 sha256"
确保没有hostnossl条目
说明
hostnossl
条目指定不使用SSL加密连接,而host
条目允许SSL和非SSL连接,hostssl
则只能使用SSL连接。从安全角度考虑,推荐使用SSL加密连接对传输数据加密,避免信息泄露。
实现
检查方法:
通过如下shell命令检查pg_hba.conf
配置中是否存在hostnossl
条目,其中${GAUSSDATA}
为DN的数据目录。
grep -P '^[^#]*hostnossl' ${GAUSSDATA}/pg_hba.conf
修复方法:
将配置文件pg_hba.conf
中所有hostnossl
条目改为host
或hostssl
。
确保没有host条目的数据库指定为all
说明
host连接条目若指定数据库为all,则允许用户连接到任何一个数据库。在满足业务需求的前提下,建议为不同的用户或客户端IP指定所需连接的数据库,避免不同业务之间相互影响。
实现
检查方法:
通过如下shell命令检查pg_hba.conf
配置中是否存在数据库指定为all的条目,其中${GAUSSDATA}
为DN的数据目录。此检查需要人工确认哪些是服务端节点IP和本地环回IP(如127.0.0.1和::1),确保除服务端节点IP和本地环回IP外无host条目的数据库指定为all。
grep -P '^[^#]*host(ssl|nossl)?\s+[Aa][Ll][Ll]' ${GAUSSDATA}/pg_hba.conf
修复方法:
除服务端内部连接外,根据业务需要将配置文件pg_hba.conf
中host、hostssl条目中的数据库为all的条目修改为需要连接的数据库。
确保没有host条目的用户指定为all
说明
host条目配置user为all表示允许所有用户连接到数据库。推荐host条目的user取值仅为需要连接数据库的用户。
实现
检查方法:
通过如下shell命令检查pg_hba.conf
配置中是否存在用户指定为all的条目,其中${GAUSSDATA}
为DN的数据目录。此检查需要人工确认哪些是服务端节点IP和本地环回IP(如127.0.0.1和::1),需确保除服务端节点IP和本地环回IP外无host条目的用户指定为all。
grep -P '^[^#]*host(ssl|nossl)?\s+\S+\s+[Aa][Ll][Ll]' ${GAUSSDATA}/pg_hba.conf
修复方法:
除服务端内部连接外,根据业务需要将配置文件pg_hba.conf
中host、hostssl对应用户为all的条目修改为需要连接数据库的用户。
确保没有host条目的源地址指定为0.0.0.0/0
说明
host条目配置源地址为0.0.0.0/0意味着允许任意IP连接到数据库,这可能导致数据库被恶意用户进行网络攻击,影响数据库的安全性。推荐host条目配置的源地址仅为需要连接数据库的IP。
实现
检查方法:
通过如下shell命令检查pg_hba.conf
配置中是否存在源地址指定为0.0.0.0/0的条目,其中${GAUSSDATA}
为DN的数据目录。
grep '0.0.0.0/0' ${GAUSSDATA}/pg_hba.conf
修复方法:
在配置文件pg_hba.conf
中删除所有host、hostssl源地址为0.0.0.0/0的条目,或将地址改为需要连接数据库的客户端IP地址。
确保服务端使能SSL连接
说明
SSL协议是为网络通信提供安全及数据完整性的一种安全协议。在使用数据库过程中应使用SSL协议进行TCP/IP连接以确保数据传输安全。参数ssl
用于控制服务端是否使能SSL连接,参数为on
表示使能SSL,此时服务端允许客户端通过SSL连接或非SSL连接,如果设置为off
则只能通过非SSL连接。有关创建服务器私钥和证书的细节信息,可以参考openGauss的产品文档。
实现
检查方法:
检查参数ssl的配置是否为on,如果不为on则失败。
openGauss=# show ssl;
ssl
-----
on
(1 row)
修复方法:
配置参数ssl
参数为on
,然后重启数据库。
gs_guc set -Z datanode -N all -I all -c "ssl=on"
gs_om -t stop && gs_om -t start