Тестирование политики безопасности решения на языке Policy Assertion Language (PAL)

Базовый сценарий использования Policy Assertion Language (PAL) – это создание тестовых сценариев для проверки политик безопасности решения, написанных с использованием PSL.

Язык PAL позволяет формировать и отправлять запросы в модуль безопасности, проверяя полученные решения на соответствие ожидаемым решениям. При этом для запуска тестовых сценариев, написанных на PAL, нет необходимости генерировать код клиент-серверных взаимодействий, так как PAL работает на уровне абстракции модуля безопасности.

Общий синтаксис

Тестовый сценарий является последовательностью запросов к модулю безопасности, для каждого из которых указано ожидаемое решение.

Тестовые сценарии можно объединять в группы. Группа сценариев может также содержать секции setup и finally, которые будут выполняться соответственно перед и после выполнения каждого сценария в этой группе. Это можно использовать для задания общих стартовых условий или для проверки общих инвариантов.

Для объявления группы тестовых сценариев используется блочная декларация assert:

assert "имя группы сценариев" {

setup {}

sequence "имя сценария 1" {}

sequence "имя сценария 2" {}

...

finally {}

}

Синтаксис запросов

Для конфигурирования запросов внутри тестовых сценариев используются декларации следующего вида:

<ожидание> <заголовок> <операция> <селекторы события> {сообщение}

Здесь:

Пример:

assert "some tests" {

sequence "first sequence" {

// При вызове сущностью Client метода Ping реализации интерфейса pingComp.pingImpl сущности Server ожидается решение grant

// При этом в аргументе value метода Ping передается значение 100

grant "Client calls Ping" request src=Client dst=Server endpoint=pingComp.pingImpl method=Ping {value: 100}

// Ожидается, что сущности Server запрещено отвечать на запросы сущности Client

deny "Server cannot respond" response src=Server dst=Client

}

}

Сокращенная форма запросов

Для удобства можно также применять следующие сокращенные формы запросов:

Пример:

assert "ping test"{

setup {

// переменная s содержит указатель на запущенный экземпляр сущности Server

s <- execute dst=ping.Server

// переменная c содержит указатель на запущенный экземпляр сущности Client

c <- execute dst=ping.Client

}

sequence "ping ping is denied" {

// При вызове сущностью Client метода Ping реализации интерфейса pingComp.pingImpl сущности Server ожидается решение grant

// При этом в аргументе value метода Ping передается значение 100

c ~> s : pingComp.pingImpl.Ping {value: 100 }

// При повторном вызове ожидается решение deny

deny c ~> s : pingComp.pingImpl.Ping {value: 100 }

}

sequence "normal" {

// При последовательном вызове методов Ping и Pong ожидаются решения grant

c ~> s : pingComp.pingImpl.Ping { value: 100 }

c ~> s : pingComp.pingImpl.Pong { value: 100 }

}

}

Запуск тестов

Чтобы запустить написанные на PAL тестовые сценарии, необходимо использовать флаг --tests run при запуске компилятора nk-psl-gen-c:

$ nk-psl-gen-c --tests run <другие параметры> ./security.psl

Компилятор nk-psl-gen-c сгенерирует код модуля безопасности и код тестовых сценариев, а затем скомпилирует их с помощью gcc и запустит.

Чтобы сгенерировать код тестовых сценариев, но не компилировать и запускать их, необходимо использовать флаг --tests generate.

В начало