克里斯托夫·佩图斯:检查您的权限
内容提要
PostgreSQL角色和权限系统可能会令人惊讶。除非授予特定权限,否则任何人都可以执行函数。新函数的默认权限是任何人都可以执行。为了修复这个问题,撤销对PUBLIC的授权并修改新函数的默认权限。请注意默认权限并相应地进行调整。
延伸解读
REVOKE 的常见误解
许多用户以为 REVOKE 会创建一个“禁止”条目,但 PostgreSQL 的权限系统并非如此。REVOKE 只是移除已存在的权限条目,如果目标角色没有显式授权,REVOKE 不会产生任何效果。在示例中,对 lowpriv 的 REVOKE 就是空操作,因为 lowpriv 从未被显式授予 EXECUTE。理解这一点可以避免误以为权限已被限制。
PUBLIC 角色的默认权限
新创建的函数默认授予 PUBLIC 角色 EXECUTE 权限,这意味着所有角色都可以执行该函数,除非显式撤销。PUBLIC 是一个特殊角色,代表所有角色。因此,即使没有为某个用户单独授权,该用户也可能通过 PUBLIC 获得权限。检查 pg_proc 中的 proacl 字段时,没有角色名的条目就表示 PUBLIC。
修改默认权限的注意事项
使用 ALTER DEFAULT PRIVILEGES 可以修改未来创建对象的默认权限,例如撤销 PUBLIC 对新函数的 EXECUTE 权限。但这一操作只影响指定角色(如 owner)未来创建的函数,不会改变现有函数的权限,也不会影响其他角色创建的函数。因此,在调整默认权限后,仍需单独处理已有函数。
Q&A
PostgreSQL的权限系统有什么特别之处?
PostgreSQL的角色和权限系统可能会令人惊讶,尤其是新创建的函数默认权限是任何人都可以执行。
如何限制特定用户执行函数的权限?
可以通过撤销对PUBLIC的EXECUTE权限,并为特定用户授予EXECUTE权限来限制其他用户的执行权限。
REVOKE命令在PostgreSQL中是如何工作的?
REVOKE命令不会创建新的权限条目,而是移除已存在的权限,如果没有匹配的权限条目,REVOKE将无效。
如何修改新函数的默认权限?
可以使用ALTER DEFAULT PRIVILEGES命令来修改新函数的默认权限,撤销对PUBLIC的EXECUTE权限。
为什么低权限用户仍然可以执行函数?
因为新函数默认将EXECUTE权限授予PUBLIC角色,低权限用户可以在没有明确限制的情况下执行该函数。
修改默认权限会影响现有函数吗?
不会,修改默认权限只会影响新创建的函数,不会改变现有函数的权限。