PostgreSQL 17: 添加 allow_alter_system 参数

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