Компонент TLS Terminator

Компонент TLS Terminator, поставляемый в составе KasperskyOS Community Edition, обеспечивает защищенную передачу данных по сети между клиентом и сервером, используя протокол TLS (Transport Layer Security).

Компонент TLS Terminator встроен в сетевое взаимодействие между клиентом и сетевым VFS-бэкендом. Когда клиент использует сетевые функции из библиотеки libc, вызовы этих функций перенаправляются в компонент TLS Terminator. В компоненте TLS Terminator реализованы функции-обертки над стандартными вызовами сетевого VFS-бэкенда. Эти обертки обеспечивают установку TLS-соединений, шифрование исходящих данных перед их передачей в сетевой VFS-бэкенд и расшифровку входящих данных перед возвратом клиенту. Такая реализация компонента обеспечивает защиту данных при передаче по сети без необходимости изменения клиентского кода.

Принцип работы компонента TLS Terminator

Принцип работы компонента TLS Terminator

API библиотеки libc, поддерживаемый компонентом TLS Terminator

accept()

send()

bind()*

getprotobyname()*

close()

sendto()

fcntl()*

getprotobynumber()*

connect()

sendvec()

freeaddrinfo()*

getsockname()*

getsockopt()

setsockopt()

freeifaddrs()*

ioctl()*

poll()

shutdown()

getaddrinfo()*

listen()*

read()

socket()

gethostbyname()*

pipe()*

readv()

write()

getifaddrs()*

socketpair()*

recv()

writev()

getnameinfo()*

subscribe()*

recvfrom()

 

getnetbyname()*

sysctl()*

recvvec()

 

getpeername()*

 

Функции, отмеченные в таблице знаком *, имеют стандартное POSIX-поведение. Поведение остальных функции модифицируется компонентом TLS Terminator как указано в таблице ниже.

Модификация поведения функций библиотеки libc компонентом TLS Terminator

Функция libc

POSIX-поведение функции

Поведение функции при использовании TLS Terminator

accept()

Принимает запрос на подключение из очереди ожидающих соединений и создает новый дескриптор сокета для взаимодействия

  1. Принимает запрос на подключение из очереди ожидающих соединений.
  2. Выполняет TLS-рукопожатие (англ. TLS handshake) с клиентом.
  3. Создает новый дескриптор сокета для взаимодействия поверх TLS-соединения.

close()

Закрывает сокет

  1. Завершает TLS-соединение.
  2. Закрывает сокет.

connect()

Инициирует соединение на сокете

  1. Устанавливает TCP-соединение с сервером.
  2. Выполняет TLS-рукопожатие с сервером.
  3. Возвращает защищенный дескриптор сокета.

getsockopt()

Получает параметры сокета

  1. Получает параметры сокета.
  2. Поддерживает специфичные для TLS Terminator параметры, которые представлены в таблице ниже.

read(), readv(), recv(), recvfrom(), recvvec()

Получает данные от сервера

  1. Получает зашифрованные данные от сервера.
  2. Расшифровывает их через TLS-контекст.
  3. Возвращает расшифрованные данные клиенту.

send(), sendto(), sendvec()

Отправляет данные серверу

  1. Шифрует данные клиента через TLS-контекст.
  2. Отправляет зашифрованные данные серверу через TCP-соединение.

setsockopt()

Устанавливает параметры сокета

  1. Устанавливает параметры сокета.
  2. Поддерживает специфичные для TLS Terminator параметры, которые представлены в таблице ниже.

shutdown()

Завершает передачу данных по сокету

  1. Завершает TLS-соединение.
  2. Закрывает TCP-сокет.

socket()

Создает сокет для сетевого взаимодействия

  1. Создает сокет.
  2. Подготавливает TLS-контекст для последующего использования.

poll()

Отслеживает состояние файловых дескрипторов

  1. Отслеживает состояние TLS-сокетов.
  2. Учитывает состояние TLS-рукопожатия и готовность к шифрованию/расшифрованию.

write(), writev()

Отправляет данные серверу

  1. Шифрует исходящие данные с использованием TLS-контекста.
  2. Отправляет зашифрованные данные серверу.

Для функций getsockopt() и setsockopt() в компоненте TLS Terminator введено значение IPPROTO_TLS для параметра level, которое отсутствует в POSIX. Это значение определено в файле /opt/KasperskyOS-Community-Edition-<platform>-<version>/sysroot-*-kos/include/netinet/in.h из состава KasperskyOS Community Edition. Синтаксис функций:

int setsockopt(int socket, int level, int option_name, const void *option_value, socklen_t option_len);

int getsockopt(int socket, int level, int option_name, void *restrict option_value, socklen_t *restrict option_len);

Параметр level определяет уровень на котором задано наименование параметра сокета option_name. Если при вызове функций getsockopt() и setsockopt() параметр level равен IPPROTO_TLS, то компонент TLS Terminator обрабатывает доступные для этого уровня наименования параметра сокета option_name из таблицы ниже.

Наименования параметра сокета и соответствующее им поведение функций

Наименование параметра сокета

Поведение функции setsockopt()

Поведение функции getsockopt()

TLS_REMOTE_HOSTNAME

Устанавливает имя сервера, к которому осуществляется TLS-соединение. Это имя будет использовано в расширении SNI (Server Name Indication) при выполнении TLS-рукопожатия.

Получает имя сервера, к которому осуществляется TLS-соединение.

TLS_OCSP_STAPLING_CHECK

Включает проверку OCSP Stapling (подтверждение актуальности сертификата) для указанного клиентского сокета.

Параметр не обрабатывается.

TLS_SESSION_ID

Параметр не обрабатывается.

Получает идентификатор TLS-сеанса.

TLS_VERIFY_RESULT

Параметр не обрабатывается.

Возвращает результат проверки сертификата сервера в виде комбинации флагов ошибок.

Если предоставляемая по умолчанию функциональность компонента TLS Terminator недостаточна, то ее можно расширить с помощью механизма плагинов. Подробнее см. "Расширение функциональности TLS Terminator".

Состав компонента TLS Terminator

Компонент представляет собой набор следующих файлов:

В начало