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 资源进行细粒度访问控制的实现。
提议的变更¶
需要进行以下更改
在资源创建时添加额外的属性。
更改 API 流程以支持 Tacker 策略检查器。
将 Tacker 策略过滤器添加到 API 流程列表中。
将特殊角色转换为上下文中 API 属性。
添加一个配置选项。
策略和角色示例。
在资源创建时添加额外的属性¶
注册 Vim API
将一个区域属性放入请求参数 ‘extra’ 中。它将由后续 API 流程存储到 DB 中。
创建 VNF 实例 API v1/v2
从默认 Vim 获取区域属性,然后将其放入 VnfInstance 对象中的 VimConnectionInfo 对象的 ‘extra’ 字段中,然后将其存储到 DB 中。
实例化 VNF 实例 v1/v2
从请求体中的 vim_id 获取 Vim 信息,在 VimConnectionInfo 中。
从 Vim 信息中获取区域属性,然后将其放入 InstantiateVnfRequest 对象中的 VimConnectionInfo 对象的 ‘extra’ 字段中,然后将其存储到 DB 中。
注意
区域属性是一个区域-区域对。该属性的值是格式为 “area@region” 的字符串。
更改 API 流程以支持 Tacker 策略检查器¶
在当前实现中,Tacker API 流程在调用策略函数时没有传递被访问资源的属性。然而,这些属性是增强的 Tacker API 策略函数确定用户是否可以访问资源所必需的。因此,我们应该修改 API 流程。从数据库获取策略检查器所需的属性,并在调用时将其传递给策略检查器。
支持增强的 Tacker 策略的 API 流程中的策略检查流程。
第 3 步是专门的,需要由每个 API 流程自行实现。其他步骤是通用的或已经存在于所有需要更改的 API 流程中
Keystonemiddleware 会将包含用户角色(包括用户角色)的用户信息发送到 API 流程。特殊用户角色将在后续步骤中转换为用户属性。
API 流程从 TackerDB 获取被访问的资源。此步骤是现有的,不需要修改。
API 流程从被访问的资源中获取所需的资源属性。此步骤是新添加的。
API 流程使用被访问的资源属性调用策略检查函数。此步骤是现有的,但需要修改的是在调用策略检查函数时将资源属性作为调用参数添加。
上下文将特殊角色转换为用户属性。此步骤是新添加的,是否执行取决于以下部分中描述的配置选项 添加一个配置选项。有关转换规则,请参阅后面的部分 将特殊角色转换为 API 属性 以获取详细信息。
上下文使用资源属性和用户属性调用策略执行器。此步骤是现有的,不需要修改。
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 版本。
VNF 实例创建 API 流程需要更改:下表显示了策略检查器可以通过哪个 API 请求参数从哪个表查询所需的属性,并将其存储在哪个字段中。
属性
请求参数
表
字段
示例
vendor
vnfdId
vnf_package_vnfd
vnf_provider
“Company”
VNF 实例实例化 API 流程需要更改:下表显示了策略检查器可以通过哪个 API 请求参数从哪个表查询所需的属性,并将其存储在哪个字段中。
属性
请求参数
表
字段
示例
vendor
vnfdId
vnf_instances,VnfInstanceV2
vnf_provider,vnfProvider
“Company”
需要更改的以下 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 流程中的策略过滤器流程。
第 6 步是专门的,需要由每个 API 流程自行实现。其他步骤是通用的或已经存在于所有需要更改的 API 流程中
Keystonemiddleware 会将包含用户角色(包括用户角色)的用户信息发送到 API 流程。特殊用户角色将在后续步骤中转换为用户属性。
API 流程调用策略检查函数,不带资源属性。此步骤是现有的,不需要修改。
API 流程从数据库获取被访问的资源。此步骤是现有的,不需要修改。
API 流程从上下文中获取用户属性。此步骤是新添加的,并且是通用的。
上下文将特殊角色转换为用户属性,此步骤是新添加的,并且取决于以下部分中描述的配置选项 添加一个配置选项。有关转换规则,请参阅后面的部分 将特殊角色转换为 API 属性 以获取详细信息。
API 流程根据策略规则过滤 list 操作的结果。此步骤是新添加的。
API 流程将过滤后的结果返回给用户。此步骤是现有的,不需要修改。
需要更改的 List API 流程¶
对于 Vim list API,Tacker 策略过滤器支持以下属性。
属性
表
字段
示例
area
vims
extra
{“area”: “tokyo@japan”}
对于 VNF 包 list API,Tacker 策略过滤器支持以下属性。
属性
表
字段
示例
vendor
vnf_package_vnfd
vnf_provider
“Company”
对于 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 属性¶
特殊角色的命名规则¶
我们将定义一些特殊角色,这些角色的命名遵循以下规则。
角色名称由三部分组成:前缀 + “_” + [属性值/特殊值]
支持的前缀、属性值和特殊值如以下表所示
前缀 |
属性值 |
特殊值 |
示例 |
|---|---|---|---|
AREA |
area 值 |
||
VENDOR |
vendor 值 |
all |
VENDOR_vendor_A, VENDOR_all |
TENANT |
tenant 值 |
all |
TENANT_default, TENANT_all |
注意
由于“all”被视为特殊值,因此资源属性不能使用“all”作为属性值。
转换规则¶
在 Tacker 上下文中,我们将这些特殊角色转换为 API 属性并提供给 Tacker 策略。请参阅 更改 API 流程以支持 Tacker 策略检查器 和 将 Tacker 策略过滤器添加到 API 流程列表 本规范的章节以获取此更改的流程图。转换遵循以下规则
对于普通属性值,它们将直接转换为用户属性值。
前缀
属性名称
示例(特殊角色 -> 用户属性值)
AREA
area
AREA_tokyo@japan -> {“area”: [”tokyo@japan”]}
VENDOR
vendor
VENDOR_vendor_A -> {“vendor”: [“vendor_A”]}
TENANT
tenant 值
TENANT_default -> {“tenant”: [“default”]}
对于策略检查器中的特殊值,资源对应的属性值将被分配给用户。
前缀
属性名称
特殊值
示例(资源属性 -> 用户属性)
AREA
area
{“area”: “tokyo@japan”} -> {“area”: [”tokyo@japan”]}
AREA
area
相同的区域值
{"area": "tokyo@japan"} -> {"area": ["tokyo@japan"]}不同的区域值
any -> {"area": []}VENDOR
vendor
all
{“vendor”: “vendor_A”} -> {“vendor”: [“vendor_A”]}
TENANT
tenant 值
all
{“tenant”: “default”} -> {“tenant”: [“default”]}
对于策略过滤器中的特殊值“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": "@"
角色示例¶
创建以下角色
admin
member
reader
manager
VENDOR_vendor_A
VENDOR_vendor_B
VENDOR_all
TENANT_default
TENANT_tenant_A
TENANT_all
根用户需要分配以下角色
admin
manager
VENDOR_all
TENANT_all
区域管理器需要分配以下角色
manager
VENDOR_all
TENANT_all
区域经理和租户(区域)经理需要被分配以下角色
manager
AREA_area_A@region_A (或 AREA_area_B@region_A 或 AREA_area_A@region_B 或 AREA_area_B@region_B)
VENDOR_all
TENANT_all
注意
“区域经理”和“租户(区域)经理”的区别在于拥有的项目。“租户(区域)经理”通常只有一个项目;而“区域经理”可以拥有多个项目。
租户经理需要被分配以下角色
manager
VENDOR_all
TENANT_all
租户用户需要被分配以下角色
member 或 reader
VENDOR_all
TENANT_all
租户(区域)用户需要被分配以下角色
member 或 reader
AREA_area_A@region_A (或 AREA_area_B@region_A 或 AREA_area_A@region_B 或 AREA_area_B@region_B)
VENDOR_all
TENANT_all
供应商经理需要被分配以下角色: * 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 用户指南中。