策略

警告

自 Glance 22.0.0 (Wallaby) 起,JSON 格式的策略文件已被弃用。此 oslopolicy-convert-json-to-yaml 工具将以向后兼容的方式将现有的 JSON 格式策略文件迁移到 YAML。

Glance 的公共 API 调用可以通过策略配置文件限制为特定用户集。本文档详细说明了如何配置策略以及它们适用于哪些内容。

策略由一组规则组成,这些规则由策略“大脑”用于确定授权租户是否可以执行特定操作。

构建策略配置文件

策略配置文件是一个简单的 JSON 对象,其中包含一组规则。每个顶级键是规则的名称。每个规则都是一个字符串,描述了 Glance API 中可以执行的操作。

可以对其强制执行规则的操作包括

  • get_images - 列出可用的镜像实体

    • GET /v1/images

    • GET /v1/images/detail

    • GET /v2/images

  • get_image - 获取特定的镜像实体

    • HEAD /v1/images/<IMAGE_ID>

    • GET /v1/images/<IMAGE_ID>

    • GET /v2/images/<IMAGE_ID>

  • download_image - 下载二进制镜像数据

    • GET /v1/images/<IMAGE_ID>

    • GET /v2/images/<IMAGE_ID>/file

  • upload_image - 上传二进制镜像数据

    • POST /v1/images

    • PUT /v1/images/<IMAGE_ID>

    • PUT /v2/images/<IMAGE_ID>/file

  • copy_from - 从 URL 复制二进制镜像数据

    • POST /v1/images

    • PUT /v1/images/<IMAGE_ID>

  • add_image - 创建镜像实体

    • POST /v1/images

    • POST /v2/images

  • modify_image - 更新镜像实体

    • PUT /v1/images/<IMAGE_ID>

    • PUT /v2/images/<IMAGE_ID>

  • publicize_image - 创建或更新公共镜像

    • POST /v1/images 具有属性 is_public = true

    • PUT /v1/images/<IMAGE_ID> 具有属性 is_public = true

    • POST /v2/images 具有属性 visibility = public

    • PUT /v2/images/<IMAGE_ID> 具有属性 visibility = public

  • communitize_image - 创建或更新社区镜像

    • POST /v2/images 具有属性 visibility = community

    • PUT /v2/images/<IMAGE_ID> 具有属性 visibility = community

  • delete_image - 删除镜像实体和关联的二进制数据

    • DELETE /v1/images/<IMAGE_ID>

    • DELETE /v2/images/<IMAGE_ID>

  • add_member - 向镜像的成员仓库添加成员资格

    • POST /v2/images/<IMAGE_ID>/members

  • get_members - 列出镜像的成员

    • GET /v1/images/<IMAGE_ID>/members

    • GET /v2/images/<IMAGE_ID>/members

  • delete_member - 删除镜像的成员资格

    • DELETE /v1/images/<IMAGE_ID>/members/<MEMBER_ID>

    • DELETE /v2/images/<IMAGE_ID>/members/<MEMBER_ID>

  • modify_member - 创建或更新镜像的成员资格

    • PUT /v1/images/<IMAGE_ID>/members/<MEMBER_ID>

    • PUT /v1/images/<IMAGE_ID>/members

    • POST /v2/images/<IMAGE_ID>/members

    • PUT /v2/images/<IMAGE_ID>/members/<MEMBER_ID>

  • manage_image_cache - 允许使用镜像缓存管理 API

要将操作限制为特定的角色或角色,您可以像这样列出角色

{
  "delete_image": ["role:admin", "role:superuser"]
}

以上将添加一个规则,仅允许具有“admin”或“superuser”角色的用户删除镜像。

编写规则

角色检查将继续像以前一样工作。如果检查中定义的角色是用户拥有的角色,则该检查将通过,例如 role:admin

要编写通用规则,您需要知道 Glance 提供三个可以在规则左侧冒号 (:) 中使用的值。这些值是当前用户的凭据,形式如下

  • role

  • tenant

  • owner

冒号左侧还可以包含 Python 可以理解的任何值,例如

  • True

  • False

  • "一个字符串"

  • &c。

使用 tenantowner 仅适用于镜像。考虑以下规则

tenant:%(owner)s

这将使用当前经过身份验证用户的 tenant 值。它还将使用它正在操作的镜像的 owner。如果这两个值相等,则检查将通过。镜像上的所有属性(以及额外的镜像属性)都可用于在冒号右侧使用。最有用的如下

  • owner

  • protected

  • is_public

因此,您可以构建如下规则集

{
    "not_protected": "False:%(protected)s",
    "is_owner": "tenant:%(owner)s",
    "is_owner_or_admin": "rule:is_owner or role:admin",
    "not_protected_and_is_owner": "rule:not_protected and rule:is_owner",

    "get_image": "rule:is_owner_or_admin",
    "delete_image": "rule:not_protected_and_is_owner",
    "add_member": "rule:not_protected_and_is_owner"
}

示例

示例 1.(默认策略配置)

{
    "default": ""
}

请注意,空的 JSON 列表意味着 Glance API 的所有方法都可以被任何人调用。

示例 2. 禁止非管理员修改调用

{
    "default": "",
    "add_image": "role:admin",
    "modify_image": "role:admin",
    "delete_image": "role:admin"
}