PostgreSQL中空默认权限的奇怪行为

PostgreSQL中空默认权限的奇怪行为

💡 原文英文,约1400词,阅读约需5分钟。
📝

内容提要

PostgreSQL默认对某些对象类型授予PUBLIC权限,但表和列等对象不授予。函数的默认权限为EXECUTE,即使撤销默认权限,新创建的函数仍会继承EXECUTE权限。可以通过ALTER DEFAULT PRIVILEGES命令管理权限。建议创建一个“nobody”角色以控制权限继承,防止不必要的访问。

🎯

关键要点

  • PostgreSQL默认对某些对象类型授予PUBLIC权限,但表和列等对象不授予。

  • 函数的默认权限为EXECUTE,新创建的函数仍会继承EXECUTE权限。

  • 可以通过ALTER DEFAULT PRIVILEGES命令管理权限。

  • 建议创建一个'nobody'角色以控制权限继承,防止不必要的访问。

  • pg_catalog.pg_proc目录存储函数和过程的信息,包括访问权限。

  • ALTER DEFAULT PRIVILEGES允许设置未来创建对象的权限,不影响已存在对象的权限。

  • 内置默认权限的行为可能导致意外的访问权限,需谨慎管理。

  • 建议通过撤销所有默认权限并将其授予'nobody'角色来控制权限继承。

  • 可以通过创建示例数据库和函数来重现默认权限的奇怪行为。

🔎

延伸解读

默认权限的安全隐患

PostgreSQL的内置默认权限可能导致意外的访问权限,尤其是对于函数的EXECUTE权限。尽管这些权限在某些情况下并不直接构成安全风险,但仍需谨慎管理,以防止未授权访问。用户应定期审查和调整权限设置,确保符合最小权限原则。

创建'nobody'角色的意义

建议创建一个'nobody'角色以控制权限继承,这一做法可以有效防止新创建对象自动继承不必要的权限。通过将默认权限授予此角色,用户可以确保权限管理更加集中和安全,避免不必要的访问风险。

ALTER DEFAULT PRIVILEGES的使用

使用ALTER DEFAULT PRIVILEGES命令可以灵活管理未来创建对象的权限,但需注意,该命令不会影响已存在对象的权限。因此,在进行权限调整时,用户应同时考虑现有对象的权限设置,以避免潜在的安全漏洞。

延伸问答

PostgreSQL默认对哪些对象类型授予PUBLIC权限?

PostgreSQL默认对数据库、函数和过程等对象类型授予PUBLIC权限,但表和列等对象不授予。

如何管理PostgreSQL中的默认权限?

可以使用ALTER DEFAULT PRIVILEGES命令来管理PostgreSQL中的默认权限。

为什么新创建的函数仍然继承EXECUTE权限?

即使撤销所有默认权限,新创建的函数仍会继承EXECUTE权限,这是PostgreSQL的内置行为。

如何防止PostgreSQL中的不必要权限继承?

建议创建一个'nobody'角色,并撤销所有默认权限,将其授予该角色,以控制权限继承。

pg_catalog.pg_proc目录的作用是什么?

pg_catalog.pg_proc目录存储函数和过程的信息,包括它们的访问权限。

如何重现PostgreSQL中默认权限的奇怪行为?

可以通过创建示例数据库和函数,并检查默认权限的状态来重现这一行为。

🏷️

标签

➡️

继续阅读