文章目录
- 前言
- 一、检查配置
- 二、加固建议
- 总结
前言
数据库管理包括使用PostgreSQL控制用户数和用户会话数的能力。与PostgreSQL无限制的并发连接可以通过耗尽连接资源来成功进行拒绝服务(DoS)攻击,并且系统也可能因合法用户的过载而失败。因此,限制每个用户的并发会话数有助于降低这些风险。
一、检查配置
1、检查数据库允许的连接总数,请以数据库管理员身份运行以下SQL:
# 切换至postgres数据库
su - postgres
# 查看postgresql.conf配置的最大连接数
psql -c 'SHOW max_connections;'
2、要检查每个角色允许的连接数量,请以数据库管理员身份运行以下SQL:
# 切换至postgres数据库
su - postgres
# 查看pg_authid系统表信息
psql -c 'SELECT rolname, rolconnlimit from pg_authid'
如果任何角色配置的连接数为-1(不限制),则存在安全风险。
pg_authid系统表字段说明:
oid:行标识符(隐藏属性; 必须明确选择)
rolname:角色名称
rolsuper:角色拥有超级用户权限
rolinherit:角色自动继承其所属角色的权限
rolcreaterole:角色可以创建更多角色
rolcreatedb:角色可以创建数据库
rolcatupdate:角色可以直接更新系统表。如果没有设置这个字段为真,即使超级用户也不能这么做。
rolcanlogin:角色可以登录,也就是说,这个角色可以给予会话认证标识符。
rolreplication:角色是一个复制的角色。
rolconnlimit:对于可以登录的角色,限制其最大并发连接数量。-1 表示没有限制。
rolpassword:口令(可能是加密的);如果没有则为 NULL。如果密码是加密的,该字段将以md5 字符串开始,后面跟着一个32字符的十六进制MD5哈希值。
rolvaliduntil:口令失效时间(只用于口令认证);如果没有失效期,则为 null。
二、加固建议
1、配合合适的最大连接数
要配置允许数据库的最大连接数,以数据库管理员(此处显示为“postgres”)身份,请在postgresql.conf中更改,以下内容(值200是示例;设置值以适合业务需要):
# 切换至postgres数据库
su - postgres
# 膝盖配置文件
vi ${PGDATA?}/postgresql.conf
修改配置后需要重启或重新加载配置文件。
# 重启数据库
pg_ctl restart
# 重新加载配置文件
pg_ctl reload
2、限制角色允许的最大连接数
要限制特定角色允许的连接数,请以数据库管理员身份运行以下SQL:
psql -c“ALTER ROLE <rolname> CONNECTION LIMIT 10”;
如下图,admin1角色(账户)被修改为最大并发数为10.
总结
必须在PostgreSQL中配置或添加限制每个用户的并发会话数的功能(例如,通过使用登录触发器)。请注意,仅通过Web服务器或应用程序服务器限制会话是不够的,因为合法用户和攻击者可能通过其他方式连接到PostgreSQL。