Как сделать сетевое соединение в приложении безопасным?

Сетевое соединение в приложении: ключ к безопасности

Сетевое соединение в приложении: ключ к безопасности

Чтобы создать успешное приложение, нужно учесть много факторов. Сетевое соединение и его безопасность — один из них. Рассмотрим этот вопрос и подберём надёжный способ решения для всех ОС.

Модель OSI

Стек протоколов передачи данных включает в себя модель OSI (сетевую модель базовой эталонной модели взаимодействия открытых систем ISO/OSI). Всего в этой модели 7 уровней, каждый из которых абстрагирован от других.

Всё, что передаётся со 2 уровня и далее (включительно) может быть перехвачено. Однако способы атак разные. Рассмотрим всё по порядку.

1 — физический уровень, в котором единицей нагрузки выступает бит. Фактически, включает в себя только нули и единицы. На данном уровне работают провода, патч панели, сетевые адаптеры. Последние принимают последовательность бит и передают её дальше.

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

2 — канальный уровень (data link), в котором единицей нагрузки выступает кадр. Здесь появляется адресация (на MAC адрес). Цель процессов этого уровня — сохранить целостность кадров в процессе доставки их адресату. Обычно на канальном уровне используется протокол ARP. Устройства данного уровня — это коммутаторы, мосты и драйверы сетевых адаптеров.

Атаки: перехват фреймов; поступление на коммутатор фрейма с чужим MAC-адресом; подмена одного хоста другим (компрометация на ARP); рост доли широковещательного трафика от 20% (broadcast storm); попытка подмены VLAN.

Признаки атаки: текущий MAC-адрес или идентификатор не совпадают ни с одним из элементов списка; заранее установленный порог частоты какого-либо узла повышается и (или) переходит на другой узел; рост числа приходящих на интерфейс коммутатора фреймов с чужим MAC-адресом; превышаются допустимые лимиты числа широковещательных фреймов; появляются фреймы со значением VLAN ID, не соответствующим вашему.

3 — сетевой уровень, в котором единицей нагрузки выступает пакет. Протокол, с которым можно столкнуться на этом уровне чаще всего, — IP (и 32-битные IP-адреса). В отличие от второго уровня, на третьем можно использовать маршрутизацию — направлять пакет в любую часть сети через n-ное количество маршрутизаторов, которые и являются устройствами данного уровня.

Атаки: подмена дефолтного шлюза; нарушение процесса маршрутизации; DDOS-атака.

Признаки атаки: в сети нет маршрутов; пакеты пропадают; заранее установленный порог частоты какого-либо узла повышается и (или) переходит на другой узел; пропускная способность сети резко падает; уровень фрагментации пакетов резко повышается; появляются и учащаются повторные передачи пакетов.

4 — транспортный уровень, в котором единицей нагрузки выступает сегмент (segment) или датаграмма (datagram). Протоколы — TCP и UDP. Оба отвечают за прямую связь между приложениями и надёжность обмена данных. Первый запрашивает повтор передачи информации, когда та принята не полностью или некорректно. Второй меняет скорость обмена, если приёмник по техническим причинам не успевает принять все данные (TCP Window Size). Также на четвёртом уровне появляются порты.

Атаки: подмена UDP-пакетов; обмен (как приём, так и отправка) аномально тяжёлыми сегментами; атаки, которые происходят по типу LAND: № порта отправителя = № порта получателя зацикливание.

Признаки атаки: блокируются какие-либо службы; количество сегментов на отдельный определённый порт превышает адекватные показатели; количество запросов на порта превышают адекватные показатели; размеры сегментов становятся неадекватно большими (обычно от 500 байт до 5 кбайт); последовательность сегмента оказывается слишком большой или неполной.

Знание этих 4 уровней обязательно, если вы приступаете к наладке безопасности сетевого соединения в приложении. Они разделены, постоянны и обязательны именно в том виде, как и описано выше.

Следующие 3 уровня реализованы (условно) корректно только в RFC.
На деле же они могут проявляться сразу на нескольких уровнях OSI одновременно.

Поэтому их не всегда разграничивают (особенно 5 и 6).
Из-за чего наиболее часто используют стек TCP/IP.

5 — сеансовый уровень, в котором единицей нагрузки выступают данные. Управляет сеансом связи, обменом информации, правами. Протоколы — L2TP, PPTP.

6 — представительский уровень, единицы нагрузки те же, что и в предыдущем. Необходим для представления и шифрования данных: JPEG, ASCII, MPEG.

7 — прикладной уровень, единицы нагрузки те же, что в 5 и 6. Отличается максимальным разнообразием и многочисленностью протоколов. Также именно на 7 уровне выполняются высокоуровневые протоколы: POP, SMTP, RDP, HTTP и другие.

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

Функции безопасности

Не являются универсальными. Для удобства мы составили список, где плюсом и минусом помечены возможность и невозможность реализации функции на определённом уровне.

  • аутентификация: 1 (–); 2 (–), 3 (+), 4 (+), 5 (–), 6 (–), 7 (+);
  • управление доступом: 1 (–); 2 (–), 3 (+), 4 (+), 5 (–), 6 (–), 7 (+);
  • конфиденциальность соединения: 1 (+); 2 (+), 3 (+), 4 (+), 5 (–), 6 (+), 7 (+);
  • конфиденциальность вне соединения: 1 (–); 2 (–), 3 (+), 4 (+), 5 (+), 6 (–), 7 (+);
  • избирательная конфиденциальность: 1 (–); 2 (–), 3 (+), 4 (+), 5 (–), 6 (+), 7 (+);
  • конфиденциальность трафика: 1 (+); 2 (–), 3 (+), 4 (–), 5 (–), 6 (–), 7 (+);
  • целостность с восстановлением: 1 (–); 2 (–), 3 (–), 4 (+), 5 (–), 6 (–), 7 (+);
  • целостность без восстановления: 1 (–); 2 (–), 3 (+), 4 (+), 5 (–), 6 (–), 7 (+);
  • избирательная целостность: 1 (–); 2 (–), 3 (–), 4 (–), 5 (–), 6 (–), 7 (+);
  • целостность вне соединения: 1 (–); 2 (–), 3 (+), 4 (+), 5 (–), 6 (–), 7 (+);
  • неотказуемость: 1 (–); 2 (–), 3 (–), 4 (–), 5 (–), 6 (–), 7 (+).

Как сделать сетевое соединение в приложении безопасным

Большинство соединений базируется на протоколе HTTP/HTTPS, однако он не безопасен. Сигналы легко перехватываются различными способами. Например, с помощью клиентов типа Wireshark. В основном это происходит на транспортном (4) уровне. Но не всегда.

Шифрование — отличное решение проблемы. Между симметричным и ассиметричным рекомендуем выбрать второе, т. к. оно более надёжное. Это обусловлено использованием двух различных ключей (в симметричном один). Первый (открытый) шифрует данные, второй (закрытый) — расшифровывает. К слову, последний ключ знает только его владелец.

Асимметричное шифрование происходит с помощью алгоритмов. Они могут быть разными. Наиболее распространённый — RSA, или Rivest — Shamir — Adleman (RSA). В целом он неплох, но есть несколько существенных минусов: централизованное управление ключами отсутствует, открытая часть ключа в паре ключей для SSH не меняется (при том, что сертификат можно перевыпустить когда угодно). Также ассиметричное шифрование может проходить с помощью ECC, или Elliptic curve cryptosystem, DH, или Diffie — Hellman, а также El Gamal.

Однако всё не так просто. Если киберпреступники украдут закрытый ключ шифрования, то смогут незаметно получать все нужные им данные. Ведь каждая организация идентифицируется с собственным, конкретным ключом.

Поэтому необходимо заботиться об сертификации (аутентификации) открытых ключей.

Как это связано? Сертификация открытого ключа подтверждает, что его вторая часть (закрытая) известна только владельцу сертификата. И если в честности какой-либо компании (вообще, любой) сомневаться легко, то специальный центр сертификации вызывает доверия.

Рекомендуют получать подтверждение PKI (инфраструктура открытых ключей). В отличие от RSA, PKI выдают открытые части своих ключей в реальных удостоверяющих центрах. Также PKI предоставляют подписанные сертификаты со сроком годности, благодаря чему реально проверить актуальность ключа (при этом подделать его нельзя) и степень риска гипотетического соединения.

Как происходит обмен ключами

Рассмотрим этот процесс на примере HTTPS (наиболее распространённый протокол). Представим, что у нас есть смартфон и некий сервер, с которым нужно установить соединение

Сначала необходимо выбрать тип шифрования (в нашем случае — асимметричное). Затем сервер отошлёт сертификат с открытым ключом. Смартфон проверит, встроен ли данный сертификат в цепочку доверенных сертификатов вплоть до корневого (сертификаты вшиваются в доверенный сторадж устройства).

Если всё в порядке, то приложение (условно) сгенерирует свой новый ключ, подпишет его открытым ключом из сертификата и, наконец, отправит обратно на сервер. Расшифровать такой ключ сможет только владелец закрытого.

Единственный минус асимметричного шифрование — его скорость.

Проблема решается с помощью сессионного (сеансового) ключа. Его особенность заключается в том, что он существует только в течение одного (текущего) сеанса, а затем уничтожается. Не менее важно, что этот ключ генерируется совместно клиентом и сервером, а не только клиентом.

Сторожа сторожей: SSL и TLS

Возможна ситуация, когда в цепочку сертификатов попадает ложный сертификат злоумышленника. Не важно, выгрузил ли он туда его сам или обманным путём заставил скачать и установить пользователя. Итог один — при сетевой связи посредством HTTPS клиент видит, что сертификат подписан корневым и предоставляет ключ и серверу, и клиенту, и киберпреступнику.

В профилактике этой проблемы помогут SSL или TLS.

Разница между SSL и TLS

SSL отличается своей независимостью от прикладного протокола. Иными словами, алгоритм и сессионный ключ согласовываются заранее. Только после этого приложение начинает обмен (как приём, там и отправку) данными. То же касается аутентификации сервера.

TLS — усовершенствованная версия SSL. Однако здесь используется HMAC (работает с любой хэш-функцией, а не только с MD5 или SHA).

Ещё одно значительное отличие — TLS задействует псевдослучайную функцию стандарта HMAC, когда создаёт ключ. А SSL всегда использует либо RSA, либо Diffie-Hellman, либо Fortezza/DMS. Подобная предсказуемость выгодна злоумышленникам.

Также TLS отличается от SSL гораздо более быстрой проверкой сертификата. Это достигается за счёт оптимизации сложного процесса обмена данными. В TLS информация о проверке передаётся во время первоначального соединения (handshake) в полном объёме.

И ещё кое-что

Соединения посредством SSL или TLS можно осуществлять двумя способами:

  • по отпечатку сертификата;
  • по публичному ключу.

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

Безопасность на iOS и Android

На iOS защититься проще, т. к. никто не может вмешаться в код устройства и изменить его (если не был произведён jailbreak). На Android, даже если используется пиннинг, модифицировать код вполне реально.

Для устранения этой уязвимости можно использовать специальные сетевые приложения. Мы подобрали 5 вариантов с различным функционалом:

1. JuiceSSH.

Бесплатное приложение, которое использует протокол — SSH (Secure Shell, безопасная оболочка). При подключении к смартфону или планшету с активным сервером SSH, позволяет управлять устройством удалённо. Интерфейс в целом удобный — каких-то проблем быть не должно.

При этом приложение сохраняет функции копирования, вставки, кликабельные URL, может хранить до нескольких профилей SSH для разных подключений. Для усиления безопасности поддерживает двухфакторную аутентификацию посредством Google Authenticator или других ПО 2FA.

Поддерживает UTF-8 кодировку, IPv6-протокол, установку пароля и поддержку OpenSSH секретных ключей (ECDSA, RSA и DSA). Самостоятельно генерирует ключи RSA (с шифрованием).

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

2. Fing Network Tools.

Бесплатное приложение, которое отличается разнообразным функционалом. Обрабатывает и ping, и traceroute. Позволяет не только отслеживать попытки проникновения злоумышленников (пресекая их), но также и видеть, управляемая ли это кибератака.

Через Wi-Fi приложение сканирует сеть, после чего выдаёт полный список список хостов с информацией о производителе сетевого адаптера, IP-адресом и MAC-адресом. Есть возможность проверить интересующий хост (любой) на наличие сервисов.

Есть сканер портов, Subnet; WOL. DNS поиск и обратный поиск DNS. За дополнительную плату предоставляет дополнительные функции. Например, анализ полосы пропускания, а также многое другое.

3. NetCut.

Бесплатный сетевой сниффер, который может управлять устройствами, подключёнными к вашему маршрутизатору по беспроводной сети. Различает подключения и разрешённого, и неразрешённого типа.

В случае обнаружения последнего предлагает использовать переключатель kill NetCut. Это поможет избавиться от злоумышленника (или халявщика). Также с помощью приложения можно обнаружить ARP-спуфинг (используется хакерами для подключения).

Позволяет также регулировать скорость Wi-Fi для каждого подключённого устройства или, вообще, скрывать Wi-Fi от неподключённых. Единственный минус, приложение работает только рутованном Android.

Премиум-версия предоставляет доступ к быстрому сканированию, функции изменения MAC-адреса, поиску по IP-адресу, имени или бренду, а также оптимизированные и более подробные отчёты (инструменты).

4. Network Connections.

Бесплатное приложение, которое помогает отслеживать соединения: и входящие, и исходящие. Есть функция уведомлений пользователя при попытке скрытых приложений подключиться к удалённым серверам. Она будет весьма полезна, если вы захотите проверить свой телефон на вредоносы (вирусные и заражённые ПО).

Отображают всю информацию протокола IP для каждого соединения. Отчёт включает IP-адрес, обратную запись PTR, номер AS (автономная система ASN), Abuse RBL (информация из ЧС), а также другие данные. Вся информация протоколируется и сохраняется с возможностью экспорта.

5. Ping.

Базовый бесплатный инструмент, который пингует IP-адрес назначения. Для этого необходимо ввести нужный IP-адрес в специальное поле и запустить процесс. Приложение сообщит, подключено ли устройство (адресат) или нет. Также оно предоставит данные о скорости соединения.

Вывод

Не забывайте о сертификатах ключей и сроках действия, внимательно относитесь к выбираемым протоколам. Заботьтесь не только о безопасности своих пользователей, но и об их комфорте — предпочитайте варианты, которые не бьют по скорости (например, TLS, а не SSL) и т. д.

Вы разрабатываете приложение для живых, реальных людей — помните это.