1. 快速开始
到现在为止,你应该对 OPA 诞生的原因,它试图解决的问题,以及它的设计和管理方式有了相当清晰的认识。现在是试水的时候了,看看用 Rego 语言创建一个策略是什么样子。第一步是用简单的英语定义你的策略。比如说:“客户应该能够查看自己的付款。财务部门的工作人员应该能够查看任何客户的付款。”
下一步是将策略转换为 Rego 代码。我们可以使用 Rego playground 来做这件事。因此,在主面板中,清除那里已经添加的代码,并添加以下内容。
package play
# Customers should be able to view their own payments
allow = true {
input.method = "GET"
input.path = ["payments", customer_id]
input.user = customer_id
}
让我们逐行回顾这个片段。
任何以哈希符号(#)开头的行都是注释。把你的策略应该做的事情写成连贯的、可供人类阅读的注释,总是一个好的做法。 allow = true 意味着如果以下的 “评估 “为真,决策将被允许。 输入方法是 GET。任何其他 HTTP 方法(POST、PUT 等)都会违反策略。 路径是 /payments/customer_id。注意,customer_id 没有加引号,这意味着它是一个变量,需要在调用时被替换。 用户也应该是 customer_id。 如果我们把这段代码翻译成普通英语,它看起来就像这样。
“如果请求使用的方法是 GET,路径是 /payments/customer_id,并且用户是同一个 customer_id,则允许该请求。这实际上允许客户查看自己的支付数据。”
Rego playground 还允许你评估你的代码,并确保该策略将按预期工作。在 INPUT 面板中,我们可以通过添加以下代码来伪造一个合法请求。
{
"method": "GET",
"path": ["payments","bob"],
"user": "bob"
}
注意,INPUT 使用的是任意的 JSON。在提供请求时,没有特定的规则可以遵循。现在,让我们看看 OPA 将如何通过按下 Evaluate 按钮来响应这个决策请求。OUTPUT 面板应该显示如下内容。
{
"allow": true
}
下面是执行上述步骤后的 playground 截图。
现在,让我们试着把请求中的用户改为 alice,这意味着一个客户正试图查看另一个客户的付款。如果我们按 Evaluate 键,你会发现输出显示一个空的 JSON 对象 {}。原因是,OPA 不知道当策略不匹配时应该发送什么。要改变这种行为,在策略的主体前添加以下语句。
default allow = false
因此,整个策略应该是这样的。
package play
# Customers should be able to view their own payments
default allow = false
allow = true {
input.method = "GET"
input.path = ["payments", customer_id]
input.user = customer_id
}
现在,如果你按下 Evaluate,你会看到预期的输出。
{
"allow": false
}
请注意,这个 playground 非常强大,你可以选择策略的一部分,并独立于策略的其他部分进行评估。当你有一个复杂的策略,当它不应该被评估为假时,这可能是超级有用的。在这种情况下,你可以选择策略的部分内容,看看到底哪里出现了缺陷。
好了,现在我们已经执行了策略的第一部分,让我们继续第二部分:财务部门的工作人员应该能够查看任何客户的付款。
在我们之前定义的策略后面添加以下几行。
财务部门的工作人员可以查看任何客户的付款。
allow = true {
input.method = "GET"
input.path = ["payments", customer_id]
finance[input.user]
}
finance = {"john","mary","peter","vivian"}
这个策略的大部分内容与之前的相似,除了第 4 行。我们不是评估用户 ID 是否与客户 ID 相同,而是评估用户是否是财务 JSON 对象的一部分。Rego 有很多内置结构,允许你做很多有用的事情,包括查找。最后,我们定义财务对象并添加在该组中工作的员工的用户名。在现实世界中,这个 JSON 对象将作为 INPUT 请求的一部分或作为一个标记传递。现在,让我们通过将用户和客户设置为相同的名字(例如,Bob)来测试该策略。该策略应该返回 true。将用户改为 john(他是财务部门的一部分),并测试该策略。同样,它应该返回真。最后,将用户改为不在财务部门工作的任何名字(比方说,jane),该策略应该返回错误。
你可以 参考官方文档,阅读更多关于 Rego 语言和你能用它做什么。