数据库加固概述

介绍对openGauss系统进行加固的目的和加固方案。

加固目的

openGauss安全加固的主要目的是提高数据库系统的安全性,确保数据的保密性、完整性和可用性。通过实施一系列的安全加固措施,可以减少系统面临的潜在安全风险,如未经授权的访问、数据泄露、恶意攻击等,从而保护用户数据的安全和业务的正常运行。

加固方案

本章描述openGauss的安全加固方案,包括加固方式和加固内容。

加固方式

用户可以通过手动修改openGauss的配置文件(如postgresql.conf、pg_hba.conf等),以调整数据库的安全设置,如密码策略、访问控制、加密通信等。

用户还可以调整数据库的角色和权限设置,确保只有授权的用户能够访问和操作数据库。

加固内容

openGauss数据库加固内容主要分为以下10个部分:

  • 连接配置
  • 文件目录安全
  • 安全认证配置
  • 账号口令管理
  • 权限管理
  • 数据库审计
  • 错误报告和日志配置
  • WAL归档配置
  • 运行环境配置
  • 其它配置

加固影响

对连接配置,文件目录安全等安全加固,可能造成用户使用习惯变更,从而影响系统的易用性。影响数据库易用性的常见加固项请参见表1

表 1 加固影响说明

加固项

建议加固

易用性影响

openGauss默认是否设置了该加固项

确保对外服务端口使用非默认端口号

参数`port`为数据库服务侦听的TCP端口号。采用默认端口号容易被恶意攻击者获取并攻击,需将对外服务端口号配置为非默认端口号。默认端口号请参考产品相关文档说明。

参数`port`由安装时的配置文件指定,请勿轻易修改,否则修改后会影响数据库正常通信。

确保数据库实例的最大连接数配置正确

参数`max_connections`控制数据库DN实例的最大连接数。参数设置过大可能引起数据库请求更多的System V共享内存或者信号量,导致超出操作系统默认配置允许的值。用户需要根据业务规格确定参数值的大小或咨询技术支持。

此参数会影响数据库的并发能力。

确保Database的最大连接数配置正确

为了控制访问数据库的会话数量,推荐配置会话数量限制在1024个以内。若设置参数`datconnlimit`为-1,表示不限制连接数据库的会话数量。

参数`datconnlimit`设置过小会影响数据库最大并发连接数,设置过大或不限制可能会由于会话数量超出系统负载能力,影响数据库的可用性。

确保用户的最大连接数配置正确

在openGauss数据库中,不应该允许用户无限制数量的连接。如果用户参数`rolconnlimit`设置为-1,表示允许无限制数量的并发连接。根据业务需求限制不同用户的最大连接数,可避免连接被某个用户全部占用。

当前用户实际连接数超过用户的最大连接数限制后无法创建新连接。

确保没有host条目的用户指定为all

host条目配置user为all表示允许所有用户连接到数据库。推荐host条目的user取值仅为需要连接数据库的用户。

如果用户需要连接数据库,但`pg_hba.conf`中没有添加对该用户的配置会导致连接失败。

确保客户端认证超时时间配置正确

参数`authentication_timeout`控制完成客户端认证的时间上限,默认为一分钟。如果一个客户端没有在参数设定时间内完成与服务器端的认证,则服务器自动中断与客户端的连接,这样就避免了出问题的客户端无限制地占用连接数。

参数值设置过小可能因超时导致认证失败。

确保认证加密迭代次数配置正确

通过`auth_iteration_count`参数配置对认证凭据进行单向哈希时的迭代次数。迭代次数设置过小会降低口令存储的安全性,设置过大会导致创建用户和认证等涉及口令加密的场景性能劣化。请根据实际硬件条件合理设置迭代次数,迭代次数最低应设置为10000次。

参数值设置过大会导致创建用户和认证等涉及口令加密的场景性能劣化,推荐采用默认迭代次数。

确保账户登录失败尝试次数配置正确

通过参数`failed_login_attempts`配置帐户登录失败尝试次数可以防止口令被暴力破解。参数`failed_login_attempts`默认值为10,表示连续认证失败次数超过10次后,帐户将被自动锁定。

配置参数`failed_login_attempts`为非0时,当连续认证失败次数超过此参数值后,帐户将被自动锁定。

确保首次登陆时修改初始用户的密码

初始用户是权限最高、id为10的系统管理员。如果在安装数据库时未指定初始用户的密码,则默认密码为空。安装完成后首次登陆时需要修改初始用户的密码。如果初始用户密码为空并且没有被及时修改,容易引起低成本的攻击事件,也容易引起外界质疑,带来安全风险。

初始用户的密码需要妥善保管,如果忘记数据库初始用户密码则无法找回。

确保配置用户的有效期限

创建用户或角色时,使用`VALID BEGIN`关键字设置用户的有效开始时间,`VALID UNTIL`关键字设置用户的有效结束时间。如果忽略这两个关键字,则用户或角色将长期有效。数据库服务端各节点的用户过期时间以各节点操作系统的时钟为依据。为确保服务端各节点的时间一致性,建议在安装部署数据库时使用NTP(网络时间协议)。若忽略这一配置,可能存在各节点登录帐户过期时间不一致的风险。因此,建议根据业务需要合理地配置用户或角色的有效期,并及时清理无用的过期用户或角色。

配置用户有效期后,当用户不在有效期限范围内时,将无法与数据库建立连接。

确保配置密码的有效期限

通过`password_effect_time`参数可以配置用户登录密码的有效期,而`password_notify_time`参数则用于配置密码到期前多少天进行提醒。一旦密码达到过期提醒的时间,系统会在用户登录数据库时提示用户修改密码。建议用户定期更新密码,提升密码使用的安全性。

考虑到数据库使用的特殊性及业务连续性,密码过期后用户仍然可以登录数据库,但每次登录时系统都会提示用户修改密码,直至密码被修改为止。

禁止PUBLIC角色在public模式下拥有CREATE权限

如果PUBLIC角色在public模式下拥有CREATE权限,则任何用户都可以在public模式下创建表或者其他数据库对象,这可能导致安全风险,因为其他用户也可以查看和修改这些表和数据库对象。此外,为了解决CVE-2018-1058漏洞问题,应禁止PUBLIC角色在public模式下拥有CREATE权限。

配置后PUBLIC角色在public模式下无CREATE权限。

禁止PUBLIC角色执行SECURITY DEFINER类型的函数

在创建函数时声明`SECURITY DEFINER`表示函数以创建它的用户权限执行,如果使用不当会导致函数执行者借助创建者的权限执行越权操作,所以一定确保这样的函数不被滥用。为了安全考虑,禁止`PUBLIC`角色执行`SECURITY DEFINER`类型的函数。另外需要说明的是,`SECURITY DEFINER`和`AUTHID DEFINER`的功能相同。

禁止`PUBLIC`角色执行`SECURITY DEFINER`类型的函数后,如果其他用户需要执行此函数需要单独授予相应权限,否则会因权限不足导致执行失败。

确保开启三权分立配置

设置参数`enableSeparationOfDuty`为`on`会开启三权分立配置,限制系统管理员的权限,系统管理员不再拥有创建用户或更改用户配置权限,并且不再拥有查看和维护数据库审计日志的权限。当开启三权分立时,建议用户关闭GUC参数`enable_copy_server_files`来控制系统管理员的copy权限,防止系统管理员通过copy命令读取或者修改用户配置文件。三权分立特性的详细说明请 参见相关产品文档。

如需使用三权分立权限管理模型,应在数据库初始化阶段指定,不建议来回切换权限管理模型。特别的,如需从非三权分立切换至三权分立权限管理模型,应重新审视已有用户的权限集合是否合理。

确保取消系统管理员服务端文件COPY权限

参数`enable_copy_server_files`允许系统管理员用户执行服务端文件的COPY操作,但远程COPY操作存在越权查看或修改敏感文件的风险。在生产环境下的数据库中,通常不建议打开该配置。该参数的默认值为`off`,表示只允许初始用户执行`COPY FROM FILENAME`或`COPY TO FILENAME`语句。

取消系统管理员的服务端文件COPY权限后,系统管理员将无法进行服务端文件的COPY操作。这一配置对初始用户无影响。

确保开启数据库审计功能

审计日志记录是安全事件中事后追溯、定位问题原因及划分事故责任的重要手段。推荐开启数据库审计功能,将参数`audit_enabled`设置为`on`。

审计日志以二进制形式存储于`pg_audit`目录,开启审计功能后会增加磁盘空间占用,并对性能有一定影响。

确保开启数据库对象的查询审计

参数`audit_dml_state_select`决定是否对数据库对象的SELECT操作进行审计,默认值为0表示不开启。

开启此选项可以追溯用户对数据库的查询操作,但通常数据库查询操作使用相对频繁,开启此选项后会影响查询性能,并且会导致审计日志记录增加、占用更多磁盘空间。用户可根据业务需要决定是否开启。

确保审计优先策略配置正确

控制审计日志的保存策略,以空间还是时间限制为优先策略。

空间策略可以保证审计日志磁盘占用的上限,但是不保证历史审计日志存留;时间限制策略保证特定时间段审计日志的保留,可能日志占用空间会变大。

确保单个审计文件的最长记录时间配置正确

参数`audit_rotation_interval`设置单个审计日志文件的最长记录时间。如果超过这个时间,将自动创建一个新的审计日志文件。

参数值设置过小会导致频繁产生审计日志文件。设置过大会导致单个文件记录日志过多、文件占用空间较大,不利于审计日志文件管理。请勿随意调整此参数,否则可能导致`audit_resource_policy`参数无法生效。

确保单个审计日志文件的最大容量配置正确

参数`audit_rotation_size`设置单个审计日志文件最大的容量。当审计日志文件达到最大容量时,将自动创建一个新的日志文件。

参数值设置过小会导致频繁产生审计日志文件。设置过大会导致单个文件记录日志过多、文件占用空间较大,不利于审计日志文件管理。请不要随意调整此参数,否则可能会导致`audit_resource_policy`参数无法生效。

确保所有审计日志文件占用的最大磁盘空间配置正确

参数`audit_space_limit`设置审计文件所占的最大磁盘空间。当审计文件总量超过最大值时,系统将在数据库日志文件中写入警告信息,并删除最早的审计文件,同时记录审计文件删除信息到审计日志中。

设置参数值过大会增加磁盘空间占用。参数值过小则审计日志留存时间变短,可能导致重要日志信息丢失。

确保审计日志文件最大数目配置正确

参数`audit_file_remain_threshold`设置审计日志文件的最大保留数量。当审计文件总数超过指定值时,系统将向数据库日志文件中写入警告信息,并删除最早的审计文件,同时记录审计文件删除信息到审计日志中。

设置参数值过大会增加磁盘空间占用。参数值过小则审计日志可记录周期变短,可能导致重要日志信息丢失。随意调整此参数可能会影响`audit_resource_policy`参数的效果。

确保开启日志收集器

参数`logging_collector`控制开启后端日志收集进程`logger`进行日志收集。该进程捕获发送到`stderr`或`csvlog`的日志消息并写入日志文件。这种记录日志的方法比将日志记录到`syslog`更加有效,因为某些类型的消息在`syslog`的输出中无法显示。

将服务器日志发送到`stderr`时可以不使用`logging_collector`参数,此时日志消息会被发送到服务器的`stderr`指向的空间。这种方法的缺点是日志回滚困难,只适用于较小的日志容量。

确保单个日志文件最大记录时间配置正确

参数`log_rotation_age`用于设置单个日志文件最大的日志记录时间。当日志记录时间超过该参数设置的最大值时,服务器将自动创建新的日志文件。正确的配置有助于避免日志文件过于频繁地产生,同时避免单个日志文件过大导致管理不便。

如果`log_rotation_age`参数值设置过小,将导致日志文件频繁产生,增加管理难度。如果参数值设置过大,单个日志文件将记录过多的日志,可能导致文件占用空间过大,同样不利于日志文件管理。

确保单个日志文件最大容量配置正确

参数`log_rotation_size`用于设置单个日志文件的最大容量。当日志文件达到该最大容量时,服务器将自动创建新的日志文件,以避免日志文件过大导致管理困难。

如果`log_rotation_size`参数值设置过小,会导致日志文件频繁产生,增加管理难度。如果参数值设置过大,单个日志文件将记录过多的日志,可能导致文件占用空间过大,不利于日志文件管理。

确保客户端日志等级配置正确

参数`client_min_messages`控制按设置的等级将消息发送到客户端。有效的值包括`debug`、`debug5`、`debug4`、`debug3`、`debug2`、`debug1`、`info`、`log`、`notice`、`warning`、`error`、`fatal`、`panic`,其中`debug`和`debug2`等效。每个等级都包括排在他后面的所有级别中的日志。在实际设置过程中,如果设置的级别大于`error`,例如为`fatal`或`panic`,系统会默认将级别转为`error`。

日志级别`debug1`~`debug5`主要用于调试,生产环境不建议使用,否则发送给客户端的日志会增多。建议保持默认值`notice`。

确保服务器日志等级配置正确

参数`log_min_messages`控制按的等级将消息写入到服务器日志。有效的值包括`debug`、`debug5`、`debug4`、`debug3`、`debug2`、`debug1`、`info`、`log`、`notice`、`warning`、`error`、`fatal`、`panic`。其中`debug`和`debug2`等效,每个级别都包含排在他后面的所有级别中的信息。

日志级别`debug1`~`debug5`主要用于调试,生产环境不建议使用,否则写入服务器的日志会增多。建议保持默认值`warning`。

确保开启用户登录时日志记录功能

参数`log_connections`用于记录每次尝试连接到服务器的日志,以及成功完成客户端连接认证的日志。

开启`log_connections`可以记录所有用户登录尝试的日志,帮助管理员分析潜在的恶意连接或连接问题。但同时,由于会记录所有的连接尝试,可能会导致日志文件增长迅速,增加磁盘存储压力。

确保开启用户注销时日志记录功能

参数`log_disconnections`用于设置是否记录客户端结束连接的信息,包括在会话结束时在服务器日志中输出一行,并包含会话的持续时间。

开启`log_disconnections`参数有助于分析客户端连接的断开情况,包括断开原因和会话持续时间。同时,开启此参数可能会增加日志记录量,需要考虑到磁盘存储和日志管理的成本。

确保开启归档模式

参数`archive_mode`用于设置是否开启归档模式,该参数通常只建议当`wal_level`参数设置为`archive`时使用。当`wal_level`参数设置为`minimal`时,`archive_mode`参数无法使用。如果设置`archive_mode`参数为`on`,需要同时设置`archive_command`参数以指定归档WAL日志的命令。

开启归档模式后需要规划归档日志占用的磁盘空间。在日志归档过程中可能会对数据库性能产生影响。

确保文件权限掩码配置正确

在Linux运行环境中,创建文件的默认权限可通过文件权限掩码umask配置。为防止数据库文件被其他用户访问或篡改,应确保umask配置为0077,以确保只有数据库运行用户具有访问权限。umask值一般在`/etc/bashrc`、`/etc/profile`、`$HOME/.bash_profile`或`$HOME/.bashrc`中设置。

umask如果设置不合理,可能导致新建文件权限过小或过大,从而影响业务正常运行或导致安全风险。

意见反馈
编组 3备份
    openGauss 2024-12-12 00:55:08
    取消