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

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

Конечный автомат, описанный в конфигурации объекта request_state, имеет два состояния: 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". */

/* Импорт файла с объявлением псевдонимов базовых политик

и файла с объявлением класса политик "flow" (finite-state machine). */

use nk.base._

use nk.flow._

/* Создание объекта класса "flow". Имя нового объекта: request_state. */

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 разрешены. */

request {

grant ()

}

/* Сообщения типа response разрешены. */

response {

grant ()

}

/* Объявление сущностей. */

use EDL kl.core.Core

use EDL Client

use EDL Server

use EDL Einit

/* При запуске сущности "Server" перевести request_state в начальное состояние. */

execute dst=Server {

request_state.init {sid: dst_sid}

}

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

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

request dst=Server, endpoint=pingComp.pingImpl, method=Ping {

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

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

}

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

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

request dst=Server, endpoint=pingComp.pingImpl, method=Pong {

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

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

}

В начало