是否可通过SQL而非修改pg_hba.conf限制PostgreSQL用户连接IP范围
PostgreSQL 原生CREATE ROLE/CREATE USER语法没有内置账号级别的IP访问限制配置项,自建部署场景下这类规则默认通过pg_hba.conf配置。针对AWS RDS这类无底层操作系统、配置文件操作权限的托管环境,可以通过以下两种纯SQL层面的方案实现限制,不需要修改pg_hba.conf:
方案1:登录钩子实时拦截(推荐)
该方案通过登录触发钩子在连接建立的第一时间做IP校验,非法连接会被直接拒绝,无绕过窗口,适配RDS托管环境。
- 首先在RDS自定义参数组中,将
pg_login_hook加入shared_preload_libraries参数列表,重启实例生效(该扩展为RDS官方支持的内置扩展,不需要手动上传安装包) - 以rds_superuser权限账号执行以下SQL,创建IP校验函数:
CREATE OR REPLACE FUNCTION check_user_ip_access() RETURNS void AS $$ BEGIN -- 仅对需要做IP限制的账号触发校验,不要加入rdsadmin、postgres等系统账号 IF CURRENT_USER IN ('restricted_user1', 'restricted_user2') THEN -- 替换为实际允许访问的CIDR段,可按需追加多条规则 IF NOT ( inet_client_addr() <<= '192.168.1.0/24'::inet OR inet_client_addr() <<= '10.0.0.0/8'::inet ) THEN RAISE EXCEPTION 'Connection from IP % is not allowed for current user', inet_client_addr(); END IF; END IF; END; $$ LANGUAGE plpgsql SECURITY DEFINER; -- 开放函数执行权限给所有用户 GRANT EXECUTE ON FUNCTION check_user_ip_access() TO PUBLIC;
- 在自定义参数组中设置
pg_login_hook.function_name参数值为check_user_ip_access,重载参数生效即可,不需要再次重启实例。
方案2:定时巡检终止非法连接(无重启、无额外参数配置)
如果不想调整参数组、重启实例,可以通过RDS内置的pg_cron扩展做短周期巡检,发现非法连接直接终止,全程仅需执行SQL配置:
- 以rds_superuser权限账号执行SQL启用pg_cron扩展:
CREATE EXTENSION IF NOT EXISTS pg_cron;
- 创建非法连接清理函数:
CREATE OR REPLACE FUNCTION terminate_illegal_user_connections() RETURNS void AS $$ BEGIN PERFORM pg_terminate_backend(pid) FROM pg_stat_activity WHERE -- 替换为需要限制的账号列表 usename IN ('restricted_user1', 'restricted_user2') -- 排除当前巡检自身连接 AND pid <> pg_backend_pid() -- 替换为实际允许的CIDR段,可按需追加 AND NOT ( client_addr <<= '192.168.1.0/24'::inet OR client_addr <<= '10.0.0.0/8'::inet ); END; $$ LANGUAGE plpgsql SECURITY DEFINER;
- 配置定时任务,每秒执行一次巡检清理:
SELECT cron.schedule( 'kill-illegal-connections', '1 second', 'SELECT terminate_illegal_user_connections();' );
该方案存在最多1秒的延迟,非法连接建立后会在1秒内被强制断开,无法做到完全实时拦截,适合对实时性要求不高的场景。
注意事项
- 所有CIDR匹配直接使用PostgreSQL内置的
<<=(网段包含)操作符即可,支持标准CIDR格式,不需要额外编写IP解析逻辑 - 校验/清理函数必须添加
SECURITY DEFINER标记,保证低权限用户连接时函数可以正常执行 - 不要对rdsadmin、postgres等RDS系统内置账号配置IP限制,避免实例管理功能异常
内容的提问来源于stack exchange,提问作者tom10271
相关产品推荐
相关产品推荐

