5 месяцев назад История
    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 с ошибкой