Security Postgresql数据库对象安全性

Security Postgresql数据库对象安全性,security,postgresql,Security,Postgresql,我正在开发一个应用程序,它将使用postgreSQL数据库后端。我想防止用户看到一些db对象,尤其是存储过程实现等 “显而易见”(但可能是错误的)方法是将CRUD访问数据库的权限授予将拥有加密uname/pwd的特定用户 还有别的办法吗 注意:我的目标受众主要是非程序员,因此我不需要任何“牢不可破”的东西(假设存在这样的东西)。PostgreSQL不支持限制过程源代码、用户或数据库列表等的可见性。最好的做法是接受这一点,或者在C或PL/Java中实现该过程,在这两种语言中,以实现的复杂性大大增加

我正在开发一个应用程序,它将使用postgreSQL数据库后端。我想防止用户看到一些db对象,尤其是存储过程实现等

“显而易见”(但可能是错误的)方法是将CRUD访问数据库的权限授予将拥有加密uname/pwd的特定用户

还有别的办法吗


注意:我的目标受众主要是非程序员,因此我不需要任何“牢不可破”的东西(假设存在这样的东西)。

PostgreSQL不支持限制过程源代码、用户或数据库列表等的可见性。最好的做法是接受这一点,或者在C或PL/Java中实现该过程,在这两种语言中,以实现的复杂性大大增加为代价来检查该过程有些困难

通常,数据库/表所有者不应是数据库的日常操作用户。创建一个新用户并
仅授予它所需的权限

大多数系统目录都有默认的
SELECT
权限授予
public
,因此如果您确实想限制访问权限,则需要显式地
REVOKE
该访问权限,然后
GRANT
将其授予数据库所有者和任何其他应拥有该权限的用户。例如,如果要限制对过程源的访问,可能需要限制对
pg_proc
的访问。这样的方法是有限且脆弱的(root用户总是可以获得PostgreSQL超级用户访问权限,并且可以从中执行任何操作),但您已经说过,出于您的目的,这可能是可行的

不支持乱动系统目录,可能会导致JDBC、psql等中的元数据访问问题。请参阅。如果你把目录弄乱了,有些东西坏了,你就得保留下来


顺便说一句,如果您修改了目录,请尽量避免在此处询问有关手动修改目录的数据库的问题。至少要非常清楚地说明您弄乱了系统目录,以及您到底做了什么。如果可能,请先在未修改的数据库上重现该问题。

PostgreSQL不支持限制过程源代码、用户或数据库列表等的可见性。最好的做法是接受这一点,或者在C或PL/Java中实现该过程,在这两种语言中,以实现的复杂性大大增加为代价来检查该过程有些困难

通常,数据库/表所有者不应是数据库的日常操作用户。创建一个新用户并
仅授予它所需的权限

大多数系统目录都有默认的
SELECT
权限授予
public
,因此如果您确实想限制访问权限,则需要显式地
REVOKE
该访问权限,然后
GRANT
将其授予数据库所有者和任何其他应拥有该权限的用户。例如,如果要限制对过程源的访问,可能需要限制对
pg_proc
的访问。这样的方法是有限且脆弱的(root用户总是可以获得PostgreSQL超级用户访问权限,并且可以从中执行任何操作),但您已经说过,出于您的目的,这可能是可行的

不支持乱动系统目录,可能会导致JDBC、psql等中的元数据访问问题。请参阅。如果你把目录弄乱了,有些东西坏了,你就得保留下来


顺便说一句,如果您修改了目录,请尽量避免在此处询问有关手动修改目录的数据库的问题。至少要非常清楚地说明您弄乱了系统目录,以及您到底做了什么。如果可能的话,首先在未修改的数据库上重现该问题。

我可以忍受您提到的风险,所以这很好。我不熟悉系统目录,请您提供我需要键入的
REVOKE
命令。理想情况下,我还希望阻止任何人看到该数据库的可用用户。@Homunculusreticull我看到了我在上面链接的相关答案()。我记不清了,但我认为撤销pg_proc中的任何内容都会导致FKs崩溃和其他事情。基本上,Postgre不支持像Oralce、SQL Server和Enterprise DB这样隐藏对象实现。也许你可以用Java或C编写你的程序,也许你可以在编译Java或C代码之前使用一个模糊器来帮助隐藏它在做什么。@JustBob这是可能的;我当然会建议测试。您可以随时撤销对
pg_proc.prosrc
的访问权,或者更确切地说,撤销对
pg_proc
的访问权,然后将其授予除
pg_proc.prosrc
之外的所有列。当然,用C实现过程是一个更好的选择,但要做的工作要多得多。@HomunculusReticulli
pg_catalog
是一个模式,而不是一个表
pg_-proc
pg_-catalog
中的一个表,具有完全限定名
pg_-catalog.pg_-proc
。看见如果您不熟悉模式、privilege模型、priv的授予和撤销等,我不建议您弄乱系统目录。只要接受您的客户可以看到您的过程源代码即可。我不会给你一个复制粘贴的食谱,如果你弄乱了目录,你需要了解你在做什么。我可以忍受你提到的风险,所以这很好。我不熟悉系统目录,请您提供我需要键入的
REVOKE
命令。理想情况下,我还希望阻止任何人看到该数据库的可用用户。@Homunculusreticull我看到了我在上面链接的相关答案()。我记不清了,但我认为撤销pg_proc中的任何内容都会导致FKs崩溃和其他事情。基本上,Postgre不支持像Oralce、SQL Server和Enterprise DB这样隐藏对象实现。也许你可以用Java或C编写你的程序,也许你可以在那里使用一个可以在