Open Policy Agent (OPA) Rego — доступ к вложенным полям объекта ввода во время выполнения

#open-policy-agent #rego

#open-policy-agent #rego

Вопрос:

Я пытаюсь создать несколько общую политику rego, которая может оценивать поле вложенного объекта, заданное из входных данных. Например:

 field_from_input := "spec.securityContext.runAsRoot"

violation[{"msg": msg}] {
  fields := split(field_from_input, ".")
  # Somehow get the inner "runAsRoot" field value
  nested_value := input.object[fields]
  nested_value == "test"
  msg := "some message..."
}
 

Я пытался использовать встроенные функции «object.filter» и «json.filter», но они, похоже, не работают для вложенных атрибутов.
Я также пытался разделить путь атрибута на «.» и каким-то образом выполнить итерацию объекта по полям, но безуспешно.

Любая помощь будет высоко оценена.

Ответ №1:

Это кажется хорошим примером для walk встроенного. Использование этого для обхода объекта позволяет вам проверять как путь, так и / или значение на соответствие любым условиям, которые вы можете пожелать.

 package play

spec := {
    "securityContext": {
        "runAsRoot": true,
    },
}

violation[{"msg": msg}] {
    walk(spec, [path, value])
    node := path[count(path) - 1]
    
    node == "runAsRoot"
    value == true

    msg := "some message..."
}
 

Смотрите Пример игровой площадки здесь.