KasperskyOS Community Edition 1.0

Политика безопасности решения в примере ping

Политика безопасности решения в этом примере разрешает запуск всех сущностей и позволяет любой сущности обращаться к сущностям Core и Server. При этом обращениями к сущности Server управляют методы модели безопасности Flow.

Конечный автомат, описанный в конфигурации объекта request_state модели безопасности Flow, имеет два состояния: ping_next и pong_next. Исходное состояние – ping_next. Разрешены только переходы из ping_next в pong_next и обратно.

При вызове методов Ping и Pong проверяется текущее состояние объекта request_state. В состоянии ping_next разрешен только вызов Ping, при этом состояние изменится на pong_next. Аналогично, в состоянии pong_next разрешен только вызов Pong, при этом состояние изменится на ping_next.

Таким образом, методы Ping и Pong разрешено вызывать только по очереди.

security.psl

/* Политика безопасности решения для демонстрации использования модели

* безопасности Flow в примере ping */

/* Включение PSL-файлов с формальными представлениями моделей безопасности

* Base и Flow */

use nk.base._

use nk.flow._

/* Создание объекта модели безопасности Flow */

policy object request_state : Flow {

type States = "ping_next" | "pong_next"

config = {

states : ["ping_next" , "pong_next"],

initial : "ping_next",

transitions : {

"ping_next" : ["pong_next"],

"pong_next" : ["ping_next"]

}

}

}

/* Запуск любых сущностей разрешен. */

execute {

grant ()

}

/* Любые запросы разрешены. */

request {

grant ()

}

/* Любые ответы разрешены. */

response {

grant ()

}

/* Включение EDL-файлов */

use EDL kl.core.Core

use EDL ping.Client

use EDL ping.Server

use EDL Einit

/* При запуске сущности Server инициировать эту сущность с конечным автоматом */

execute dst=ping.Server {

request_state.init {sid: dst_sid}

}

/* При вызове метода Ping проверить, что конечный автомат находится в состоянии ping_next.

Если это так, разрешить вызов метода Ping и перевести конечный автомат в состояние pong_next. */

request dst=ping.Server, endpoint=controlimpl.connectionimpl, method=Ping {

request_state.allow {sid: dst_sid, states: ["ping_next"]}

request_state.enter {sid: dst_sid, state: "pong_next"}

}

/* При вызове метода Pong проверить, что конечный автомат находится в состоянии pong_next.

Если это так, разрешить вызов метода Pong и перевести конечный автомат в состояние ping_next. */

request dst=ping.Server, endpoint=controlimpl.connectionimpl, method=Pong {

request_state.allow {sid: dst_sid, states: ["pong_next"]}

request_state.enter {sid: dst_sid, state: "ping_next"}

}