insert_username()函数可以用于Postgres中的审计目的吗?

时间:2015-08-21 09:26:09

标签: postgresql

我有需要审核Postgres中的表格的情况。

但是在Postgres中没有可以从中获得操作系统用户的功能或方法。

请建议我如何在Postgres或EDB中获得操作系统用户。

此外,pg_available_extensions表格中的扩展名为insert_username

这可以用来获取OS用户。如果是,可以如何使用。

2 个答案:

答案 0 :(得分:1)

对于一般情况,你不能,因为PostgreSQL通过网络套接字与客户端通信。没有可靠的方法来确定来自远程主机的TCP / IP连接的操作系统用户名。

对于unix域套接字,可以要求连接用户与使用peer模式身份验证的PostgreSQL用户相同。 PostgreSQL没有将客户端操作系统用户名从unix域套接字暴露给SQL,因此如果你使用其他身份验证方法,即使它们通过unix域套接字连接,你也很容易找到他们的用户名。

对于环回TCP / IP连接,主机操作系统可能会运行一个identd,尽管这几天几乎没有。这可能允许PostgreSQL向对方询问用户名是什么。它通过ident auth方法支持此功能,但与peer类似,一旦用户连接,您就无法从SQL请求操作系统用户名。

对于其他用户,您无法可靠地找出他们在主机操作系统上的用户。您只需要相信客户告诉您的内容,并且修改客户端以便撒谎是微不足道的。

您甚至无法使用C扩展函数获取此信息,因为PostgreSQL在身份验证完成后无法记住它,并且对于大多数身份验证方法,它从不首先向客户端询问它。这将需要协议更改。由于客户端只能说谎主机操作系统用户名,所以似乎没有多大意义。

如果要验证客户端身份,SSL客户端证书或Kerberos(SSPI,在Windows上)身份验证将是更好的选择。

答案 1 :(得分:0)

您将不得不依赖于在会话/事务上下文变量中提供信息的客户端,例如使用Postgres' SET command

SET LOCAL audit.AUDIT_USER = 'whatever-you-like';

This answer to a related question介绍了如何基于此实现审核。

如果您的客户端是Java应用程序,您可能还希望使用上述方法查看实现INSERTED_BY / UPDATED_BY审核的demo Gist