KasperskyOS Community Edition 1.1

Пример 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

Сборка и запуск примера

См. "Сборка и запуск примеров".