不可变角色和权限

不可变权限对于限制那些本身可以管理 权限 的用户的操作非常有用。不可变角色对于提供系统角色(表现为 DBMS 的永久组成部分)非常有用。

仅应在变更极少的场景下使用不可变权限和角色。它们被设计为难以修改,因此在进行更改时应保持谨慎(例如,当 DBMS 已通过其他方式隔离且可以可靠地防止未经授权的访问时)。通常,此类修改应仅在 DBMS 的调试阶段执行一次。

管理不可变角色和权限

在确保 DBMS 与外部连接安全隔离后,请遵循以下步骤来管理不可变角色和权限:

  1. 将配置设置 dbms.security.auth_enabled 更改为 false

  2. 重启 DBMS。

  3. 像创建或移除普通权限和角色一样创建或移除不可变权限和角色,但需额外添加 IMMUTABLE 关键字。参见 示例

  4. 将配置设置 dbms.security.auth_enabled 改回 true

  5. 重启 DBMS。

以这种方式创建的权限和角色现在显示为 DBMS 的不可变部分。如果您想要更改或移除它们,必须重复将 dbms.security.auth_enabled 设置为 false 的过程。

示例

以下示例演示了如何使用 Cypher 来管理不可变角色和权限。

限制可管理权限的用户的操作

为了防止所有用户(包括那些拥有 PRIVILEGE MANAGEMENT 权限的用户)执行数据库管理操作,请将不可变权限附加到 PUBLIC 角色。PUBLIC 角色隐含且不可撤销地适用于所有用户。

  1. 确保您已完成 管理不可变角色和权限 中的步骤 1 和 2。

  2. 运行以下命令以拒绝 PUBLIC 角色的 IMMUTABLE DATABASE MANAGEMENT 权限:

    DENY IMMUTABLE DATABASE MANAGEMENT ON DBMS TO PUBLIC
  3. 验证 IMMUTABLE 关键字是否已添加到权限中:

    SHOW PRIVILEGES WHERE IMMUTABLE
    表 1. 结果
    access(访问) action(动作) resource(资源) graph(图) segment role(角色) immutable(不可变)

    "DENIED"

    "database_management"

    "database"

    "*"

    "database"

    "PUBLIC"

    true

    行:2

    结果显示,所有用户都被禁止添加或移除权限,包括 admin 用户。

  4. 确保您已完成 管理不可变角色和权限 中的步骤 4 和 5。

创建不可更改的永久角色

您可以使用不可变角色来创建永久的内置系统角色,即使是拥有 ROLE MANAGEMENT 权限 的用户也无法修改这些角色。

例如,您想要创建一个 analyst 角色,该角色不能被删除、重命名,其权限也不能被更改(即使是拥有 ROLE MANAGEMENTPRIVILEGE MANAGEMENT 权限的用户也无法操作)。

  1. 确保您已完成 管理不可变角色和权限 中的步骤 1 和 2。

  2. 创建一个不可变角色以容纳不可变权限:

    CREATE IMMUTABLE ROLE analyst
  3. 不可变地授予 MATCH 权限:

    GRANT IMMUTABLE MATCH {*} ON GRAPH * ELEMENTS * TO analyst
  4. 确保您已完成 管理不可变角色和权限 中的步骤 4 和 5。

    现在,即使是拥有 ROLE MANAGEMENTPRIVILEGE MANAGEMENT 权限的用户,也无法执行以下任何操作:

    删除 analyst 角色
    DROP ROLE analyst
    analyst 角色中撤销 MATCH 权限
    REVOKE MATCH {*} ON GRAPH * ELEMENTS * FROM analyst
    重命名 analyst 角色
    RENAME ROLE analyst TO dataReader

虽然不可变角色的组成(名称、存在性、关联权限)是不可变的,但它们对用户的分配并非不可变。这意味着任何拥有 ROLE MANAGEMENT 权限的用户依然可以将不可变角色授予用户,或将其从用户身上撤销。

只有不可变权限(例如上述示例中的 GRANT IMMUTABLE MATCH {*} ON GRAPH * ELEMENTS * TO analyst)才能分配给不可变角色。这是为了确保不可变角色及其所有权限是明确且完全不可变的。