Пример ping
Пример ping демонстрирует использование политики безопасности решения для управления взаимодействиями между программами.
Пример ping включает в себя две программы: Client
и Server
.
Программа Server
предоставляет два идентичных метода Ping
и Pong
, которые получают число и возвращают измененное число:
Ping(in UInt32 value, out UInt32 result);
Pong(in UInt32 value, out UInt32 result);
Программа Client
вызывает оба этих метода в различной последовательности. Если вызов метода запрещен политикой безопасности решения, выводится сообщение Failed to call...
Транспортная часть примера ping практически аналогична таковой для примера echo. Единственное отличие состоит в том, что в примере ping используется два метода (Ping
и Pong
), а не один.
Политика безопасности решения в примере 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"}
}
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/ping
Сборка и запуск примера
См. "Сборка и запуск примеров".