由 John Doe 六月 6, 2025
你希望禁止数据库用户随意更改参数设置吗?现在,PostgreSQL 可以控制用户全局更改设置了。
特性提交日志
添加 allow_alter_system 参数。
该参数标记为 PGC_SIGHUP,因此只能在配置文件中设置,不能在其他任何地方设置;同时还标记为 GUC_DISALLOW_IN_AUTO_FILE,因此无法通过 ALTER SYSTEM 命令设置。当该参数设置为 false 时,将禁止使用 ALTER SYSTEM 命令。
此前存在一种担忧,认为该参数可能会被误解为一种安全特性,但实际上并非如此,因为蓄意的超级用户有多种方式绕过此限制。因此,我们在文档措辞上进行了大量工作,希望避免此类混淆。
讨论:http://postgr.es/m/CA%2BVUV5rEKt2%2BCdC_KUaPoihMu%2Bi5ChT4WVNTr4CD5-xXZUfuQw%40mail.gmail.com
示例
PostgreSQL 提供了一个内部选项来禁用 ALTER SYSTEM 命令。控制此功能的参数称为allow_alter_system
,默认情况下处于开启状态:
postgres=# \dconfig *alter_system*
List of configuration parameters
Parameter | Value
--------------------+-------
allow_alter_system | on
(1 row)
通过 ALTER SYSTEM 更改此参数没有多大意义,因此这显然会产生错误:
ALTER SYSTEM SET allow_alter_system = off;
ERROR: parameter "allow_alter_system" cannot be changed
如果您想改变这一点,您需要直接在配置文件中执行此操作:
$ echo "allow_alter_system=off" >> $PGDATA/postgresql.auto.conf
由于此参数可通过 SIGHUP 信号触发更改,因此简单的重新加载,即可使此更改生效:
select context from pg_settings where name = 'allow_alter_system';
context
---------
sighup
(1 row)
select pg_reload_conf();
pg_reload_conf
----------------
t
(1 row)
postgres=# \dconfig *alter_system*
List of configuration parameters
Parameter | Value
--------------------+-------
allow_alter_system | off
(1 row)
从现在开始,任何尝试使用 ALTER SYSTEM 更改系统配置的操作都将触发错误:
ALTER SYSTEM SET work_mem = '12MB';
ERROR: ALTER SYSTEM is not allowed in this environment
这对于配置由外部管理的系统(例如由 K8S 操作器或配置管理工具)来说是有意义的。
请注意,这不应该被视为一种安全特性,因为超级用户有其他方式来修改配置,例如通过执行 shell 命令。
非常不错的体验,感谢所有参与的社区人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/d3ae2a24f265a028f4b9e8df79ea7b075c6cf016