向策略语言添加模态算子

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’)

  1. 操作描述:描述操作的效果

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[] 而不是 +/- 后缀。

参考资料