很多运维和开发都遇到过这样的场景:
业务要上地图功能,一句「给我开下PostGIS」,你随手一授权,结果报错:权限不足,必须超级用户才能创建插件。
开发者一句:「就用5分钟,给我超级权限行不行?」
你敢点头吗?
给超级用户,等于把数据库“家门钥匙+保险柜密码”直接交出去,一个误操作、一个恶意脚本,整库崩溃、数据泄露都可能发生。
不给,业务卡进度,开发催到崩溃。
PostgreSQL插件,看似方便,实则藏着一个超级用户陷阱。
一边是业务效率,一边是生产安全,无数DBA就在这两难里反复踩坑。
更关键的是:PostgreSQL不是故意刁难,而是插件本身,真的“危险等级”不一样。
二、核心拆解:为什么创建插件,非要超级用户?
1、信任插件 vs 非信任插件
PostgreSQL 13之后,把插件分成了两类,权限天差地别:
① 信任插件(安全)
只运行SQL层面函数,不碰系统底层,不会威胁服务器。
比如:pgcrypto、uuid-ossp、tablefunc、citext。
只要有数据库CREATE权限,普通用户就能装。

② 非信任插件(高危)
会直接加载C语言动态库(.so文件),跑在数据库内核里。
比如:PostGIS、file_fdw、dblink。
一旦库有漏洞或被篡改,可以:
- 直接搞崩数据库
- 读取系统敏感文件
- 绕过数据库权限校验
所以PG强制规定:只有超级用户能装。
2、最常见坑:PostGIS安装难题
PostGIS是地理信息标配,但极度依赖底层C++库。
普通用户执行:
CREATE EXTENSION postgis;直接被拦截。
业务要跑,安全要守,怎么办?
下面两套方案,生产、开发环境全覆盖,不给超级权限,也能正常用插件。
三、实战方案:两种安全架构,告别超级用户陷阱
方案一:生产环境 —— DBA手动管控(最稳)
生产环境不允许动态乱装插件,由DBA统一操作。
1、DBA用管理员账号创建插件
CREATE EXTENSION IF NOT EXISTS postgis SCHEMA public;2、开放PostGIS必需表权限
GRANT SELECT ON TABLE spatial_ref_sys TO developer_user;3、开放Schema使用权限
GRANT USAGE ON SCHEMA public TO developer_user;优点:绝对安全、可控。
缺点:每次都要DBA介入,不适合频繁重置的开发环境。
方案二:开发/测试环境 —— 专用插件管理员模式(最高效)
思路:不给开发者超级权限,只开放一个“白名单安装函数”。
全程不用默认postgres超级账号,安全又好审计。
步骤1:创建专用插件管理员账号
CREATE USER extension_admin WITH PASSWORD 'VeryStrongPassword123!';ALTER USER extension_admin WITH SUPERUSER;步骤2:创建安全安装函数(白名单机制)
CREATE OR REPLACE FUNCTION admin_tools.safe_install_extension(ext_name text)RETURNS voidLANGUAGE plpgsqlSECURITY DEFINERAS $$DECLARE allowed_extensions text[] := ARRAY['postgis', 'postgis_topology', 'pg_trgm', 'uuid-ossp'];BEGIN IF ext_name = ANY(allowed_extensions) THEN EXECUTE format('CREATE EXTENSION IF NOT EXISTS %I CASCADE', ext_name); RAISE NOTICE 'Extension % installed successfully by Extension Admin.', ext_name; ELSE RAISE EXCEPTION 'Permission Denied: % is not on the allowed whitelist.', ext_name; END IF;END;$$;ALTER FUNCTION admin_tools.safe_install_extension(text) OWNER TO extension_admin;步骤3:只给开发者执行这个函数的权限
REVOKE EXECUTE ON FUNCTION admin_tools.safe_install_extension(text) FROM PUBLIC;GRANT EXECUTE ON FUNCTION admin_tools.safe_install_extension(text) TO developer_user;开发者最终用法
SELECT admin_tools.safe_install_extension('postgis');不在白名单里的插件,一律装不了,彻底杜绝风险。
四、辩证思考:安全与效率,真的只能二选一?
很多团队陷入极端:
要么图省事,全员超级用户,一出问题全锅甩给数据库;
要么死守安全,开发装个插件要等半天,效率极低。
PostgreSQL的严格不是累赘,而是底线防护。
非信任插件能操作内核,这不是权限问题,是生死问题。
但安全,不代表一定要牺牲效率。
专用插件管理员 + 白名单函数,就是中间最优解:
- 内核级风险被锁住
- 开发可以自助装业务必需插件
- 所有操作有账号、有日志、可审计
真正的架构设计,从来不是“要么全放,要么全禁”,而是精准放权。
五、现实意义:DBA和开发,都该升级这套思路
对DBA:
不用再半夜被喊起来装插件,不用再纠结要不要给超级权限,一套架构,长期省心。
对开发:
不用再苦等权限,不用再提“危险需求”,合规自助,不背锅。
对企业:
避免因插件权限导致的生产事故,降低数据泄露、服务崩溃的风险。
很多人以为PostgreSQL难用、权限死板,其实是没摸到它的安全设计逻辑。
用好插件管理员模式,你会发现:
安全和敏捷,完全可以兼得。
六、互动话题
你在工作中遇到过「插件权限卡死」的问题吗?
你们公司是直接给超级用户,还是有更安全的方案?
评论区聊聊,互相避坑!