Пример Secure Login (Civetweb, TLS-terminator)
Пример Secure Login
демонстрирует использование паттерна Information Obscurity. Пример демонстрирует возможность передачи критической для системы информации через недоверенную среду.
Архитектура примера
В примере имитируется получение удаленного доступа к IoT-устройству посредством передачи этому устройству учетных данных пользователя (имени пользователя и пароля). Недоверенной средой внутри IoT-устройства является веб-сервер, который обслуживает запросы пользователей. Практика показывает, что такой веб-сервер является легко обнаруживаемым и зачастую успешно атакуемым, так как IoT-устройства не имеют встроенных средств защиты от проникновения и других атак. Кроме того, пользователи получают доступ к IoT-устройству через недоверенную сеть. Очевидно, что в таких условиях для защиты учетных данных пользователя от компрометации необходимо использовать криптографические алгоритмы.
С точки зрения архитектуры в таких системах можно выделить следующие субъекты:
- Источник данных: браузер пользователя.
- Точка коммуникации с устройством: веб-сервер.
- Подсистема обработки информации от пользователя: подсистема аутентификации.
При этом для использования криптографической защиты необходимо выполнить следующие шаги:
- Обеспечить взаимодействие источника данных и устройства по протоколу HTTPS. Это позволит избежать "прослушивания" HTTP-трафика и атак типа MITM (man in the middle).
- Выработать между источником данных и подсистемой обработки информации общий секрет.
- Использовать этот секрет для шифрования информации на стороне источника данных и расшифровки на стороне подсистемы обработки информации. Это позволит избежать компрометации данных внутри устройства (в точке коммуникации).
Пример Secure Login
включает следующие компоненты:
- Веб-сервер
Civetweb
(недоверенный компонент, программаWebServer
). - Подсистему аутентификацию пользователей (доверенный компонент, программа
AuthService
). - TLS-терминатор (доверенный компонент, программа
TlsEntity
). Этот компонент поддерживает транспортный механизм TLS (transport layer security). TLS-терминатор совместно с веб-сервером поддерживают протокол HTTPS на стороне устройства (веб-сервер взаимодействует с браузером через TLS-терминатор).
Процесс аутентификации пользователя происходит по следующей схеме:
- Пользователь открывает в браузере страницу по адресу
https://localhost:1106
(при запуске примера на QEMU) или по адресуhttps://<IP-адрес Raspberry Pi>:1106
(при запуске примера на Raspberry Pi 4 B). HTTP-трафик между браузером и TLS-терминатором будет передаваться в зашифрованном виде, а веб-сервер будет работать с открытым HTTP-трафиком.В примере используется самоподписанный сертификат, поэтому большинство современных браузеров сообщит о незащищенности соединения. Нужно согласиться использовать незащищенное соединение, которое тем не менее будет зашифрованным. В некоторых браузерах возможно возникновение сообщения
"TLS: Error performing handshake: -30592: errno = Success"
. - Веб-сервер
Civetweb
, запущенный в программеWebServer
, отображает страницуindex.html
, содержащую приглашение к аутентификации. - Пользователь нажимает на кнопку
Log in
. - Программа
WebServer
обращается к программеAuthService
по IPC для получения страницы, содержащей форму ввода имени пользователя и пароля. - Программа
AuthService
выполняет следующие действия:- генерирует закрытый ключ, открытые параметры, а также вычисляет открытый ключ по алгоритму Диффи-Хеллмана;
- создает страницу
auth.html
с формой ввода имени пользователя и пароля (код страницы содержит открытые параметры и открытый ключ); - передает полученную страницу программе
WebServer
по IPC.
- Веб-сервер
Civetweb
, запущенный в программеWebServer
, отображает страницуauth.html
с формой ввода имени пользователя и пароля. - Пользователь заполняет форму и нажимает на кнопку
Submit
(корректные данные для аутентификации содержатся в файлеsecure_login/auth_service/src/authservice.cpp
). - Код страницы
auth.html
, который исполняется на стороне браузера, осуществляет следующие действия:- генерирует закрытый ключ, вычисляет открытый ключ и общий секретный ключ по алгоритму Диффи-Хеллмана;
- выполняет шифрование пароля операцией
XOR
с использование общего секретного ключа; - передает веб-северу имя пользователя, зашифрованный пароль и открытый ключ.
- Программа
WebServer
обращается к программеAuthService
по IPC для получения страницы, содержащей результат аутентификации, передавая имя пользователя, зашифрованный пароль и открытый ключ. - Программа
AuthService
выполняет следующие действия:- вычисляет общий секретный ключ по алгоритму Диффи-Хеллмана;
- расшифровывает пароль с использованием общего секретного ключа;
- возвращает страницу
result_err.html
или страницуresult_ok.html
в зависимости от результата аутентификации.
- Веб-сервер
Civetweb
, запущенный в программеWebServer
, отображает страницуresult_err.html
или страницуresult_ok.html
.
Таким образом, конфиденциальные данные передаются через сеть и веб-сервер только в зашифрованном виде. Кроме того, весь HTTP-трафик передается через сеть в зашифрованном виде. Для передачи данных между компонентами используются взаимодействия по IPC, которые контролируются модулем Kaspersky Security Module.
Unit-тестирование с использованием фреймворка GoogleTest
Помимо паттерна Information Obscurity пример Secure Login
демонстрирует использование фреймворка GoogleTest для выполнения unit-тестирования программ, разработанных под KasperskyOS (KasperskyOS Community Edition содержит в своем составе этот фреймворк).
Исходный код тестов находится по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/secure_login/tests
Эти unit-тесты предназначены для верификации некоторых cpp-модулей подсистемы аутентификации и веб-сервера.
Чтобы запустить тестирование, выполните следующие действия:
- Перейдите в директорию с примером
Secure Login
. - Удалите директорию
build
с результатами предыдущей сборки, выполнив команду:sudo rm -rf build/
- Откройте файл скрипта
cross-build.sh
в текстовом редакторе. - Добавьте в скрипт флаг сборки
-D RUN_TESTS="y" \
(например, после флага сборки-D CMAKE_BUILD_TYPE:STRING=Release \
). - Сохраните файл скрипта, а затем выполните команду:
$ sudo ./cross-build.sh
Тесты выполняются в программе TestEntity
. Программы AuthService
и WebServer
не запускаются, поэтому при выполнении тестирования пример нельзя использовать для демонстрации паттерна Information Obscurity.
После завершения тестирования выводятся результаты выполнения тестов.
Файлы примера
Код примера и скрипты для сборки находятся по следующему пути:
/opt/KasperskyOS-Community-Edition-<version>/examples/secure_login
Сборка и запуск примера
Чтобы запустить пример на QEMU, перейдите в директорию с примером, соберите пример и выполните следующие команды:
$ cd build/einit
# Перед выполнением следующей команды убедитесь, что путь к
# директории с исполняемым файлом qemu-system-aarch64 сохранен в
# переменной окружения PATH. В случае отсутствия
# добавьте его в переменную PATH.
$ qemu-system-aarch64 -m 2048 -machine vexpress-a15 -nographic -monitor none -net nic,macaddr=52:54:00:12:34:56 -net user,hostfwd=tcp::1106-:1106 -sd sdcard0.img -kernel kos-qemu-image
Также см. "Сборка и запуск примеров".