Tacker API 资源访问控制增强

https://blueprints.launchpad.net/tacker/+spec/enhance-api-policy

问题描述

在当前实现中,Tacker API 策略仅支持用户是否可以访问 API,但不确定用户是否可以访问 API 调用所操作的对象。然而,在商业网络中,电信运营商需要对 API 资源进行更细粒度的访问控制。例如,只有公司 A 的工程师才能操作公司 A 的 VNF/CNF,而其他公司的工程师则不能。

oslo.policy [1] 支持将 API 属性与对象属性进行比较的功能。例如

"os_nfv_orchestration_api:vnf_instances:show" : "project_id:%(project_id)s"

冒号前的 project_id 字符串是 API 属性,即 API 用户的项目 ID。它与对象(在本例中为 VNF 实例)的项目 ID 进行比较。更确切地说,它与数据库中该对象的 project_id 字段进行比较。如果两个值相等,则授予权限。

基于此功能,本规范描述了基于用户和 VNF 信息对 API 资源进行细粒度访问控制的实现。

提议的变更

需要进行以下更改

  1. 在资源创建时添加额外的属性。

  2. 更改 API 流程以支持 Tacker 策略检查器。

  3. 将 Tacker 策略过滤器添加到 API 流程列表中。

  4. 将特殊角色转换为上下文中 API 属性。

  5. 添加一个配置选项。

  6. 策略和角色示例。

在资源创建时添加额外的属性

  1. 注册 Vim API

    • 将一个区域属性放入请求参数 ‘extra’ 中。它将由后续 API 流程存储到 DB 中。

  2. 创建 VNF 实例 API v1/v2

    • 从默认 Vim 获取区域属性,然后将其放入 VnfInstance 对象中的 VimConnectionInfo 对象的 ‘extra’ 字段中,然后将其存储到 DB 中。

  3. 实例化 VNF 实例 v1/v2

    • 从请求体中的 vim_id 获取 Vim 信息,在 VimConnectionInfo 中。

    • 从 Vim 信息中获取区域属性,然后将其放入 InstantiateVnfRequest 对象中的 VimConnectionInfo 对象的 ‘extra’ 字段中,然后将其存储到 DB 中。

注意

区域属性是一个区域-区域对。该属性的值是格式为 “area@region” 的字符串。

更改 API 流程以支持 Tacker 策略检查器

在当前实现中,Tacker API 流程在调用策略函数时没有传递被访问资源的属性。然而,这些属性是增强的 Tacker API 策略函数确定用户是否可以访问资源所必需的。因此,我们应该修改 API 流程。从数据库获取策略检查器所需的属性,并在调用时将其传递给策略检查器。

支持增强的 Tacker 策略的 API 流程中的策略检查流程。

../../_images/011.png

第 3 步是专门的,需要由每个 API 流程自行实现。其他步骤是通用的或已经存在于所有需要更改的 API 流程中

  1. Keystonemiddleware 会将包含用户角色(包括用户角色)的用户信息发送到 API 流程。特殊用户角色将在后续步骤中转换为用户属性。

  2. API 流程从 TackerDB 获取被访问的资源。此步骤是现有的,不需要修改。

  3. API 流程从被访问的资源中获取所需的资源属性。此步骤是新添加的。

  4. API 流程使用被访问的资源属性调用策略检查函数。此步骤是现有的,但需要修改的是在调用策略检查函数时将资源属性作为调用参数添加。

  5. 上下文将特殊角色转换为用户属性。此步骤是新添加的,是否执行取决于以下部分中描述的配置选项 添加一个配置选项。有关转换规则,请参阅后面的部分 将特殊角色转换为 API 属性 以获取详细信息。

  6. 上下文使用资源属性和用户属性调用策略执行器。此步骤是现有的,不需要修改。

  7. API 流程操作被访问的资源。此步骤是现有的,不需要修改。

需要更改的 Vim API 流程

  • Vim 删除

  • Vim 更新

  • Vim 显示

下表显示了策略检查器可以通过哪个 API 请求参数从哪个表查询所需的属性,并将其存储在哪个字段中。

属性

请求参数

字段

示例

area

vim_id

vims

extra

{“area”: “tokyo@japan”}

需要更改的 VNF 包 API 流程

  • VNF 包显示

  • VNF 包删除

  • VNF 包更新

  • VNF 包读取

  • VNF 包获取

下表显示了策略检查器可以通过哪个 API 请求参数从哪个表查询所需的属性,并将其存储在哪个字段中。

属性

请求参数

字段

示例

vendor

vnf_package_id

vnf_package_vnfd

vnf_provider

“Company”

需要更改的 VNF 实例 API 流程

VNF 实例 API 流程的更改包括 v1 和 v2 版本。

  1. VNF 实例创建 API 流程需要更改:下表显示了策略检查器可以通过哪个 API 请求参数从哪个表查询所需的属性,并将其存储在哪个字段中。

    属性

    请求参数

    字段

    示例

    vendor

    vnfdId

    vnf_package_vnfd

    vnf_provider

    “Company”

  2. VNF 实例实例化 API 流程需要更改:下表显示了策略检查器可以通过哪个 API 请求参数从哪个表查询所需的属性,并将其存储在哪个字段中。

    属性

    请求参数

    字段

    示例

    vendor

    vnfdId

    vnf_instances,VnfInstanceV2

    vnf_provider,vnfProvider

    “Company”

  3. 需要更改的以下 API 流程

    • VNF 实例终止

    • VNF 实例修复

    • VNF 实例删除

    • VNF 实例显示

    • VNF 实例缩放

    • VNF 实例修改

    • VNF 实例 change_ext_conn

    • VNF 实例 change_vnfpkg (v2)

    下表显示了策略检查器可以通过哪个 API 请求参数从哪个表查询所需的属性,并将其存储在哪个字段中。

    属性

    请求参数

    字段

    示例

    vendor

    vnfdId

    vnf_instances,VnfInstanceV2

    vnf_provider,vnfProvider

    “Company”

    area

    vnfInstanceId

    vnf_instances,VnfInstanceV2

    vim_connection_info/extra,vimConnectionInfo/extra

    {“area”: “tokyo@japan”}

    tenant

    vnfInstanceId

    vnf_instances,VnfInstanceV2

    vnf_metadata,instantiatedVnfInfo/metadata

    {“tenant”: “default”}

将 Tacker 策略过滤器添加到 API 流程列表中

在当前实现中,Tacker 策略不支持对 list API 进行过滤。我们将添加基于策略规则的过滤器来过滤 list 操作的结果。

支持增强的 Tacker 策略的 API 流程中的策略过滤器流程。

../../_images/02.png

第 6 步是专门的,需要由每个 API 流程自行实现。其他步骤是通用的或已经存在于所有需要更改的 API 流程中

  1. Keystonemiddleware 会将包含用户角色(包括用户角色)的用户信息发送到 API 流程。特殊用户角色将在后续步骤中转换为用户属性。

  2. API 流程调用策略检查函数,不带资源属性。此步骤是现有的,不需要修改。

  3. API 流程从数据库获取被访问的资源。此步骤是现有的,不需要修改。

  4. API 流程从上下文中获取用户属性。此步骤是新添加的,并且是通用的。

  5. 上下文将特殊角色转换为用户属性,此步骤是新添加的,并且取决于以下部分中描述的配置选项 添加一个配置选项。有关转换规则,请参阅后面的部分 将特殊角色转换为 API 属性 以获取详细信息。

  6. API 流程根据策略规则过滤 list 操作的结果。此步骤是新添加的。

  7. API 流程将过滤后的结果返回给用户。此步骤是现有的,不需要修改。

需要更改的 List API 流程

  1. 对于 Vim list API,Tacker 策略过滤器支持以下属性。

    属性

    字段

    示例

    area

    vims

    extra

    {“area”: “tokyo@japan”}

  2. 对于 VNF 包 list API,Tacker 策略过滤器支持以下属性。

    属性

    字段

    示例

    vendor

    vnf_package_vnfd

    vnf_provider

    “Company”

  3. 对于 VNF 实例 list API,Tacker 策略过滤器支持以下属性。

    属性

    字段

    示例

    vendor

    vnf_instances,VnfInstanceV2

    vnf_provider,vnfProvider

    “Company”

    area

    vnf_instances,VnfInstanceV2

    vim_connection_info/extra,vimConnectionInfo/extra

    {“area”: “tokyo@japan”}

    tenant

    vnf_instances,VnfInstanceV2

    vnf_metadata,instantiatedVnfInfo/metadata

    {“tenant”: “default”}

将特殊角色转换为上下文中 API 属性

特殊角色的命名规则

我们将定义一些特殊角色,这些角色的命名遵循以下规则。

  1. 角色名称由三部分组成:前缀 + “_” + [属性值/特殊值]

  2. 支持的前缀、属性值和特殊值如以下表所示

前缀

属性值

特殊值

示例

AREA

area 值

all@all, all@{region_value}

AREA_tokyo@japan, AREA_all@all, AREA_all@japan

VENDOR

vendor 值

all

VENDOR_vendor_A, VENDOR_all

TENANT

tenant 值

all

TENANT_default, TENANT_all

注意

由于“all”被视为特殊值,因此资源属性不能使用“all”作为属性值。

转换规则

在 Tacker 上下文中,我们将这些特殊角色转换为 API 属性并提供给 Tacker 策略。请参阅 更改 API 流程以支持 Tacker 策略检查器将 Tacker 策略过滤器添加到 API 流程列表 本规范的章节以获取此更改的流程图。转换遵循以下规则

  1. 对于普通属性值,它们将直接转换为用户属性值。

    前缀

    属性名称

    示例(特殊角色 -> 用户属性值)

    AREA

    area

    AREA_tokyo@japan -> {“area”: [”tokyo@japan”]}

    VENDOR

    vendor

    VENDOR_vendor_A -> {“vendor”: [“vendor_A”]}

    TENANT

    tenant 值

    TENANT_default -> {“tenant”: [“default”]}

  2. 对于策略检查器中的特殊值,资源对应的属性值将被分配给用户。

    前缀

    属性名称

    特殊值

    示例(资源属性 -> 用户属性)

    AREA

    area

    all@all

    {“area”: “tokyo@japan”} -> {“area”: [”tokyo@japan”]}

    AREA

    area

    all@{region_value}

    相同的区域值

    {"area": "tokyo@japan"} -> {"area": ["tokyo@japan"]}
    

    不同的区域值

    any -> {"area": []}
    

    VENDOR

    vendor

    all

    {“vendor”: “vendor_A”} -> {“vendor”: [“vendor_A”]}

    TENANT

    tenant 值

    all

    {“tenant”: “default”} -> {“tenant”: [“default”]}

  3. 对于策略过滤器中的特殊值“all”,该属性将不作为过滤属性使用。请注意,“area”属性在使用它作为过滤器属性时需要用“@”分隔成两部分。因此,“area”的特殊值“all@{region_value}”需要分成“all”和“{region_value}”。“area”的部分不作为过滤器属性使用,但“{region_value}”应该作为过滤器属性使用,因为它是一个特殊值“all”。

添加一个配置选项

由于本规范中定义的函数更改了 Tacker API 策略的默认行为,因此建议在 tacker.conf 文件中添加一个配置选项。因此,用户可以选择是否启用此功能。

[oslo_policy]
enhanced_tacker_policy = False

作为建议的实现,当 enhanced_tacker_policy 为 True 时,前一章节中描述的将特殊角色转换为上下文中的用户属性的功能 将特殊角色转换为 API 属性 生效;当 enhanced_tacker_policy 为 False 时,此功能将不生效。

注意

当 enhanced_tacker_policy 为 False 时,特殊角色将不会转换为用户属性,那么用户将不会拥有增强的策略属性,例如区域、供应商和租户。此时,如果增强的策略属性用作策略规则中的比较属性,则该规则将阻止用户访问任何资源,因为比较结果始终为 false。

策略和角色示例

策略示例

注意

有关 Tacker 策略配置的详细信息,请参阅 Tacker 配置指南 [2]

# Decides what is required for the 'is_admin:True' check to succeed.
"context_is_admin": "role:admin"

# Default rule for most non-Admin APIs.
"admin_or_owner": "is_admin:True or project_id:%(project_id)s"

# Default rule for most Admin APIs.
"admin_only": "is_admin:True"

# Default rule for sharing vims.
"shared": "field:vims:shared=True"

# Default rule for most non-Admin APIs.
"default": "rule:admin_or_owner"

# For manager
"manager_and_owner": "rule:manager and project_id:%(project_id)s"

# For user
"owner": "project_id:%(project_id)s"

# VIM resource attributes compare rule.
"vim_attrs_cmp": "area:%(area)s"

# Register a VIM.
# Post  /v1.0/vims
"create_vim": "@"

# List VIMs or show a VIM.
# GET /v1.0/vims
# GET /v1.0/vims/{vim_id}
"get_vim": "rule:vim_attrs_cmp and rule:owner"

# Update a VIM.
# PUT /v1.0/vims/{vim_id}
"update_vim": "rule:vim_attrs_cmp and rule:manager_and_owner"

# Delete a VIM.
# DELETE /v1.0/vims/{vim_id}
"delete_vim": "rule:vim_attrs_cmp and rule:manager_and_owner"

# vnf_packages resource attributes compare rule.
"vnf_pkg_attrs_cmp": "vendor:%(vendor)s"

# Create a VNF package.
# POST  /vnf_packages
"os_nfv_orchestration_api:vnf_packages:create": "rule:admin_or_owner"

# Show a VNF package.
# GET  /vnf_packages/{vnf_package_id}
"os_nfv_orchestration_api:vnf_packages:show": "rule:vnf_pkg_attrs_cmp and rule:owner"

# List all VNF packages.
# GET  /vnf_packages/
"os_nfv_orchestration_api:vnf_packages:index": "rule:vnf_pkg_attrs_cmp and rule:owner"

# Delete a VNF package.
# DELETE  /vnf_packages/{vnf_package_id}
"os_nfv_orchestration_api:vnf_packages:delete": "rule:vnf_pkg_attrs_cmp and rule:manager_and_owner"

# Fetch the contents of an on-boarded VNF Package.
# GET  /vnf_packages/{vnf_package_id}/package_content
"os_nfv_orchestration_api:vnf_packages:fetch_package_content": "rule:vnf_pkg_attrs_cmp and rule:owner"

# Upload a VNF package content.
# PUT  /vnf_packages/{vnf_package_id}/package_content
"os_nfv_orchestration_api:vnf_packages:upload_package_content": "rule:admin_or_owner"

# Upload a VNF package content from URI.
# POST  /vnf_packages/{vnf_package_id}/package_content/upload_from_uri
"os_nfv_orchestration_api:vnf_packages:upload_from_uri": "rule:admin_or_owner"

# Update information of VNF package.
# PATCH  /vnf_packages/{vnf_package_id}
"os_nfv_orchestration_api:vnf_packages:patch": "rule:vnf_pkg_attrs_cmp  and rule:manager_and_owner"

# Read the content of the VNFD within a VNF package.
# GET  /vnf_packages/{vnf_package_id}/vnfd
"os_nfv_orchestration_api:vnf_packages:get_vnf_package_vnfd": "rule:vnf_pkg_attrs_cmp and rule:owner"

# Read the content of the artifact within a VNF package.
# GET  /vnf_packages/{vnfPkgId}/artifacts/{artifactPath}
"os_nfv_orchestration_api:vnf_packages:fetch_artifact": "rule:vnf_pkg_attrs_cmp and rule:owner"

# vnflcm create attributes compare rule.
"vnflcm_create_attrs_cmp": "vendor:%(vendor)s and rule:manager_and_owner"

# vnflcm instantiate attributes compare rule.
"vnflcm_inst_attrs_cmp": "vendor:%(vendor)s and rule:manager_and_owner"

# vnflcm resource attributes compare rule.
"vnflcm_attrs_cmp": "area:%(area)s and vendor:%(vendor)s and tenant:%(tenant)s"

# Get API Versions.
# GET  /vnflcm/v1/api_versions
"os_nfv_orchestration_api:vnf_instances:api_versions": "@"

# Create VNF instance.
# POST  /vnflcm/v1/vnf_instances
"os_nfv_orchestration_api:vnf_instances:create": "rule:vnflcm_create_attrs_cmp and rule:manager_and_owner"

# Instantiate VNF instance.
# POST  /vnflcm/v1/vnf_instances/{vnfInstanceId}/instantiate
"os_nfv_orchestration_api:vnf_instances:instantiate": "rule:vnflcm_inst_attrs_cmp and rule:manager_and_owner"

# Query an Individual VNF instance.
# GET  /vnflcm/v1/vnf_instances/{vnfInstanceId}
"os_nfv_orchestration_api:vnf_instances:show": "rule:vnflcm_attrs_cmp and rule:owner"

# Terminate a VNF instance.
# POST  /vnflcm/v1/vnf_instances/{vnfInstanceId}/terminate
"os_nfv_orchestration_api:vnf_instances:terminate": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Heal a VNF instance.
# POST  /vnflcm/v1/vnf_instances/{vnfInstanceId}/heal
"os_nfv_orchestration_api:vnf_instances:heal": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Scale a VNF instance.
# POST  /vnflcm/v1/vnf_instances/{vnfInstanceId}/scale
"os_nfv_orchestration_api:vnf_instances:scale": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Query an Individual VNF LCM operation occurrence.
# GET  /vnflcm/v1/vnf_lcm_op_occs/{vnfLcmOpOccId}
"os_nfv_orchestration_api:vnf_instances:show_lcm_op_occs": "rule:admin_or_owner"

# Query VNF LCM operation occurrence.
# GET  /vnflcm/v1/vnf_lcm_op_occs
"os_nfv_orchestration_api:vnf_instances:list_lcm_op_occs": "rule:admin_or_owner"

# Query VNF instances.
# GET  /vnflcm/v1/vnf_instances
"os_nfv_orchestration_api:vnf_instances:index": "rule:vnflcm_attrs_cmp and rule:owner"

# Delete an Individual VNF instance.
# DELETE  /vnflcm/v1/vnf_instances/{vnfInstanceId}
"os_nfv_orchestration_api:vnf_instances:delete": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Update an Individual VNF instance.
# PATCH  /vnflcm/v1/vnf_instances/{vnfInstanceId}
"os_nfv_orchestration_api:vnf_instances:update_vnf": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Rollback a VNF instance.
# POST  /vnflcm/v1/vnf_lcm_op_occs/{vnfLcmOpOccId}/rollback
"os_nfv_orchestration_api:vnf_instances:rollback": "rule:admin_or_owner"

# Cancel a VNF instance.
# POST  /vnflcm/v1/vnf_lcm_op_occs/{vnfLcmOpOccId}/cancel
"os_nfv_orchestration_api:vnf_instances:cancel": "rule:admin_or_owner"

# Fail a VNF instance.
# POST  /vnflcm/v1/vnf_lcm_op_occs/{vnfLcmOpOccId}/fail
"os_nfv_orchestration_api:vnf_instances:fail": "rule:admin_or_owner"

# Retry a VNF instance.
# POST  /vnflcm/v1/vnf_lcm_op_occs/{vnfLcmOpOccId}/retry
"os_nfv_orchestration_api:vnf_instances:retry": "rule:admin_or_owner"

# Change external VNF connectivity.
# POST  /vnflcm/v1/vnf_instances/{vnfInstanceId}/change_ext_conn
"os_nfv_orchestration_api:vnf_instances:change_ext_conn": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Get API Versions.
# GET  /vnflcm/v2/api_versions
"os_nfv_orchestration_api_v2:vnf_instances:api_versions": "@"

# Create VNF instance.
# POST  /vnflcm/v2/vnf_instances
"os_nfv_orchestration_api_v2:vnf_instances:create": "rule:vnflcm_create_attrs_cmp and rule:manager_and_owner"

# Query VNF instances.
# GET  /vnflcm/v2/vnf_instances
"os_nfv_orchestration_api_v2:vnf_instances:index": "rule:vnflcm_attrs_cmp and rule:owner"

# Query an Individual VNF instance.
# GET  /vnflcm/v2/vnf_instances/{vnfInstanceId}
"os_nfv_orchestration_api_v2:vnf_instances:show": "rule:vnflcm_attrs_cmp and rule:owner"

# Delete an Individual VNF instance.
# DELETE  /vnflcm/v2/vnf_instances/{vnfInstanceId}
"os_nfv_orchestration_api_v2:vnf_instances:delete": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Modify VNF instance information.
# PATCH  /vnflcm/v2/vnf_instances/{vnfInstanceId}
"os_nfv_orchestration_api_v2:vnf_instances:update": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Instantiate VNF instance.
# POST  /vnflcm/v2/vnf_instances/{vnfInstanceId}/instantiate
"os_nfv_orchestration_api_v2:vnf_instances:instantiate": "rule:vnflcm_inst_attrs_cmp and rule:manager_and_owner"

# Terminate VNF instance.
# POST  /vnflcm/v2/vnf_instances/{vnfInstanceId}/terminate
"os_nfv_orchestration_api_v2:vnf_instances:terminate": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Scale VNF instance.
# POST  /vnflcm/v2/vnf_instances/{vnfInstanceId}/scale
"os_nfv_orchestration_api_v2:vnf_instances:scale": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Heal VNF instance.
# POST  /vnflcm/v2/vnf_instances/{vnfInstanceId}/heal
"os_nfv_orchestration_api_v2:vnf_instances:heal": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Change external VNF connectivity.
# POST  /vnflcm/v2/vnf_instances/{vnfInstanceId}/change_ext_conn
"os_nfv_orchestration_api_v2:vnf_instances:change_ext_conn": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Change VNF package.
# POST  /vnflcm/v2/vnf_instances/{vnfInstanceId}/change_vnfpkg
"os_nfv_orchestration_api_v2:vnf_instances:change_vnfpkg": "rule:vnflcm_attrs_cmp and rule:manager_and_owner"

# Create subscription.
# POST  /vnflcm/v2/subscriptions
"os_nfv_orchestration_api_v2:vnf_instances:subscription_create": "@"

# List subscription.
# GET  /vnflcm/v2/subscriptions
"os_nfv_orchestration_api_v2:vnf_instances:subscription_list": "@"

# Show subscription.
# GET  /vnflcm/v2/vnf_instances/{subscriptionId}
"os_nfv_orchestration_api_v2:vnf_instances:subscription_show": "@"

# Delete subscription.
# DELETE  /vnflcm/v2/vnf_instances/{subscriptionId}
"os_nfv_orchestration_api_v2:vnf_instances:subscription_delete": "@"

# List VnfLcmOpOcc.
# GET  /vnflcm/v2/vnf_lcm_op_occs
"os_nfv_orchestration_api_v2:vnf_instances:lcm_op_occ_list": "@"

# Show VnfLcmOpOcc.
# GET  /vnflcm/v2/vnf_lcm_op_occs/{vnfLcmOpOccId}
"os_nfv_orchestration_api_v2:vnf_instances:lcm_op_occ_show": "@"

# Retry VnfLcmOpOcc.
# POST  /vnflcm/v2/vnf_lcm_op_occs/{vnfLcmOpOccId}/retry
"os_nfv_orchestration_api_v2:vnf_instances:lcm_op_occ_retry": "@"

# Rollback VnfLcmOpOcc.
# POST  /vnflcm/v2/vnf_lcm_op_occs/{vnfLcmOpOccId}/rollback
"os_nfv_orchestration_api_v2:vnf_instances:lcm_op_occ_rollback": "@"

# Fail VnfLcmOpOcc.
# POST  /vnflcm/v2/vnf_lcm_op_occs/{vnfLcmOpOccId}/fail
"os_nfv_orchestration_api_v2:vnf_instances:lcm_op_occ_fail": "@"

# Delete VnfLcmOpOcc.
# DELETE  /vnflcm/v2/vnf_lcm_op_occs/{vnfLcmOpOccId}
"os_nfv_orchestration_api_v2:vnf_instances:lcm_op_occ_delete": "@"

角色示例

创建以下角色

根用户需要分配以下角色

区域管理器需要分配以下角色

区域经理和租户(区域)经理需要被分配以下角色

注意

“区域经理”和“租户(区域)经理”的区别在于拥有的项目。“租户(区域)经理”通常只有一个项目;而“区域经理”可以拥有多个项目。

租户经理需要被分配以下角色

租户用户需要被分配以下角色

租户(区域)用户需要被分配以下角色

供应商经理需要被分配以下角色: * manager * AREA_all@all * VENDOR_vendor_A (或 VENDOR_vendor_B) * TENANT_all

备选方案

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

由于在 Tacker 的先前版本中创建的资源可能没有增强的策略属性,如果增强的策略属性用作策略规则中的比较属性,则此规则将阻止用户访问没有这些属性的资源,因为比较结果始终为 false。

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Yuta Kazato <yuta.kazato.nw@hco.ntt.co.jp>

Hiromu Asahina <hiromu.asahina.az@hco.ntt.co.jp>

其他贡献者

Koji Shimizu <shimizu.koji@fujitsu.com>

Yoshiyuki Katada <katada.yoshiyuk@fujitsu.com>

Ayumu Ueha <ueha.ayumu@fujitsu.com>

新見雄介 <niimi.yusuke@fujitsu.com>

工作项

  • 实现 Tacker 以支持

    • 在资源创建时添加附加属性

    • 更改 API 流程以支持 Tacker 策略检查器

    • 将 Tacker 策略过滤器添加到 List API 流程中

    • 将特殊角色转换为上下文中 API 属性

    • 添加一个配置选项

    • 策略和角色示例

  • 添加新的单元和功能测试。

  • 编写 Tacker 文档以解释如何使用此规范中描述的功能。

依赖项

测试

将添加单元和功能测试,以涵盖本规范所需的案例。

文档影响

关于增强的 Tacker API 策略功能描述将被添加到 Tacker 用户指南中。

参考资料