角色让关系型数据库用户的权限授予与撤销变得更容易。与其为每个用户单独管理权限,不如为每个角色管理权限,并且所有更改都会应用到所有被分配了该角色的用户。组织通常会创建多个角色以满足各自的独特需求。
不过,大多数数据库都会预置一个名为 PUBLIC 的角色。在这篇博客中,我们将解释 PUBLIC 角色在 Oracle 中是什么意思,以及使用它的关键最佳实践。
Oracle 中的 PUBLIC 角色是什么?
PUBLIC 角色是一种特殊角色,所有数据库用户在创建时都会隐式继承。Oracle 11g 文档指出,PUBLIC 角色可供每一位数据库用户访问,因此授予给 PUBLIC 角色的所有权限和角色也同样可供每一位数据库用户访问。虽然管理员可以向特定用户发出命令来授予或撤销其 PUBLIC 角色,但这些命令不会产生实际效果;用户将始终拥有该角色。
需要注意的是,DBA_ROLES 视图不会列出 PUBLIC 角色:
SQL> SELECT * FROM DBA_ROLES WHERE ROLE =’PUBLIC’;
no rows selected
不过,通过查询 SYS.USER$ 表可以发现 PUBLIC 确实存在,并且其 type# 值为 0,表示它是一个角色:
SQL> SELECT user#, type#, name FROM SYS.USER$ WHERE type# = 0 ORDER BY 1;
从下面的示例可以看出:对所有数据库用户隐式分配 PUBLIC 角色的情况。将 CONNECT 权限授予 PUBLIC 角色后,新用户无需被显式授予该权限,也将继承该权限。
SQL> CREATE USER bob IDENTIFIED BY MyPassword;
SQL> conn bob/MyPassword;
PUBLIC 角色的最佳实践
不应将 PUBLIC 角色用于用户权限管理。换句话说,除非您的意图是将这些权限和角色授予所有当前数据库用户以及未来可能创建的任何新用户,否则切勿将权限或角色分配给 PUBLIC。
事实上,将权限和角色直接授予 PUBLIC 角色会被归类为 发现项 。该结论来自美国国防信息系统局(DISA):DISA Security Technical Implementation Guide(STIG)漏洞 ID V-61435 指出:不应将数据库或系统权限授予 PUBLIC;并且 V-61443 指出:不应将应用程序角色权限分配给 PUBLIC。
要理解原因,需要一些背景。在容器数据库(CDB)或可插拔数据库(PDB)环境中,有“公共角色(common roles)”和“本地角色(local roles)”的概念。在 CDB 中,公共角色在根(root)中创建,并且对所有当前和未来的容器都是已知的。在 PDB 环境中,本地角色仅对特定的 PDB 本地有效;它们只能在其被定义的那个 PDB 内使用。
不过,在 Oracle 多租户环境中,角色要复杂一些。默认情况下,Oracle 授予 PUBLIC 角色的所有权限都会在本地以及通常情况下被授予。根据 Oracle 的说法,权限不应当以通常方式授予 PUBLIC。换句话说,切勿在根(root)或 CDB 中向 PUBLIC 角色授予任何类型的权限。虽然可以在每个 CDB 中单独修改 PUBLIC 角色,但除非有必要,否则不建议这样做。
授予给 PUBLIC 角色的任何用户权限都可以在不产生不利后果的情况下撤销。但在撤销作为数据库创建一部分而授予 PUBLIC 角色的默认权限时,应当小心,因为这些权限可能会在未来的升级或打补丁过程中重新被授予。
如需帮助枚举所有 Oracle 角色和权限(包括 PUBLIC 角色),可以考虑投资第三方解决方案,例如 Netwrix StealthAUDIT。它可以直接开箱即用地生成详细的权限(entitlement)报告。
分享到
了解更多
关于作者
Kevin Joyce
产品管理总监
Netwrix 产品管理总监。Kevin 对网络安全充满热情,尤其致力于理解攻击者为利用组织环境所采用的策略与技术。凭借八年的产品管理经验,并专注于 Active Directory 和 Windows 安全,他将这种热情投入到帮助构建解决方案中,助力组织保护其身份、基础设施和数据。