В языке 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 ()
}
}
В начало