如何创建一个访问受限、没有插入更新但可以执行重新索引和备份等维护任务的 postgres 角色?

Posted

技术标签:

【中文标题】如何创建一个访问受限、没有插入更新但可以执行重新索引和备份等维护任务的 postgres 角色?【英文标题】:How can I make a postgres role that has limited access, no insert update, but can do maintenance tasks like reindex and backups? 【发布时间】:2015-06-05 21:56:18 【问题描述】:

我在各地的计算机上都安装了带有我的 Windows 桌面应用程序的 postgres 9.3。我不希望 Joe Script-kiddy 看着 pgpass.conf,在我的数据库中获取 postgres 密码。

我能够使用this article 来担任备份角色,但我在使用 reindexdb 和 Vacuum Analyze 时运气不佳。

到目前为止,我的解决方案是编写一个应用程序,该应用程序将采用加密的 vbscript 文件并使用 ado 连接和运行。

我已经阅读了有关授权和角色的 PG 帮助,但我不知道如何执行此操作。我会很感激任何想法。

Neil McGuigan 的建议适用于重新索引和分析。我需要在循环中重新索引每个表。如果我只是尝试重新索引数据库 myDb,我会得到无法从函数或多命令字符串执行 EINDEX DATABASE。我在使用真空 [table] 时遇到同样的错误

我仍在使用dblink 作为可能的解决方案。 ..好吧,我不能使用dblink,因为它需要密码,所以我必须将密码编码到函数中,并且由于我的备份角色已经选择它可以查看函数的内容。

所以我有一个低特权角色,备份,它可以备份、分析和重新索引,但不能清理。对我来说似乎很奇怪。

【问题讨论】:

【参考方案1】:

您始终可以将命令包装在函数中。使用其定义者的权限运行该函数。将执行权限授予其他人。示例:

set role roleThatOwnsTable1;

/*
 SECURITY DEFINER tells Postgres to run the function with the privileges of the role that 
 defined the function, as opposed to the privileges of the role that invoked the function.
*/
create or replace function reindexTable1() returns void SECURITY DEFINER language plpgsql as $$
begin
  reindex table table1;
end $$;

grant execute on function reindexTable1() to someGuy;

set role someGuy;

select reindexTable1();

当然,这确实会向通常不应该拥有该功能的人开放该功能,所以要小心。

【讨论】:

谢谢,这适用于重新索引和分析。我把它放在一个循环中以获取所有表,因为我不能使用重新索引数据库 myDb。我得到 REINDEX DATABASE 无法从函数或多命令字符串执行。我对真空也有同样的问题。我不知道如何运行真空 此方法是否适用于从表中删除行?同样,我不想为角色备份提供超出其需要的任何内容。我有一个由 postgres 拥有的函数,并被授予执行备份,但是当该函数试图从表备份中删除行时,我的权限被拒绝,只有选择。我认为通过将 delete 包装在 postgres 拥有的函数中,备份将能够运行它 @RonH 应该是一样的。 Row Security 即将在 9.5 中推出,但可能会有所改变 我错过了 SECURITY DEFINER 与 SECURITY INVOKER 的重要性。我没有用 SECURITY DEFINER 定义它,这就是它对我不起作用的原因。 这是 Postgres 中积累的技术债务的一个非常有趣的例子。很有帮助的答案。

以上是关于如何创建一个访问受限、没有插入更新但可以执行重新索引和备份等维护任务的 postgres 角色?的主要内容,如果未能解决你的问题,请参考以下文章

受限路由 JWT

如何在受限沙箱中运行 java 代码(无网络、文件系统访问)

如何创建应用程序受限文件夹

如何使用 VBA 执行插入/更新记录的存储过程?

如何在fetch then / response函数中访问请求对象

如何创建表的回滚副本以防我插入或更新错误