You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否可通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:15:31