授权


Red Hat Developer Hub 1.2

在 Red Hat Developer Hub 中使用基于角色的访问控制(RBAC)配置授权

Red Hat Customer Content Services

摘要

作为 Red Hat Developer Hub 平台工程师,您可以使用基于角色的访问控制(RBAC)来管理其他用户的授权,以满足您机构的特定需求。

第 1 章 Red Hat Developer Hub 中的基于角色的访问控制(RBAC)

基于角色的访问控制是一种安全范式,限制对授权用户的访问。此功能包括定义具有特定权限的角色,然后将这些角色分配给用户。

Red Hat Developer Hub 使用 RBAC 来提高平台中的权限系统。Developer Hub 中的 RBAC 功能引入了管理员角色,并通过促进有效的访问控制来利用机构结构,包括团队、组和用户。

第 2 章 Red Hat Developer Hub 中的权限策略

Red Hat Developer Hub 中的权限策略是一组规则,用于管理对资源或功能的访问。这些策略基于其角色来说明授予用户的授权级别。实施权限策略,以维护给定环境中的安全性和保密性。

您可以在 Developer Hub 中定义以下类型的权限:

  • 资源类型
  • 基本的

两种权限类型之间的区别取决于权限是否包含定义的资源类型。

您可以使用关联的资源类型或权限名称来定义资源类型权限,如下例所示:

资源类型权限定义示例

p, role:default/myrole, catalog.entity.read, read, allow
g, user:default/myuser, role:default/myrole

p, role:default/another-role, catalog-entity, read, allow
g, user:default/another-user, role:default/another-role
Copy to Clipboard

您可以使用权限名称在 Developer Hub 中定义基本权限,如下例所示:

基本权限定义示例

p, role:default/myrole, catalog.entity.create, create, allow
g, user:default/myuser, role:default/myrole
Copy to Clipboard

Developer Hub 支持以下权限策略:

目录权限
Name资源类型policy描述

catalog.entity.read

catalog-entity

读取

允许从目录中读取用户或角色

catalog.entity.create

 

create

允许用户或角色创建目录实体,包括在目录中注册现有组件

catalog.entity.refresh

catalog-entity

update

允许用户或角色从目录中刷新单个或多个实体

catalog.entity.delete

catalog-entity

delete

允许用户或角色从目录中删除单个或多个实体

catalog.location.read

 

读取

允许用户或角色从目录中读取单个或多个位置

catalog.location.create

 

create

允许用户或角色在目录中创建位置

catalog.location.delete

 

delete

允许用户或角色从目录中删除位置

Scaffolder 权限
Name资源类型policy描述

scaffolder.action.execute

scaffolder-action

 

允许从模板执行操作

scaffolder.template.parameter.read

scaffolder-template

读取

允许用户或角色从模板中读取单个或多个参数

scaffolder.template.step.read

scaffolder-template

读取

允许用户或角色从模板读取单个或多个步骤

scaffolder.task.create

 

create

允许用户或角色触发软件模板,以创建新的构建程序任务

scaffolder.task.cancel

  

允许用户或角色取消当前运行的构建程序任务

scaffolder.task.read

 

读取

允许用户或角色读取所有构建器任务及其关联的事件和日志

RBAC 权限
Name资源类型policy描述

policy.entity.read

policy-entity

读取

允许用户或角色读权限策略和角色

policy.entity.create

policy-entity

create

允许用户或角色创建单个或多个权限策略和角色

policy.entity.update

policy-entity

update

允许用户或角色更新单个或多个权限策略和角色

policy.entity.delete

policy-entity

delete

允许用户或角色删除一个或多个权限策略和角色

Kubernetes 权限
Name资源类型policy描述

kubernetes.proxy

  

允许用户或角色访问代理端点

OCM 权限
Name资源类型policy描述

ocm.entity.read

 

读取

允许从 OCM 插件读取用户或角色

ocm.cluster.read

 

读取

允许用户或角色读取 OCM 插件中的集群信息

拓扑权限
Name资源类型policy描述

topology.view.read

 

读取

允许用户或角色查看拓扑插件

kubernetes.proxy

  

允许用户或角色访问代理端点,允许他们读取 RHDH 中的 pod 日志和事件

2.1. 权限策略配置

在 Red Hat Developer Hub 中配置权限策略的方法有两种,包括:

  • 配置权限策略管理员
  • 配置外部文件中定义的权限策略

2.1.1. 配置权限策略管理员

Developer Hub 中用户和组的权限策略由权限策略管理员管理。只有权限策略管理员才能访问基于角色的访问控制 REST API。

配置策略管理员的目的是启用特定、有限的经过身份验证的用户来访问 RBAC REST API。权限策略在 policy.csv 文件中定义,该文件在 app-config-rhdh ConfigMap 中被引用。OpenShift 平台管理员或集群管理员可以执行此任务,并可访问部署 Red Hat Developer Hub 的命名空间。

您可以通过配置 app-config.yaml 文件来启用权限策略管理员,如下所示:

permission:
  enabled: true
  rbac:
    admin:
      users:
        - name: user:default/joeuser
Copy to Clipboard

权限策略角色(role:default/rbac_admin)在 Developer Hub 中是一个默认角色,在创建时包括一些权限,如创建、读取、更新和删除权限策略/角色,以及从目录中读取。

如果默认权限不适合您的要求,您可以使用相关权限策略根据您的要求定义新的管理员角色。另外,您可以使用可选的 superUsers 配置值,该值在 Developer Hub 间授予不受限制的权限。

您可以在 app-config.yaml 文件中设置 superUsers,如下所示:

# ...
permission:
  enabled: true
  rbac:
    admin:
      superUsers:
        - name: user:default/joeuser
        # ...
Copy to Clipboard

2.1.2. 配置外部文件中定义的权限策略

您可以在启动 Red Hat Developer Hub 前配置权限策略。如果在外部文件中定义了权限策略,您可以在 Developer Hub 中导入同一文件。您必须使用以下 Casbin 规则格式定义权限策略:

---
`p, <ROLE>, <PERMISSION_NAME or PERMISSION_RESOURCE_TYPE>, <PERMISSION_POLICY_ACTION>, <ALLOW or DENY>`
---
Copy to Clipboard

您可以使用以下 Casbin 规则格式定义角色:

---
`g, <USER or GROUP>, <ROLE>`
---
Copy to Clipboard
注意

有关 Casbin 规则格式的详情,请参考 Casbin 规则的基本

以下是权限策略配置示例:

---
`p, role:default/guests, catalog-entity, read, allow`
Copy to Clipboard

p, role:default/guests, catalog.entity.create, create, allow

g, user:default/<USER_TO_ROLE>, role:default/guests

g, group:default/<GROUP_TO_ROLE>, role:default/guests --

如果定义的权限不包含与其关联的操作,请添加 use 作为策略。请参见以下示例:

---
`p, role:default/guests, kubernetes.proxy, use, allow`
---
Copy to Clipboard

您可以在 app-config.yaml 文件中定义 policy.csv 文件路径:

permission:
  enabled: true
  rbac:
    policies-csv-file: /some/path/rbac-policy.csv
Copy to Clipboard

您可以使用可选配置值来启用重新载入 CSV 文件,而无需重启 Developer Hub 实例。

app-config.yaml 文件中设置 policyFileReload 选项的值:

# ...
permission:
  enabled: true
  rbac:
    policies-csv-file: /some/path/rbac-policy.csv
    policyFileReload: true
    # ...
Copy to Clipboard
2.1.2.1. 将 policy.csv 文件挂载到 Developer Hub Helm Chart 中

当使用 Helm Chart 部署 Red Hat Developer Hub 时,您必须通过将 policy.csv 文件挂载到 Developer Hub Helm Chart 来定义 policy.csv 文件。

您可以通过创建 configMap 并挂载它,将 policy.csv 文件添加到 Developer Hub Helm Chart 中。

先决条件

  • 使用 OpenShift Container Platform Web 控制台登录到 OpenShift Container Platform 帐户。
  • Red Hat Developer Hub 使用 Helm Chart 安装并进行部署。

流程

  1. 在 OpenShift Container Platform 中,创建一个 ConfigMap 来保存策略,如下例所示:

    ConfigMap 示例

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: rbac-policy
      namespace: rhdh
    data:
      rbac-policy.csv: |
        p, role:default/guests, catalog-entity, read, allow
        p, role:default/guests, catalog.entity.create, create, allow
    
        g, user:default/<YOUR_USER>, role:default/guests
    Copy to Clipboard

  2. 在 Developer Hub Helm Chart 中,进入 Root Schema → Backstage chart schema → Backstage parameters → Backstage container additional volume mount
  3. 选择 Add Backstage 容器附加卷挂载 并添加以下值:

    • mountPath:opt/app-root/src/rbac
    • 名称rbac-policy
  4. 将 RBAC 策略添加到 Developer Hub Helm Chart 中的 Backstage 容器 附加卷:

    • 名称rbac-policy
    • configMap

      • defaultMode:420
      • 名称rbac-policy
  5. 更新 app-config.yaml 文件中的策略路径,如下所示:

    app-config.yaml 文件示例

    permission:
      enabled: true
      rbac:
        policies-csv-file: ./rbac/rbac-policy.csv
    Copy to Clipboard

第 3 章 Red Hat Developer Hub 中的条件策略

Red Hat Developer Hub 中的权限框架提供了由 RBAC 后端插件支持的条件(backstage-plugin-rbac-backend)。条件作为 RBAC 后端插件提供的 Developer Hub 资源的内容过滤器。

RBAC 后端 API 存储分配给数据库中的角色的条件。当您请求访问 frontend 资源时,RBAC 后端 API 会搜索对应的条件,并使用其插件 ID 将它们委派给适当的插件。如果您分配到具有不同条件的多个角色,则 RBAC 后端将使用 anyOf 条件合并条件。

条件条件条件

Developer Hub 中的条件是带有规则和参数的简单条件。但是,条件也可以包含参数或按条件条件组合的参数数组。支持的条件条件包括:

  • allOf: 确保阵列中的所有条件都必须为 true,才能满足组合条件。
  • anyOf: 确保该阵列中至少需要满足组合条件的条件。
  • Not : 确保其中的条件不能满足组合条件。
条件对象

该插件指定条件支持的参数。您可以从 RBAC API 端点访问条件对象模式,以了解如何构建条件 JSON 对象,然后由 RBAC 后端插件 API 使用该对象。

条件对象包含以下参数:

表 3.1. 条件对象参数
参数类型描述

result

字符串

始终值为 CONDITIONAL

roleEntityRef

字符串

对 RBAC 角色的字符串实体引用,如 role:default/dev

pluginId

字符串

对应的插件 ID,如 目录

permissionMapping

字符串数组

数组权限操作,如 ['read', 'update', 'delete']

resourceType

字符串

插件提供的资源类型,如 catalog-entity

conditions

JSON

带有参数或数组参数的条件 JSON,按条件加入

3.1. 条件策略定义

您可以访问 Red Hat Developer Hub 中条件策略的 API 端点。例如,要检索可用的条件规则,这有助于定义这些策略,您可以访问 GET [api/plugins/condition-rules] 端点。

api/plugins/condition-rules 返回条件参数 schemas,例如:

[
   {
      "pluginId": "catalog",
      "rules": [
         {
            "name": "HAS_ANNOTATION",
            "description": "Allow entities with the specified annotation",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "annotation": {
                     "type": "string",
                     "description": "Name of the annotation to match on"
                  },
                  "value": {
                     "type": "string",
                     "description": "Value of the annotation to match on"
                  }
               },
               "required": [
                  "annotation"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "HAS_LABEL",
            "description": "Allow entities with the specified label",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "label": {
                     "type": "string",
                     "description": "Name of the label to match on"
                  }
               },
               "required": [
                  "label"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "HAS_METADATA",
            "description": "Allow entities with the specified metadata subfield",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "key": {
                     "type": "string",
                     "description": "Property within the entities metadata to match on"
                  },
                  "value": {
                     "type": "string",
                     "description": "Value of the given property to match on"
                  }
               },
               "required": [
                  "key"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "HAS_SPEC",
            "description": "Allow entities with the specified spec subfield",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "key": {
                     "type": "string",
                     "description": "Property within the entities spec to match on"
                  },
                  "value": {
                     "type": "string",
                     "description": "Value of the given property to match on"
                  }
               },
               "required": [
                  "key"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "IS_ENTITY_KIND",
            "description": "Allow entities matching a specified kind",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "kinds": {
                     "type": "array",
                     "items": {
                        "type": "string"
                     },
                     "description": "List of kinds to match at least one of"
                  }
               },
               "required": [
                  "kinds"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "IS_ENTITY_OWNER",
            "description": "Allow entities owned by a specified claim",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "claims": {
                     "type": "array",
                     "items": {
                        "type": "string"
                     },
                     "description": "List of claims to match at least one on within ownedBy"
                  }
               },
               "required": [
                  "claims"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         }
      ]
   }
   ... <another plugin condition parameter schemas>
]
Copy to Clipboard

RBAC 后端 API 根据前面的条件模式构造一个条件 JSON 对象。

3.1.1. 条件策略示例

在 Red Hat Developer Hub 中,您可以使用或没有条件定义条件策略。您可以使用以下示例根据您的用例定义条件:

没有条件的条件

只有用户是所有者组的成员时,请考虑没有条件显示目录的条件。要添加此条件,您可以使用目录插件模式 IS_ENTITY_OWNER,如下所示:

没有条件的示例

{
  "rule": "IS_ENTITY_OWNER",
  "resourceType": "catalog-entity",
  "params": {
    "claims": ["group:default/team-a"]
  }
}
Copy to Clipboard

在上例中,唯一使用的条件参数是 claims,其中包含用户或组实体引用的列表。

您可以通过添加额外的参数将前面的示例条件应用到 RBAC REST API,如下所示:

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/test",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["read"],
  "conditions": {
    "rule": "IS_ENTITY_OWNER",
    "resourceType": "catalog-entity",
    "params": {
      "claims": ["group:default/team-a"]
    }
  }
}
Copy to Clipboard
具有条件的条件

考虑条件条件,它只有在用户是所有者组成员或显示所有目录用户组的列表时才会显示目录。

要添加条件,您可以在条件中添加另一个规则作为 IS_ENTITY_KIND,如下所示:

带有条件的条件示例

{
  "anyOf": [
    {
      "rule": "IS_ENTITY_OWNER",
      "resourceType": "catalog-entity",
      "params": {
        "claims": ["group:default/team-a"]
      }
    },
    {
      "rule": "IS_ENTITY_KIND",
      "resourceType": "catalog-entity",
      "params": {
        "kinds": ["Group"]
      }
    }
  ]
}
Copy to Clipboard

注意

不支持在创建过程中运行并行条件。因此,请考虑根据可用的标准定义嵌套条件策略。

嵌套条件示例

{
  "anyOf": [
    {
      "rule": "IS_ENTITY_OWNER",
      "resourceType": "catalog-entity",
      "params": {
        "claims": ["group:default/team-a"]
      }
    },
    {
      "rule": "IS_ENTITY_KIND",
      "resourceType": "catalog-entity",
      "params": {
        "kinds": ["Group"]
      }
    }
  ],
  "not": {
    "rule": "IS_ENTITY_KIND",
    "resourceType": "catalog-entity",
    "params": { "kinds": ["Api"] }
  }
}
Copy to Clipboard

您可以通过添加额外的参数将前面的示例条件应用到 RBAC REST API,如下所示:

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/test",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["read"],
  "conditions": {
    "anyOf": [
      {
        "rule": "IS_ENTITY_OWNER",
        "resourceType": "catalog-entity",
        "params": {
          "claims": ["group:default/team-a"]
        }
      },
      {
        "rule": "IS_ENTITY_KIND",
        "resourceType": "catalog-entity",
        "params": {
          "kinds": ["Group"]
        }
      }
    ]
  }
}
Copy to Clipboard

以下示例可用于 Developer Hub 插件。这些示例可帮助您确定如何定义条件策略:

为 Keycloak 插件定义的条件策略

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/developer",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["update", "delete"],
  "conditions": {
    "not": {
      "rule": "HAS_ANNOTATION",
      "resourceType": "catalog-entity",
      "params": { "annotation": "keycloak.org/realm", "value": "<YOUR_REALM>" }
    }
  }
}
Copy to Clipboard

前面的 Keycloak 插件示例可防止 role:default/developer 中的用户更新或删除在 Keycloak 插件中放入目录的用户。

注意

在上例中,注解 keycloak.org/realm 需要 < YOUR_REALM > 的值。

为 Quay 插件定义的条件策略

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/developer",
  "pluginId": "scaffolder",
  "resourceType": "scaffolder-action",
  "permissionMapping": ["use"],
  "conditions": {
    "not": {
      "rule": "HAS_ACTION_ID",
      "resourceType": "scaffolder-action",
      "params": { "actionId": "quay:create-repository" }
    }
  }
}
Copy to Clipboard

前面的 Quay 插件示例可防止角色 role:default/developer 使用 Quay builder 操作。请注意,permissionMapping 包含使用 ,表示 scaffolder-action 资源类型权限没有权限策略。

有关 Red Hat Developer Hub 中权限的更多信息,请参阅 第 2 章 Red Hat Developer Hub 中的权限策略

第 4 章 使用 Red Hat Developer Hub Web UI 管理基于角色的访问控制(RBAC)

管理员可以使用 Developer Hub Web 界面(Web UI)为单独的用户或组分配特定的角色和权限。分配角色可确保在 Developer Hub 中控制资源和功能的访问。

使用 Developer Hub 中的管理员角色,您可以为用户和组分配权限,允许用户或组使用 Developer Hub Web UI 查看、创建、修改和删除角色。

要访问 Web UI 中的 RBAC 功能,您必须安装并配置 @janus-idp/backstage-plugin-rbac 插件。有关安装动态插件的更多信息,请参阅在 Red Hat Developer Hub 中配置插件

安装 @janus-idp/backstage-plugin-rbac 插件后,Administration 选项会出现在侧边栏的底部。当点 Administration 时,RBAC 选项卡默认会出现,显示 Developer Hub 中创建的所有现有角色。在 RBAC 选项卡中,您还可以查看用户、组以及与角色关联的权限策略总数。您还可以使用 Actions 列编辑或删除角色。

4.1. 在 Red Hat Developer Hub Web UI 中创建角色

您可以使用 Web UI 在 Red Hat Developer Hub 中创建角色。

先决条件

流程

  1. 进入 Developer Hub 中边栏底部的 管理

    此时会出现 RBAC 选项卡,在 Developer Hub 中显示所有创建的角色。

  2. (可选)点击任何角色查看 OVERVIEW 页面上的角色信息。
  3. 单击 CREATE 以创建角色。
  4. 在给定字段中输入角色的名称和描述,然后单击 NEXT
  5. 使用搜索字段添加用户和组,然后单击 NEXT
  6. Add permission policies 部分中的下拉列表中,选择 PluginPermission
  7. 选择或清除您要在 Add permissions policies 部分中设置的 Policy,然后单击 NEXT
  8. 查看 Review and create 部分中的添加的信息。
  9. CREATE

验证

创建的角色会出现在 RBAC 选项卡中可用的列表中。

4.2. 在 Red Hat Developer Hub Web UI 中编辑角色

您可以使用 Web UI 在 Red Hat Developer Hub 中编辑角色。

注意

policy.csv 或 ConfigMap 文件生成的策略无法使用 Developer Hub Web UI 编辑或删除。

先决条件

流程

  1. 进入 Developer Hub 中边栏底部的 管理

    此时会出现 RBAC 选项卡,在 Developer Hub 中显示所有创建的角色。

  2. (可选)点击任何角色查看 OVERVIEW 页面上的角色信息。
  3. 选择您要编辑的角色的编辑图标。
  4. 编辑角色的详细信息,如名称、描述、用户和组以及权限策略,然后单击 NEXT
  5. 检查角色的编辑详细信息,然后单击 SAVE

编辑角色后,您可以查看角色的 OVERVIEW 页面上 角色的 编辑详情。您还可以使用 OVERVIEW 页面中的编辑图标来编辑角色的用户和组或权限。

4.3. 删除 Red Hat Developer Hub Web UI 中的角色

您可以使用 Web UI 删除 Red Hat Developer Hub 中的角色。

注意

policy.csv 或 ConfigMap 文件生成的策略无法使用 Developer Hub Web UI 编辑或删除。

先决条件

流程

  1. 进入 Developer Hub 中边栏底部的 管理

    此时会出现 RBAC 选项卡,在 Developer Hub 中显示所有创建的角色。

  2. (可选)点击任何角色查看 OVERVIEW 页面上的角色信息。
  3. 从您要删除的角色的 Actions 列中选择 delete 图标。

    删除此角色? 弹出会出现在屏幕上。

  4. DELETE

第 5 章 基于角色的访问控制(RBAC) REST API

Red Hat Developer Hub 提供 RBAC REST API,可用于管理 Developer Hub 中的权限和角色。此 API 支持您促进和自动维护 Developer Hub 权限策略和角色。

使用 RBAC REST API,您可以执行以下操作:

  • 检索有关所有权限策略或特定权限策略或角色的信息
  • 创建、更新或删除权限策略或角色
  • 检索有关静态插件的权限策略信息

RBAC REST API 需要以下组件:

授权

RBAC REST API 需要允许用户角色的 Bearer 令牌授权。出于开发目的,您可以在浏览器中访问 Web 控制台。当您在网络请求列表中刷新令牌请求时,您可以在响应 JSON 中找到令牌。

Authorization: Bearer $token

例如,在 Developer Hub Homepage 中,导航到 Network 选项卡并搜索 query?term= 网络调用。或者,您也可以前往 Catalog 页面,再选择任何 Catalog API 网络调用来获取 Bearer 令牌。

HTTP 方法

RBAC REST API 支持以下 API 请求的 HTTP 方法:

  • GET :从指定的资源端点检索指定信息
  • POST :创建或更新资源
  • PUT :更新资源
  • DELETE :删除资源
基本 URL
RBAC REST API 请求的基本 URL 是 http://SERVER:PORT/api/permission/policies,如 http://localhost:7007/api/permission/policies。
Endpoints

RBAC REST API 端点(如 /api/permission/policies/[kind]/[namespace]/[name ])用于指定 kindnamespacename,是附加到基本 URL 的 URI,以访问对应的资源。

/api/permission/policies/[kind]/[namespace]/[name] 端点的请求 URL 示例:

http://localhost:7007/api/permission/policies/user/default/johndoe

注意

如果至少为一个权限分配给 user:default/johndoe,则前面提到的示例请求 URL 如果以有效授权令牌在 GET 响应中发送,则前面提到的示例请求 URL 会返回结果。但是,如果权限仅分配给角色,则示例请求 URL 不会返回输出。

请求数据

RBAC REST API 中的 HTTP POST 请求可能需要带有与请求相关的数据的 JSON 请求正文。

http://localhost:7007/api/permission/policiesPOST 请求 URL 和 JSON 请求正文数据示例:

{
    "entityReference": "role:default/test",
    "permission": "catalog-entity",
    "policy": "delete",
    "effect": "allow"
}
Copy to Clipboard
HTTP 状态代码

RBAC REST API 支持以下 HTTP 状态代码来返回作为响应:

  • 200 OK :请求成功。
  • 201 created :请求会导致成功创建新资源。
  • 204 no Content: 请求成功,但没有要在响应有效负载中发送的额外内容。
  • 400 bad Request: 输入错误以及请求
  • 401 未授权:请求的资源缺少有效的身份验证
  • 403 forbidden: 禁止授权请求
  • 404 not Found: could not find requested resource
  • 409 冲突:请求与当前状态和目标资源冲突
Source

使用 RBAC 插件创建的每个权限策略和角色都与源关联,以维护插件中的数据一致性。您可以根据以下指定源信息操作权限策略和角色:

  • CSV 文件
  • 配置文件
  • REST API
  • Legacy

管理源自 CSV 文件和 REST API 的角色和权限策略涉及根据其初始源信息直接修改。

配置文件与 RBAC 插件提供的默认 role:default/rbac_admin 角色相关。默认角色具有创建、读取、更新和删除权限策略或角色以及读取目录实体的权限。

注意

如果您的管理要求默认权限不足,您可以创建具有所需权限策略的自定义 admin 角色。

传统源适用于在 RBAC 后端插件版本 2.1.3 之前定义的策略和角色,并且是源位置选项中最严格的限制。您必须更新旧源中的权限和角色,以使用 REST API 或 CSV 文件源。

您可以使用 GET 请求来查询角色和策略,并根据需要确定源信息。

5.1. 使用 REST 客户端或 curl 工具使用 RBAC REST API 发送请求

RBAC REST API 可让您与 Developer Hub 中的权限策略和角色交互,而无需使用用户界面。您可以使用任何 REST 客户端或 curl 实用程序发送 RBAC REST API 请求。

先决条件

  • Red Hat Developer Hub 已安装并运行。

有关安装 Red Hat Developer Hub 的更多信息,请参阅使用 Helm Chart 在 OpenShift Container Platform 上安装 Red Hat Developer Hub

  • 您可以访问 Developer Hub。

流程

  1. 识别您要向发送请求的相关 API 端点,如 POST /api/permission/policies。根据您的用例调整任何请求详情。

    对于 REST 客户端

    • Authorization :从 web 控制台输入生成的令牌。
    • HTTP 方法:设置为 POST
    • URL:输入 RBAC REST API 基本 URL 和端点,如 http://localhost:7007/api/permission/policies

    对于 curl 工具

    • -x :设置为 POST
    • - h :设置以下标头:

      content-type: application/json

      Authorization: Bearer $token

      $token 是浏览器中从 Web 控制台请求的令牌。

    • URL :输入以下 RBAC REST API 基本 URL 端点,如 http://localhost:7007/api/permission/policies
    • -d :添加请求 JSON 正文

    请求示例

    curl -X POST "http://localhost:7007/api/permission/roles" -d '{"memberReferences": ["group:default/example"], "name": "role:default/test", "metadata": { "description": "This is a test role" } }' -H "Content-Type: application/json" -H "Authorization: Bearer $token" -v

    curl -X POST "http://localhost:7007/api/permission/policies" -d '[{"entityReference":"role:default/test", "permission": "catalog-entity", "policy": "read", "effect":"allow"}]' -H "Content-Type: application/json" -H "Authorization: Bearer $token" -v

    curl -X POST "http://localhost:7007/api/permission/roles/conditions" -d '{"result": "CONDITIONAL", "roleEntityRef": "role:default/test", "pluginId": "catalog", "resourceType": "catalog-entity", "permissionMapping": ["read"], "conditions": {"rule": {"rule": "IS_ENTITY_OWNER", "resourceType": "catalog-entity", "params": {"claims": ["group:default/janus-authors"]}}}' -H "Content-Type: application/json" -H "Authorization: Bearer $token" -v

  2. 执行请求并检查响应。

5.2. 支持的 RBAC REST API 端点

RBAC REST API 提供了在 Developer Hub 中管理角色、权限和条件策略的端点,并检索有关角色和策略的信息。

5.2.1. 角色

RBAC REST API 支持以下端点来管理 Red Hat Developer Hub 中的角色。

[GET] /api/permission/roles

返回 Developer Hub 中的所有角色。

响应示例(JSON)

[
  {
    "memberReferences": ["user:default/username"],
    "name": "role:default/guests"
  },
  {
    "memberReferences": [
      "group:default/groupname",
      "user:default/username"
    ],
    "name": "role:default/rbac_admin"
  }
]
Copy to Clipboard

[GET] /api/permission/roles/{kind}/{namespace}/{name}

返回 Developer Hub 中单个角色的信息。

响应示例(JSON)

[
  {
    "memberReferences": [
      "group:default/groupname",
      "user:default/username"
    ],
    "name": "role:default/rbac_admin"
  }
]
Copy to Clipboard

[POST] /api/permission/roles/{kind}/{namespace}/{name}

在 Developer Hub 中创建角色。

表 5.1. 请求参数
名称描述类型存在

正文(body)

memberReferencesnamespace 并将新角色命名为要创建的新角色。

请求正文

必填

请求正文示例(JSON)

{
  "memberReferences": ["group:default/test"],
  "name": "role:default/test_admin"
}
Copy to Clipboard

响应示例

201 Created
Copy to Clipboard

[PUT] /api/permission/roles/{kind}/{namespace}/{name}

为 Developer Hub 中的角色更新 memberReferences、类型、namespacename

请求参数

请求正文包含 oldRolenewRole 对象:

Name描述类型存在

正文(body)

memberReferencesnamespace 并将新角色命名为要创建的新角色。

请求正文

必填

请求正文示例(JSON)

{
  "oldRole": {
    "memberReferences": ["group:default/test"],
    "name": "role:default/test_admin"
  },
  "newRole": {
    "memberReferences": ["group:default/test", "user:default/test2"],
    "name": "role:default/test_admin"
  }
}
Copy to Clipboard

响应示例

200 OK
Copy to Clipboard

[DELETE] /api/permission/roles/{kind}/{namespace}/{name}?memberReferences=<VALUE>

从 Developer Hub 中的角色中删除指定的用户或组。

表 5.2. 请求参数
名称描述类型存在

kind

实体的类型

字符串

必填

namespace

实体的命名空间

字符串

必填

name

实体的名称

字符串

必填

memberReferences

关联的组信息

字符串

必填

响应示例

204
Copy to Clipboard

[DELETE] /api/permission/roles/{kind}/{namespace}/{name}

从 Developer Hub 删除指定的角色。

表 5.3. 请求参数
名称描述类型存在

kind

实体的类型

字符串

必填

namespace

实体的命名空间

字符串

必填

name

实体的名称

字符串

必填

响应示例

204
Copy to Clipboard

5.2.2. 权限策略

RBAC REST API 支持以下端点来管理 Red Hat Developer Hub 中的权限策略。

[GET] /api/permission/policies

返回所有用户的权限策略列表。

响应示例(JSON)

[
  {
    "entityReference": "role:default/test",
    "permission": "catalog-entity",
    "policy": "read",
    "effect": "allow",
    "metadata": {
      "source": "csv-file"
    }
  },
  {
    "entityReference": "role:default/test",
    "permission": "catalog.entity.create",
    "policy": "use",
    "effect": "allow",
    "metadata": {
      "source": "csv-file"
    }
  },
]
Copy to Clipboard

[GET] /api/permission/policies/{kind}/{namespace}/{name}

返回与指定实体引用相关的权限策略。

表 5.4. 请求参数
名称描述类型存在

kind

实体的类型

字符串

必填

namespace

实体的命名空间

字符串

必填

name

与实体相关的名称

字符串

必填

响应示例(JSON)

[
  {
    "entityReference": "role:default/test",
    "permission": "catalog-entity",
    "policy": "read",
    "effect": "allow",
    "metadata": {
      "source": "csv-file"
    }
  },
  {
    "entityReference": "role:default/test",
    "permission": "catalog.entity.create",
    "policy": "use",
    "effect": "allow",
    "metadata": {
      "source": "csv-file"
    }
  }
]
Copy to Clipboard

[POST] /api/permission/policies

为指定实体创建权限策略。

表 5.5. 请求参数
名称描述类型存在

entityReference

实体的引用值,包括 类型namespacename

字符串

必填

权限

特定插件、资源类型或名称的权限

字符串

必填

policy

权限的策略操作,如创建、读取更新删除 或使用

字符串

必填

effect

表示允许或不允许策略

字符串

必填

请求正文示例(JSON)

[
  {
    "entityReference": "role:default/test",
    "permission": "catalog-entity",
    "policy": "read",
    "effect": "allow"
  }
]
Copy to Clipboard

响应示例

201 Created
Copy to Clipboard

[PUT] /api/permission/policies/{kind}/{namespace}/{name}

更新指定实体的权限策略。

请求参数

请求正文包含 oldPolicynewPolicy 对象:

Name描述类型存在

权限

特定插件、资源类型或名称的权限

字符串

必填

policy

权限的策略操作,如创建、读取更新删除 或使用

字符串

必填

effect

表示允许或不允许策略

字符串

必填

请求正文示例(JSON)

{
  "oldPolicy": [
    {
      "permission": "catalog-entity",
      "policy": "read",
      "effect": "allow"
    },
    {
      "permission": "catalog.entity.create",
      "policy": "create",
      "effect": "allow"
    }
  ],
  "newPolicy": [
    {
      "permission": "catalog-entity",
      "policy": "read",
      "effect": "deny"
    },
    {
      "permission": "policy-entity",
      "policy": "read",
      "effect": "allow"
    }
  ]
}
Copy to Clipboard

响应示例

200
Copy to Clipboard

[DELETE] /api/permission/policies/{kind}/{namespace}/{name}?permission={value1}&policy={value2}&effect={value3}

删除添加到指定实体的权限策略。

表 5.6. 请求参数
名称描述类型存在

kind

实体的类型

字符串

必填

namespace

实体的命名空间

字符串

必填

name

与实体相关的名称

字符串

必填

权限

特定插件、资源类型或名称的权限

字符串

必填

policy

权限的策略操作,如创建、读取更新删除 或使用

字符串

必填

effect

表示允许或不允许策略

字符串

必填

响应示例

204 No Content
Copy to Clipboard

[DELETE] /api/permission/policies/{kind}/{namespace}/{name}

删除添加到指定实体的所有权限策略。

表 5.7. 请求参数
名称描述类型存在

kind

实体的类型

字符串

必填

namespace

实体的命名空间

字符串

必填

name

与实体相关的名称

字符串

必填

响应示例

204 No Content
Copy to Clipboard

[GET] /api/permission/plugins/policies

返回所有静态插件的权限策略。

响应示例(JSON)

[
  {
    "pluginId": "catalog",
    "policies": [
      {
        "isResourced": true,
        "permission": "catalog-entity",
        "policy": "read"
      },
      {
        "isResourced": false,
        "permission": "catalog.entity.create",
        "policy": "create"
      },
      {
        "isResourced": true,
        "permission": "catalog-entity",
        "policy": "delete"
      },
      {
        "isResourced": true,
        "permission": "catalog-entity",
        "policy": "update"
      },
      {
        "isResourced": false,
        "permission": "catalog.location.read",
        "policy": "read"
      },
      {
        "isResourced": false,
        "permission": "catalog.location.create",
        "policy": "create"
      },
      {
        "isResourced": false,
        "permission": "catalog.location.delete",
        "policy": "delete"
      }
    ]
  },
  ...
]
Copy to Clipboard

5.2.3. 条件策略

RBAC REST API 支持以下端点来管理 Red Hat Developer Hub 中的条件策略。

[GET] /api/permission/plugins/condition-rules

为 Developer Hub 中启用的可用插件返回可用条件规则参数模式。

响应示例(JSON)

[
   {
      "pluginId": "catalog",
      "rules": [
         {
            "name": "HAS_ANNOTATION",
            "description": "Allow entities with the specified annotation",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "annotation": {
                     "type": "string",
                     "description": "Name of the annotation to match on"
                  },
                  "value": {
                     "type": "string",
                     "description": "Value of the annotation to match on"
                  }
               },
               "required": [
                  "annotation"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "HAS_LABEL",
            "description": "Allow entities with the specified label",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "label": {
                     "type": "string",
                     "description": "Name of the label to match on"
                  }
               },
               "required": [
                  "label"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "HAS_METADATA",
            "description": "Allow entities with the specified metadata subfield",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "key": {
                     "type": "string",
                     "description": "Property within the entities metadata to match on"
                  },
                  "value": {
                     "type": "string",
                     "description": "Value of the given property to match on"
                  }
               },
               "required": [
                  "key"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "HAS_SPEC",
            "description": "Allow entities with the specified spec subfield",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "key": {
                     "type": "string",
                     "description": "Property within the entities spec to match on"
                  },
                  "value": {
                     "type": "string",
                     "description": "Value of the given property to match on"
                  }
               },
               "required": [
                  "key"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "IS_ENTITY_KIND",
            "description": "Allow entities matching a specified kind",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "kinds": {
                     "type": "array",
                     "items": {
                        "type": "string"
                     },
                     "description": "List of kinds to match at least one of"
                  }
               },
               "required": [
                  "kinds"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         },
         {
            "name": "IS_ENTITY_OWNER",
            "description": "Allow entities owned by a specified claim",
            "resourceType": "catalog-entity",
            "paramsSchema": {
               "type": "object",
               "properties": {
                  "claims": {
                     "type": "array",
                     "items": {
                        "type": "string"
                     },
                     "description": "List of claims to match at least one on within ownedBy"
                  }
               },
               "required": [
                  "claims"
               ],
               "additionalProperties": false,
               "$schema": "http://json-schema.org/draft-07/schema#"
            }
         }
      ]
   }
   ... <another plugin condition parameter schemas>
]
Copy to Clipboard

[GET] /api/permission/roles/conditions/:id

返回指定 ID 的条件。

响应示例(JSON)

{
  "id": 1,
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/test",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["read"],
  "conditions": {
    "anyOf": [
      {
        "rule": "IS_ENTITY_OWNER",
        "resourceType": "catalog-entity",
        "params": {
          "claims": ["group:default/team-a"]
        }
      },
      {
        "rule": "IS_ENTITY_KIND",
        "resourceType": "catalog-entity",
        "params": {
          "kinds": ["Group"]
        }
      }
    ]
  }
}
Copy to Clipboard

[GET] /api/permission/roles/conditions

返回所有角色的所有条件列表。

响应示例(JSON)

[
  {
    "id": 1,
    "result": "CONDITIONAL",
    "roleEntityRef": "role:default/test",
    "pluginId": "catalog",
    "resourceType": "catalog-entity",
    "permissionMapping": ["read"],
    "conditions": {
      "anyOf": [
        {
          "rule": "IS_ENTITY_OWNER",
          "resourceType": "catalog-entity",
          "params": {
            "claims": ["group:default/team-a"]
          }
        },
        {
          "rule": "IS_ENTITY_KIND",
          "resourceType": "catalog-entity",
          "params": {
            "kinds": ["Group"]
          }
        }
      ]
    }
  }
]
Copy to Clipboard

[POST] /api/permission/roles/conditions

为指定角色创建条件策略。

表 5.8. 请求参数
名称描述类型存在

result

始终值为 CONDITIONAL

字符串

必填

roleEntityRef

对 RBAC 角色的字符串实体引用,如 role:default/dev

字符串

必填

pluginId

对应的插件 ID,如 目录

字符串

必填

permissionMapping

数组权限操作,如 ['read', 'update', 'delete']

字符串数组

必填

resourceType

插件提供的资源类型,如 catalog-entity

字符串

必填

conditions

带有参数或数组参数的条件 JSON,按条件加入

JSON

必填

name

角色的名称

字符串

必填

metadata.description

角色的描述

字符串

选填

请求正文示例(JSON)

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/test",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["read"],
  "conditions": {
    "rule": "IS_ENTITY_OWNER",
    "resourceType": "catalog-entity",
    "params": {
      "claims": ["group:default/team-a"]
    }
  }
}
Copy to Clipboard

响应示例(JSON)

{
  "id": 1
}
Copy to Clipboard

[PUT] /permission/roles/conditions/:id

更新指定 ID 的条件策略。

表 5.9. 请求参数
名称描述类型存在

result

始终值为 CONDITIONAL

字符串

必填

roleEntityRef

对 RBAC 角色的字符串实体引用,如 role:default/dev

字符串

必填

pluginId

对应的插件 ID,如 目录

字符串

必填

permissionMapping

数组权限操作,如 ['read', 'update', 'delete']

字符串数组

必填

resourceType

插件提供的资源类型,如 catalog-entity

字符串

必填

conditions

带有参数或数组参数的条件 JSON,按条件加入

JSON

必填

name

角色的名称

字符串

必填

metadata.description

角色的描述

字符串

选填

请求正文示例(JSON)

{
  "result": "CONDITIONAL",
  "roleEntityRef": "role:default/test",
  "pluginId": "catalog",
  "resourceType": "catalog-entity",
  "permissionMapping": ["read"],
  "conditions": {
    "anyOf": [
      {
        "rule": "IS_ENTITY_OWNER",
        "resourceType": "catalog-entity",
        "params": {
          "claims": ["group:default/team-a"]
        }
      },
      {
        "rule": "IS_ENTITY_KIND",
        "resourceType": "catalog-entity",
        "params": {
          "kinds": ["Group"]
        }
      }
    ]
  }
}
Copy to Clipboard

响应示例

200
Copy to Clipboard

[DELETE] /api/permission/roles/conditions/:id

删除指定 ID 的条件策略。

响应示例

204
Copy to Clipboard

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat