Neutron/Make-authz-orthogonal
使 Quantum 授权可配置
请注意,此规范仍在草稿阶段。欢迎您尽早提供反馈。
高级描述
Quantum 代码库现在有点“污染”,策略检查分散在数据库逻辑甚至插件逻辑中。虽然这本身并不有害,但它有一些缺点:1) policy.json 中的策略风格没有统一性 2) 理解授权的工作方式并不容易,因为检查可能在代码的其他地方 3) 开发人员必须显式地关注 authZ 逻辑,这与“业务”逻辑混合在一起 4) 用户很难通过编辑 policy.json 来理解如何在他们的设置中调整 authZ。
因此,此蓝图的目的是将授权与请求处理解耦。我们现在的情况是,代码中显式执行了几个策略检查
salvatore@ubuntu:~/git/quantum$ find ./quantum/db ./quantum/plugins ./quantum/extensions -name \*.py | xargs grep -n "policy.check" ./quantum/db/l3_db.py:775: return policy.check(context, ./quantum/db/servicetype_db.py:205: return policy.check(context, ./quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py:806: return policy.check(context, action, resource) ./quantum/plugins/nec/nec_plugin.py:139: return policy.check(context, action, resource) ./quantum/plugins/linuxbridge/lb_quantum_plugin.py:275: return policy.check(context, action, resource) ./quantum/plugins/hyperv/hyperv_quantum_plugin.py:197: return policy.check(context, action, resource) ./quantum/plugins/bigswitch/plugin.py:1233: return policy.check(context, action, resource) ./quantum/plugins/openvswitch/ovs_quantum_plugin.py:347: return policy.check(context, action, resource) ./quantum/plugins/brocade/QuantumPlugin.py:447: return policy.check(context, action, resource) salvatore@ubuntu:~/git/quantum$ find ./quantum/db ./quantum/plugins ./quantum/extensions -name \*.py | xargs grep -n "policy.enforce" ./quantum/db/l3_db.py:320: policy.enforce(context, ./quantum/db/l3_db.py:400: policy.enforce(context, ./quantum/db/l3_db.py:780: return policy.enforce(context, ./quantum/plugins/nicira/nicira_nvp_plugin/QuantumPlugin.py:809: return policy.enforce(context, action, resource) ./quantum/plugins/nec/nec_plugin.py:142: policy.enforce(context, action, resource) ./quantum/plugins/linuxbridge/lb_quantum_plugin.py:278: policy.enforce(context, action, resource) ./quantum/plugins/hyperv/hyperv_quantum_plugin.py:200: policy.enforce(context, action, resource) ./quantum/plugins/bigswitch/plugin.py:1236: policy.enforce(context, action, resource) ./quantum/plugins/openvswitch/ovs_quantum_plugin.py:350: policy.enforce(context, action, resource) ./quantum/extensions/agentscheduler.py:43: policy.enforce(request.context, ./quantum/extensions/agentscheduler.py:52: policy.enforce(request.context, ./quantum/extensions/agentscheduler.py:61: policy.enforce(request.context, ./quantum/extensions/agentscheduler.py:72: policy.enforce(request.context, ./quantum/extensions/agentscheduler.py:81: policy.enforce(request.context, ./quantum/extensions/agentscheduler.py:92: policy.enforce(request.context, ./quantum/extensions/agentscheduler.py:103: policy.enforce(request.context, ./quantum/extensions/agentscheduler.py:114: policy.enforce(request.context,
导致 policy.json 中显式的策略操作
"extension:provider_network:view": "rule:admin_only", "extension:provider_network:set": "rule:admin_only", "extension:router:view": "rule:regular_user", "extension:router:set": "rule:admin_only", "extension:router:add_router_interface": "rule:admin_or_owner", "extension:router:remove_router_interface": "rule:admin_or_owner", "extension:port_binding:view": "rule:admin_only", "extension:port_binding:set": "rule:admin_only",
一旦实施此蓝图,authZ 策略处理应该完全发生在基础控制器类中,或者(参见下面的工作项列表)移动到单独的 authZ 中间件中,从而使 authZ 也可插拔。
工作项
- 1 - 确保策略引擎可以处理成员操作的 authZ,例如 add_router_interface
- 2 - 允许策略引擎处理扩展资源
- 3 - 允许基础控制器执行“查看”authZ 检查(根据当前权限删除不应可见的字段)
- 4 - 确保所有扩展使用基础控制器/资源框架(特别是代理扩展)
- 5 - 将 authZ 处理从基础控制器移动到 wsgi 管道中的单独中间件(这可能会使 #4 不必要)。
请注意,目前此蓝图将致力于前四个项目,因为第五个项目的可行性尚未评估。
API 变更
无变更
数据模型变更
无变更
策略文件变更
Policy.json 不再拥有“extension:”规则,这些规则将被替换为如下规则
"create_network:provider:network_type": "rule:admin_only"
插件变更
在此蓝图结束时,不应有任何插件具有显式检查或强制执行 authZ 策略的代码