安全服务更新用于正在使用的共享网络¶
https://blueprints.launchpad.net/manila/+spec/improve-security-service-update
https://blueprints.launchpad.net/manila/+spec/add-security-service-in-use-share-networks
Manila 安全服务是一种存储客户端配置以用于身份验证和授权的实体。它抽象了一组可被支持它的后端使用的配置数据,以配置可以加入特定身份验证域的服务器。
Manila 支持不同类型的安全服务,例如 LDAP、Kerberos 和 Microsoft Active Directory [1]。用户可以创建、更新、查看和删除安全服务,但是,为了应用其配置,manila 需要维护安全服务和共享网络之间的关联。然而,在共享网络开始被共享服务器使用后,无法提供这种关联或更新其任何参数。
此规范建议改进安全服务更新和共享网络与安全服务的关联,这将允许用户更新其共享网络以替换或添加新的安全服务,这可以反映在所有相关共享服务器的修改中。
问题描述¶
安全服务具有可能在仍然与共享服务器关联时发生更改的配置,导致后者过时并可能出现身份验证域问题。此外,用户将无法授予对驻留在这些共享服务器上的共享的访问权限,并且 Manila 没有提供一种简单的方法来更新此类配置,因为当前实现仅支持更新 name 和 description 属性 [2],因为它们不会影响共享服务器的配置。
同样,在配置了共享服务器后,无法更改共享网络与安全服务的关联,并且无法将新的身份验证服务器配置添加到已部署的共享服务器中。在这种情况下,用户只能创建新的共享网络,这些网络将用于创建新的共享服务器。
用例¶
安全服务属性,例如 dns 和 password,可能会因网络更改或密码更新策略而更改,从而影响一个或多个共享服务器。用户必须能够修改所有受影响的安全服务中的这些属性,这些属性必须反映所有关联共享服务器的配置更改。只有当其所有关联的共享服务器都支持该操作时,安全服务才有资格进行更新,否则必须拒绝。
此外,可能需要将新的安全服务与正在使用的共享网络关联,以便为希望使用不同的身份验证方法创建新共享的用户提供更大的灵活性。用户必须能够将新的安全服务关联包含到其共享网络中,这必须反映在所有关联共享服务器的安全服务更新中。只有当所有受影响的共享服务器都支持此功能时,才能配置新的安全服务关联。
本规范侧重于共享网络被共享服务器使用,并且用户请求更新或安全服务的新关联的两种情况,这将导致后端存储中的一个或多个共享服务器被更新。
提议的解决方案¶
为了解决这些用例,共享网络实体需要得到改进,以支持更新和关联新的安全服务,即使它已经在使用中。将添加一个新的 status 字段来表示共享网络的当前状态。在修改期间,共享网络将保持维护模式,这意味着后端配置正在更改。当所有受影响的资源完成各自的配置后,更新将完成。用户将能够检查共享网络的当前状态,并且在当前正在进行的修改期间,将被阻止请求可能受到影响的新操作。
为了使这些新操作起作用,正在提出以下更改
共享网络将具有一个新的
status属性;共享网络 API 将被更新,以允许关联和更新正在使用的共享网络的安全服务。API 也会被改进,以接受共享网络
reset-status操作。更新共享服务器模型,以包含一个新的功能,用于支持安全服务更新。
添加一个新的共享服务器状态,指示它正在进行网络修改。
将添加新的共享网络状态,以涵盖所有场景。
添加一个新的驱动程序接口,用于共享服务器更新;
添加一个新的后端功能,以识别支持此功能的驱动程序;
将添加一个新的共享网络属性,以指示它是否支持基于其共享服务器的功能的安全服务更新。
API 变更¶
在收到安全服务更新或关联请求时,API 将检查与共享网络关联的共享服务器是否存在。如果共享服务器列表不为空,API 需要检查新的共享网络属性 security_service_update_support,以查看是否可以完成请求,如果不支持则提前失败。
将创建一个新的 API 来处理安全服务更新,该更新将允许替换已配置的安全服务为另一个相同类型。
新的共享网络状态需要在许多其他资源的的操作中进行验证,最终导致后端更改。这些操作应等到关联的共享网络再次可用,才能继续进行新的修改。
共享 API 和管理器变更¶
共享网络更新可以是一对多操作,这可能会触发多个共享服务器更新,针对不同后端在不同的共享服务中。为了更新与共享网络关联的安全服务信息,共享 API 需要在继续请求之前验证所有受影响的资源是否正常。
之后,共享网络和共享服务器状态将被更新为 network_change,数据库中的共享网络和安全服务关联将被更新,并将调用相应的共享服务以启动后端更新。
共享管理器将负责更新共享服务器的后端详细信息,并使用相应的网络更新调用驱动程序接口。在共享服务器更新操作结束时,共享服务器的状态将相应更新,而共享网络仅在所有正在修改的共享服务器完成其配置后才会被更新。
如果更新最终失败,共享服务器状态将被设置为 error 以及所有受影响的共享访问规则。共享服务器的后端详细信息将保留最新的安全服务信息,但管理员需要检查存储系统中配置是否正确,然后使用 share-server-reset-state API 将状态重置为 active。网络状态不会受到后端驱动程序引发的错误影响,并且将在安全服务更新结束时将其状态更新为 active。
调度器功能¶
支持此功能的后端能够将 security_service_update_support 功能作为 True 向调度器报告,这可进一步用于选择支持它的后端池。
Manila 管理¶
通过向共享服务器模型添加新的功能,重要的是要考虑现有共享服务器需要在未来根据驱动程序支持更新此字段,以便启用此功能。这将通过为 manila-manage 工具提供一个新的管理命令来实现,该命令将允许管理员相应地更新其共享服务器。
备选方案¶
或者,安全服务资源可以处理更新操作并触发受影响的共享网络的所有共享服务器的后端修改。这种替代方案可能导致一次进行大量的后端修改,并且可能导致许多共享服务器失败,如果新的参数或关联无效。
影响¶
数据模型影响¶
将添加一个新的 security_service_update_support 功能字段到 manila.db.sqlalchemy.models.ShareServer,指示驱动程序和共享服务器所在的后端是否支持新的安全服务更新操作。在数据库迁移升级中,将添加一个新的列,默认值为 False,这意味着即使驱动程序支持,已部署的所有共享服务器都无法更新其安全服务配置。在数据库迁移降级中,该列将被删除。
将添加一个新的 status 字段到 manila.db.sqlalchemy.models.ShareNetwork,以保存将协助不同共享网络操作的新状态。目前,只能将三种状态分配给共享网络:active、error 和 network_change。只有当其状态为 active 时,共享网络才被认为正常且可供使用。状态 network_change 表示正在修改的共享网络,在再次变为 active 之前,无法更改或使用。对于无法在没有管理员干预的情况下恢复的特定故障场景,共享网络将收到一个 error 状态。
将添加一个新的 security_service_update_support 属性到 manila.db.sqlalchemy.models.ShareNetwork,以指示共享网络是否支持新的安全服务更新操作。此属性将继承其所有当前关联共享服务器的值。如果所有关联的共享服务器都支持 security_service_update_support,则共享网络属性将被设置为 True,否则将被设置为 False。
REST API 影响¶
共享服务器和共享网络视图将包含一个新的响应参数,即
security_service_update_support,它将指示共享服务器(或共享网络)是否能够更新安全服务配置。共享网络视图将包含一个新的
status参数,它将指示其当前状态。所有共享网络依赖操作将在 API 中被阻止,对于状态不同于
active的共享网络,以避免冲突的后端配置。共享网络 API 中预计会发生语义变化。将新的安全服务与正在使用的共享网络关联需要所有受更改影响的共享服务器都支持该操作,否则 API 将响应
403 Forbidden。如果目标共享服务不可用,API 将响应409 Conflict。将添加新的共享网络 API
share-network-security-service-update更新现有的安全服务关联
POST /v2/{project_id}/share-networks/{share_network_id}/action
Body
{ "update_security_service": { "current_service_id": "bab0debd-fa50-4ade-80c5-ce85e2fc2614", "new_service_id": "1ec35b2b-5d0c-4c46-a6ca-71f9eab49ce2" } }
响应
Code: 200 OK { "name": "my_network", "id": "620a1050-1711-4961-908a-bd6f7c0b1d00", "project_id": "f227b9e2cbdc40e78ed761e5e22c5fb4", "description": "This is my share network", "created_at": "2020-11-27T11:26:10.000000" "updated_at": null, "status": "network_change", "security_service_update_support": true, "share_network_subnets": [ { "created_at": "2020-11-27T11:26:10.000000", "id": "aa7a1269-703b-4832-a3df-17ed954c276c", "availability_zone": null, "segmentation_id": null, "neutron_subnet_id": "12c1490a-e82c-4f5e-bcb1-fb267a58cf10", "updated_at": null, "neutron_net_id": "998b42ee-2cee-4d36-8b95-67b5ca1f2109", "ip_version": null, "cidr": null, "network_type": null, "gateway": null, "mtu": null } ] }
如果提供的 new_service_id 与当前服务类型不相同,或者安全服务 ID 之一不存在,API 将响应 400 Bad Request。如果提供的 share-network-id 不存在,API 将响应
404 Not Found。如果至少一个目标共享服务不可用,API 将响应409 Conflict。share-network-reset-status:重置共享网络的状态
POST /v2/{project_id}/share-networks/{share_network_id}/action
Body
{ "reset_status": { "status": "active" } }
如果提供的 share-network-id 不存在,API 将响应
404 Not Found。如果用户没有执行此操作的权限,API 将响应403 Forbidden。
安全影响¶
无。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
无。
其他部署者影响¶
预计不会添加新的配置。
后端功能将帮助部署者识别支持新的安全服务关联的池。
所有现有的共享服务器都将将其
security_service_update_support设置为False,即使驱动程序支持它。新的共享服务器将根据驱动程序报告的后端功能设置相应的功能。管理员需要使用manila manage命令手动更新共享服务器的功能。
开发人员影响¶
无
驱动程序影响¶
对于不想支持提议功能的驱动程序,没有影响。
将包含一个新的驱动程序接口,以支持共享服务器安全服务更新。在此调用期间将提供共享服务器和网络信息。希望支持此操作的驱动程序需要实现此调用并将功能 security_service_update_support 作为 True 报告。
实现¶
负责人¶
- 主要负责人
- dviroel
工作项¶
实施核心更改,必须包括
添加共享网络和共享服务器模型属性;
更改 API 行为,以便将新的安全服务与共享网络关联;
创建新的共享网络 API 以更新安全服务和重置共享网络状态;
新的共享 API 接口,用于更新安全服务信息;
将包含新的驱动程序接口,以更新共享服务器网络配置;
将添加一个新的后端功能,用于支持共享驱动程序的安全服务关联。
第一方驱动程序中的实现
在 manila-tempest-plugin 中添加新的功能测试
为 share 服务器能力更新添加新的 manila-manage 命令
更新 manila 文档
依赖项¶
无。
测试¶
将根据社区标准添加/维护单元测试覆盖率。将添加新的 tempest 测试来涵盖新的安全服务关联场景。容器或虚拟驱动程序将得到改进,以正确配置安全服务,并用于验证提议的更改。
文档影响¶
以下 OpenStack 文档将更新以反映此更改
管理员指南:记录将新的安全服务关联应用于共享服务器的前提;
API 参考:包含 share 服务器新的状态和新的能力字段;
开发者参考:添加关于如何实现和添加对这个新功能的支持的信息。
参考资料¶
[1]: https://docs.openstack.org/manila/latest/admin/shared-file-systems-security-services.html
[2]: https://docs.openstack.org/api-ref/shared-file-system/#update-security-service