README.md

Общая информация

Условия задачи

Описание системы

Оговорка разработчика и условия использования

Применять только в учебных целях. Данный код может содержать ошибки, автор не несёт никакой ответственности за любые последствия использования этого кода. Условия использования и распространения - GPL лицензия (см. файл LICENSE).

Системные требования

Данный пример разработан и проверен на ОС Ubuntu 22.04, авторы предполагают, что без каких-либо изменений этот код может работать на любых Debian-подобных OS, для других Linux систем. Для MAC OS как минимум необходимо использовать другой менеджер пакетов. В Windows необходимо самостоятельно установить необходимое ПО или воспользоваться виртуальной машиной с Ubuntu (также можно использовать WSL версии не ниже 2).

Используемое ПО

Стандартный способ запуска демо-версии предполагает наличие установленного пакета docker (не ниже 25 версии), а также docker compose (входит в стандартный пакет Docker). Для автоматизации типовых операций используется утилита make, хотя можно обойтись и без неё, вручную выполняя соответствующие команды из файла Makefile в командной строке.

Другое используемое ПО (в Ubuntu будет установлено автоматически, см. следующий раздел):

  • python (желательно версия не ниже 3.8)
  • pipenv (для виртуальных окружений python, не ниже 3.8)

Для работы с кодом примера рекомендуется использовать VS Code или PyCharm.

В случае использования VS Code следует установить расширения

  • REST client
  • Docker
  • Python

Настройка окружения и запуск примера

Подразумевается наличие развернутой по предоставленному образцу машины с установленным и настроенным ПО.

Внимание! Первоначальная сборка всех микросервисов занимает около 30 минут на виртуальной машине c 2 CPU и 8ГБ оперативной памяти. К сожалению, не было возможности оптимизировать сборку :(

Если почему-то сервис запустить не удается, то посмотреть как это работает можно на скринкасте demo.mp4.

Альтернативно, демо можно посмотреть или скачать тут:

  • https://rutube.ru/video/private/7a9aa4dc56e3711a21fccc7bccedea43/?p=yy4WQSn2ybJ8YgbOLU9pww
  • https://disk.yandex.ru/i/LUoP4xagHcOmeA

Подготовка среды разработки:

sudo apt update
sudo apt install docker-compose-v2 make git

sudo gpasswd -a $USER docker
newgrp docker

Клонирование проекта:

git clone git@git.codenrock.com:xakaton-codenrock-1324/cnrprod1731695694-team-81678/cyberimmune-3.git project
cd project

Настройка окружения для запуска интеграционных тестов:

make dev-install

Теперь надо собрать и запустить все микросервисы:

make all

Запуск тестов политик безопасности

Это тесты на код, проверяющий проходит ли сообщение указанные политики безопасности.

make unit-tests

Вывод будет похож на:

[+] Running 3/0
 ✔ Container zookeeper  Running                                                                                                           0.0s
 ✔ Container broker     Running                                                                                                           0.0s
 ✔ Container monitor    Running                                                                                                           0.0s
        ? APP-TESTS/SUITES::ALL-TESTS
        ?   APP-TESTS/SUITES::Проверка полиси когда нет дополнительных ограничений.
  0.004 ✔     (true (check-policies test-policies (dict "source-service" "blah" "target-service" "foo")))
  0.000 ✔     (false (check-policies test-policies (dict "source-service" "foo" "target-service" "blah")))
  0.008 ✔   APP-TESTS/SUITES::Проверка полиси когда нет дополнительных ограничений.
        ?   APP-TESTS/SUITES::Проверка полиси когда есть ограничение по методам.
  0.000 ✔     (true (check-policies test-policies (dict "source-service" "blah" "target-service" "foo")))
  0.000 ✔     (false (check-policies test-policies (dict "source-service" "bar" "target-service" "foo")))
  0.000 ✔     (true (check-policies test-policies (dict "source-service" "bar" "target-service" "foo" "method" "open-car")))
  0.000 ✔     (false (check-policies test-policies (dict "source-service" "bar" "target-service" "foo" "method" "service-menu")))
  0.008 ✔   APP-TESTS/SUITES::Проверка полиси когда есть ограничение по методам.
  0.024 ✔ APP-TESTS/SUITES::ALL-TESTS

;; Summary:
Passed:     6
Failed:     0
Skipped:    0

Тесты проверяют тестовые политики безопасности. Реальные описаны в файле policies.lisp и выглядят примерно так:

(defpolicies *policies*
  (secure-channel -> access-control
                  :allowed-methods (car-occupy))
  
  (access-control -> features-lock
                  :allowed-methods (enable-features disable-features))
  
  (secure-channel -> travel
                  :allowed-methods (car-start car-stop))
  (access-control -> travel
                  :allowed-methods (get-tariff))
  
  (emergency-control -> route
                     :allowed-methods (is-route-ok))
  
  (route -> complexing
         :allowed-methods (car-coordinates))


  ;; Эти два модуля могут отвечать во модуль, который предоставляет API
  (access-control -> secure-channel
                  :allowed-methods (respond))
  (travel -> secure-channel
          :allowed-methods (respond)))

Здесь используется Domain Specific Language, придуманный специально для описания политик безопасности. Нет смысла тестировать реальные policy, достаточно убедиться что проверяющий код работает корректно.

Запуск end-to-end тестов

В отдельном терминале сделать

make logs

А в другом запустить end-to-end тесты:

make test

End-to-end теста успели реализовать только два. Их можно запускать по-отдельности.

Тест на успешный сценарий проката машины:

make test1

Полный лог запуска теста в файле test1.log.

Чтобы отследить обмен сообщениями между компонентами, можно отфильтровать сообщения модуля Monitor:

monitor            | <INFO> [2024-11-18T01:49:23.304067Z] common/kafka-rpc kafka-rpc.lisp (top level form.resend) Resending message secure-channel -> access-control: {"method":"car-occupy","person":"Иван Иванов","id":"84D43ECC-1DBD-472B-A7A2-CEF0C33018D7"}
monitor            | <INFO> [2024-11-18T01:49:23.319998Z] common/kafka-rpc kafka-rpc.lisp (top level form.resend) Resending message access-control -> secure-channel: {"result":{"access":true,"car":"Toyota","message":"hour"},"id":"0437A59F-5AD3-478D-A108-02366C019781","in-reply-to":"84D43ECC-1DBD-472B-A7A2-CEF0C33018D7","method":"respond"}
monitor            | <INFO> [2024-11-18T01:49:23.335428Z] common/kafka-rpc kafka-rpc.lisp (top level form.resend) Resending message secure-channel -> travel: {"method":"car-start","brand":"Toyota","occupied-by":"Иван Иванов","id":"AE0B21F3-02FC-4602-A220-B5D16B152D60"}
monitor            | <INFO> [2024-11-18T01:49:23.348431Z] common/kafka-rpc kafka-rpc.lisp (top level form.resend) Resending message travel -> secure-channel: {"result":{"message":"Toyota поездка началась"},"id":"45B0FBCF-16CC-4DCE-AA3E-87B27DFA3E2A","in-reply-to":"AE0B21F3-02FC-4602-A220-B5D16B152D60","method":"respond"}
monitor            | <INFO> [2024-11-18T01:49:28.368609Z] common/kafka-rpc kafka-rpc.lisp (top level form.resend) Resending message secure-channel -> access-control: {"method":"car-occupy","person":"Иван Иванов","id":"1BB69FF0-6D9A-43BA-8BA3-567A257389C6"}
monitor            | <INFO> [2024-11-18T01:49:28.384388Z] common/kafka-rpc kafka-rpc.lisp (top level form.resend) Resending message access-control -> secure-channel: {"result":{"access":true,"car":"Toyota","message":"hour"},"id":"8E1E7B63-0FCF-4072-9E30-949C16A1A489","in-reply-to":"1BB69FF0-6D9A-43BA-8BA3-567A257389C6","method":"respond"}
monitor            | <INFO> [2024-11-18T01:49:28.399705Z] common/kafka-rpc kafka-rpc.lisp (top level form.resend) Resending message secure-channel -> travel: {"method":"car-stop","brand":"Toyota","id":"1A8172CA-ABC3-47C2-AC72-F09366302BA8"}
monitor            | <INFO> [2024-11-18T01:49:28.430874Z] common/kafka-rpc kafka-rpc.lisp (top level form.resend) Resending message travel -> secure-channel: {"result":{"message":"Toyota поездка завершена","invoice_id":1},"id":"C2322475-133E-455D-BD1E-50435A0B9EC2","in-reply-to":"1A8172CA-ABC3-47C2-AC72-F09366302BA8","method":"respond"}

Второй тест совсем простой, он проверяет, что если какая-то из компонент попробует отправить сообщение компоненту с которым общаться нельзя, то monitor это заблокирует.

Запуск одного только этого теста:

make test2

приведет к появлению такой строчки в логе:

monitor            | <ERROR> [2024-11-18T01:53:06.201064Z] app core.lisp (top level form.on-message) Message from secure-channel to emergency-control was blocked because of security policies

Очистка после завершения работы

make clean
Описание

Решение команды-бронзового призёра хакатона по кибериммунной разработке 3.0 (ноябрь, 2024)

Конвейеры
0 успешных
0 с ошибкой