最近都在做系统安全加固,今天跟大家分享下PostgresSQL的加固建议
PS:生产系统加固前,一定要进行验证后再上线
1. PostgreSQL数据库版本存在安全漏洞入侵防范
【描述】
postgresql存在以下版本存在漏洞,容易被入侵 :
1.PostgreSQL函数伪造可导致远程代码执行漏洞AVD-2018-1058
2.PostgreSQL空指针引用漏洞AVD-2016-5423
3.PostgreSQL任意代码执行漏洞AVD-2019-9193
4.PostgreSQL授权机制不正确 AVD-2021-20229
分别对应版本:
1:[9.3, 10.0)
2:[9, 9.1.22); 9.2.17; 9.3.13; 9.4.8; 9.5.3
3:[9.3,11.2)
4:[10.0, 10.16); [11.0, 11.11); [12.0, 12.6)
建议升级到最新的可用版本
【加固建议】
升级postgresql至最新可用版本,完成漏洞修复
2. 密码复杂度检查密码策略
【描述】
检查密码长度和密码是否使用多种字符类型
【加固建议】
安装pgsql自带的第三方库passwordcheck(如已安装请忽略)
#进入目录
cd ~/postgresql/contrib/passwordcheck
#执行命令进行安装
make clean && make && make install
#如无报错提示,则表明安装成功
在配置文件中修改shared_preload_libraries参数 :
#编辑配置文件
vi postgresql.conf
#新增配置项
shared_preload_libraries = 'passwordcheck'
#切换到数据库启动用户
su -postgres
#执行命令,使配置生效(pg_ctl默认在安装的bin目录下)
./pg_ctl -D $PGDATA restart
#检查是否配置成功
postgres=# CREATE USER TESTPASSWORD WITH PASSWORD '123';
#可以看到’ERROR: password is too short’提示密码过短,则表明配置成功
3. 确保撤销过多的管理特权用户权限分配
【描述】
关于PostgreSQL管理SQL命令,仅超级用户应具有特权提升。 PostgreSQL常规或应用程序用户不应具备此能力创建角色,创建新数据库,管理复制或执行任何其他操作被视为特权。 通常,普通用户只应被授予与管理应用程序相对应的特权:
DDL(创建表,创建视图,创建索引等)
DML(选择,插入,更新,删除)
此外,为DDL和DML创建单独的角色已经成为最佳实践。 给定一个名为“工资单”的应用程序,将创建以下用户:
payroll_owner
payroll_user
DML特权仅授予 “payroll_owner” 帐户,而DML特权将仅授予 “payroll_user” 帐户。 这样可以防止意外通过作为应用程序运行的应用程序代码创建/更改/删除数据库对象“ payroll_user”帐户
【加固建议】
1.进入postgresql数据库,执行查看用户
select usename from pg_user;
2.执行\du 用户名;分别查看用户权限,要求除超级用户,审计员,管理员外,尽可能的降低普通用户的权限
3.确保只有一个超级用户(例:postgres),普通用户的权限应比超级用户更低
4.找到您需要限制的用户(username),执行以下一条或多条命令进行权限限制
ALTER ROLE username NOSUPERUSER;
ALTER ROLE appuser NOCREATEROLE;
ALTER ROLE appuser NOCREATEDB;
ALTER ROLE appuser NOREPLICATION;
ALTER ROLE appuser NOBYPASSRLS;
ALTER ROLE appuser NOINHERIT;
4. 确保文件权限掩码正确入侵防范
【描述】
始终使用默认权限集创建文件。文件权限可以是通过应用称为umask的权限掩码进行限制。 Postgres用户帐户
应该使用umask 077拒绝对除所有者以外的所有用户帐户的文件访问。
【加固建议】
whoami
postgres
$ cd ~
$ ls -ld .{bash_profile,profile,bashrc}
$ echo "umask 077" >> .bash_profile
$ source .bash_profile
$ umask
0077
如上述示例,在~/.bash_profile, ~/.profile , ~/.bashrc的任意一个文件末尾添加umask 077并执行 source ~/.bash_profile | ~/.profile | ~/.bashrc使其生效在postgres用户下输入umask查看返回值验证,弱返回值为077或0077,则符合要求
5. 保已禁用“ debug_print_plan”文件权限
【描述】
debug_print_plan设置启用打印每个已执行查询的执行计划。
这些消息在LOG消息级别发出。除非您另有指示组织的日志记录策略,建议通过将其设置为off来禁用此设置。
【加固建议】
1.进入postgresql数据库,执行命令查看状态
show debug_print_plan;
2.执行命令进行关闭
alter system set debug_print_plan = 'off';
select pg_reload_conf();
6. 确保已禁用“ debug_print_rewrite”恶意代码防范( 需重启 )
【描述】
debug_print_rewrite设置允许为每个输出打印查询重写器输出
执行查询。这些消息在LOG消息级别发出。除非有指示
否则,根据您组织的日志记录策略,建议禁用此设置
通过将其设置为关闭
【加固建议】
1.进入postgresql数据库,执行命令查看状态
show debug_print_rewritten;
2.执行命令进行关闭
alter system set debug_print_rewritten = 'off';
select pg_reload_conf();
3.重复执行步骤1,查看状态是否为off(关闭) 请注意: 如果您的postgresql版本在9.3(或更早),请修改配置文件 postgresql.conf 中配置
debug_print_rewritten= 'off'
7. 确保已禁用“ debug_print_parse”安全审计( 需重启 )
【描述】
debug_print_parse设置启用为每次执行打印结果分析树
查询。 这些消息在LOG消息级别发出。 除非另有指示
您组织的日志记录策略,建议通过设置禁用此设置
关闭。
【加固建议】
1.进入postgresql数据库,执行命令查看状态
show debug_print_parse;
2.执行命令进行关闭
alter system set debug_print_parse = 'off';
select pg_reload_conf();
3.重复执行步骤1,查看状态是否为off(关闭) 请注意: 如果您的postgresql版本在9.3(或更早),请修改配置文件 postgresql.conf 中配置
debug_print_parse = 'off'
8. 确保正确设置了日志目标文件系统配置
【描述】
PostgreSQL支持多种记录服务器消息的方法,包括stderr,csvlog和syslog。 在Windows上,也支持eventlog。 这些中的一个或多个应该为服务器日志输出设置目的地。
【加固建议】
1.进入postgresql数据库,执行命令查看状态
show log_destination;
2.执行命令进行更改
alter system set log_destination = 'csvlog';
select pg_reload_conf();
3.重复执行步骤1,查看状态是否为’csvlog’
9.禁止以root用户直接启动数据库用户权限分配
【描述】
以postgres用户启动,降低数据库在系统中的权限占比
检查提示
【加固建议】
建议以postgres用户启动
10. 确保通过“主机” TCP/IP套接字登录已正确配置访问控制
【描述】
大量的身份验证方法可用于使用 TCP/IP 套接字,包括:
•信任
•拒绝
•md5
•scram-sha-256
•密码
•gss
•sspi
•身份
•pam
•ldap
•半径
•证书
方法trust,password和ident不能用于远程登录。 方法md5是最受欢迎,可以在加密和未加密会话中使用,但是容易受到数据包重播攻击。 建议使用scram-sha-256而不是md5。
使用gss,sspi,pam,ldap,radius和cert方法,但比md5更安全,取决于外部认证过程/服务的可用性,因此未包含在此基准测试中。
【加固建议】
在配置文件(pg_hba.conf)中如下配置
# TYPE DATABASE USER ADDRESS METHOD
host all postgres 127.0.0.1/32 scram-sha-256
配置文件路径可登录postgres数据库进行查看
show hba_file;
11. 建议修改数据库的默认端口入侵防范
【描述】
避免使用熟知的端口(如默认端口),降低被初级扫描的风险
【加固建议】
在配置文件(postgresql.conf)中修改端口 如:
port = 5433
PS: 修改后连接时也需更改对应端口




