具有给定角色的PostgreSQL触发器

时间:2014-07-25 08:35:16

标签: postgresql roles plpython

我用Plpython做了一点PostgreSQL触发器。这个触发器对文件系统起了一点作用,创建并删除了我的一些文件。创建的文件由“postgres”unix用户拥有,但我希望它们由另一个用户拥有,让我们说foobar。触发器与用户“foobar”一起安装,并与用户“foobar”一起执行。

有没有办法使用PostgreSQL或Plpython的unix用户'foobar'执行SQL触发器? 我应该使用SET ROLE foobar吗?

使用SECURITY INVOKERSECURITY DEFINER似乎不够好。

2 个答案:

答案 0 :(得分:2)

&#39>角色'您的用户在Postgres中假设的是数据库的本地。您在数据库中的角色会强制执行数据库权限。所以,你可以说foobar可以运行这个存储过程,或选择这个表,Postgres将强制执行。如果使用SECURITY INVOKER创建过程,则意味着将使用当前登录的Postgres用户运行正在运行的过程。 SECURITY DEFINER表示将使用创建过程的角色运行该过程。无论哪种方式,如果你的程序在Postgres之外做任何事情(比如创建一个文件),它将作为启动Postgres的身份完成(如你所知)。就我而言,我有一个名为' postgres'的Unix用户。当我启动Postgres时,我就是那个用户。因此,创建的任何文件都将由' postgres'用户。

您没有告诉我们您的操作系统。 Windows将与* nix不同。这个答案适用于* nix。

你确实提到你的存储过程语言是plpython。因此,您可以创建该文件,然后在您的过程中创建该文件后更改其所有权。像:

import os
import pwd

f = open('/tmp/myfile','w')
f.write('hello')
f.close()
user_id = pwd.getpwnam("foobar").pw_uid    
os.chown('/tmp/myfile', user_id, -1)

假设运行Postgres的主机上有一个foobar用户,这应该可以工作。

-g

答案 1 :(得分:2)

您使操作系统用户和PostgreSQL用户感到困惑。

SECURITY DEFINER允许您运行函数作为定义 postgresql 用户。但无论PostgreSQL用户运行操作系统用户,后端服务器的运行方式始终如此 - 通常是操作系统用户postgres

按照设计,PostgreSQL服务器无法像其他操作系统用户那样运行操作系统命令或系统调用。那将是一个令人讨厌的安全漏洞。

但是,如果你想允许,你可以。你可以:

  • 授予postgres用户sudo权限,以便像其他用户一样运行部分或全部命令;或
  • 编写一个程序,以setuid权限运行,以执行您想要的操作,并授予postgres用户执行权限。

在任何一种情况下,运行这些程序的唯一方法是从不受信任的过程语言(如plpython或plperl)或C扩展程序启动它们。'

我们不清楚为什么要首先设置这样的文件所有权,但我怀疑它可能不是一个好主意。如果PostgreSQL客户端和服务器甚至不在同一台计算机上怎么办?如果该PostgreSQL用户没有操作系统用户,或者用户名不同,该怎么办?等。