Политики-правила и политики-выражения

В языке PSL используются политики безопасности двух типов: политики-правила и политики-выражения.

Наиболее часто в описании политики безопасности решения используются политики-правила: они возвращают решение "разрешено" или "запрещено". В отличие от них, политики-выражения возвращают некоторое значение – например, текущее состояние объекта класса, которое может использоваться в аргументах других политик, которые вызвали эту политику-выражение.

Политики-правила

Политика-правило возвращает решение "разрешено" или "запрещено".

Например:

/* Запуск сущности "Server" разрешен только если объект "flow_instance" находится в состоянии "ready_to_start". */

execute dst=Server {

flow_instance.allow {sid: dst_sid, states: ["ready_to_start"]}

}

Некоторые политики-правила могут изменять состояние объекта класса, методами которого они являются. Например, политика flow_instance.enter; переводит объект flow_instance в состояние, указанное в аргументе политики.

Политика enter изменит состояние объекта класса только если с событием не связаны другие политики или все связанные политики вернули решение "разрешено". Это правило действует для любых политик-правил, изменяющих состояние объекта.

Политики-выражения

Политика-выражение возвращает значение, которое может использоваться в аргументах других политик, которые вызывают эту политику-выражение.

Например, это значение может использоваться в декларации множественного выбора choice. Декларация choice позволяет связать событие с разными политиками-правилами в зависимости от значения, которое вернула политика-выражение.

Примером политики-выражения является политика query (), возвращающая текущее состояние объекта класса Flow:

/* При отправке запроса сущностью "ResourceDriver" будет проверено состояние объекта "service_flow".

Если "service_flow" находится в состоянии "started" или "stopped", то отправка запроса разрешена,

иначе – запрещена. */

request src=ResourceDriver {

choice (service_flow.query {sid: src_sid}) {

"started" : grant ()

"stopped" : grant ()

_ : deny ()

}

}

В начало