向策略语言添加模态算子¶
https://blueprints.launchpad.net/congress/+spec/modal-operators-for-policy
为了表达访问控制策略和反应性执行策略,我们需要将诸如‘execute’(执行)和‘permit’(允许)之类的模态算子添加到语言中。模态算子是应用于语言中的字面量或规则的标识符,因此在没有特殊语法支持的情况下,自然无法对其进行编码。
问题描述¶
此更改启用示例策略片段
1) 反应性策略:描述 Congress 应该在何时执行哪些操作/API 调用。
- execute[nova:disconnectNetwork(vm, net)] :-
nova:virtual_machine(vm), nova:network(vm, net), bad_network(vm, net)
2) 访问控制策略:描述其他组件何时被允许执行某些操作/API 调用。
- permit[nova:disconnectNetwork(vm, net)] :-
nova:owner(vm, owner), role(owner, ‘admin’)
操作描述:描述操作的效果
- delete[nova:network(vm, net)] :-
execute[nova:disconnectNetwork(vm, net)]
提议的变更¶
此更改需要修改语法,以便允许上述结构。为此,我们希望将‘rule’(规则)的定义修改为如下所示。
rule ::= modal_list COLONMINUS modal_list modal_list ::= modal (COMMA literal)* modal ::= literal | ID LBRACKET literal RBRACKET
我们还需要更改 compile.py:Literal 类,使其具有一个字段‘modal’,该字段要么为 None,要么为 ID(字符串)。
我们还需要更改 unifier(统一器),以便在进行统一时检查‘modal’字段。
最后,我们需要引入功能,以便能够查询所有 x,使得 execute[x] 在当前状态下为真。一种选择是在 Runtime(运行时)中构造一个特殊函数;另一种选择是扩展模态的定义,使其能够接受变量,如下所示,并相应地修改 unifier 和 runtime.py:TopDownTheory.top_down_eval 例程。
modal ::= literal | ID LBRACKET literal RBRACKET | ID LBRACKET ID RBRACKET
备选方案¶
目前,我们编写操作描述的方式是在表名上使用 + 和 - 作为后缀,分别表示插入和删除。这不能很好地扩展到其他模态,例如‘execute’和‘permit’。
目前的原型代码假定可以根据规则所在的策略识别要‘execute’的内容和要‘permit’的内容。为实现此功能使用单独的策略是一个糟糕的解决方案,因为多个策略应该能够表示多个策略作者对策略的贡献——单个策略应该能够包含反应性策略、访问控制策略、错误策略和操作描述。
此外,我们当前用于处理操作描述并在实现模拟时使用的功能使用‘consequences’(后果)构造来计算执行给定操作后插入和删除的所有字面量。‘consequences’功能在计算上是昂贵的,因为它计算策略中所有表的内容。一旦单个策略包含的操作描述之外的内容,我们就无法使用‘consequences’功能。
策略¶
请参阅上面的用例。
策略操作¶
N/A
数据源¶
N/A
数据模型影响¶
由于规则以字符串形式存储在 DB(数据库)中,因此不需要。
REST API 影响¶
由于策略片段作为字符串传递,因此不需要。
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
无
性能影响¶
无
其他部署者影响¶
无
开发者影响¶
无
实现¶
负责人¶
- 主要负责人
<launchpad-id 或 None>
- 其他贡献者
<launchpad-id 或 None>
工作项¶
修改语法如上所述
更改解析器以读取新语法
更改运行时以正确地与模态进行统一
添加模态级别查询,例如,查找所有 x,使得 execute[x]
依赖项¶
N/A
测试¶
单元测试就足够了。确保新的语法结构可以在任何地方使用,并且当新的语法结构到位时,运行时会产生正确的结果。
文档影响¶
此更改不需要最终用户文档。但是,对于使用此更改的功能,将需要文档,例如,simulation() 文档将更改为描述使用 insert[]/delete[] 而不是 +/- 后缀。
参考资料¶
无