1.10. Безопасность и её составляющие
Давайте разберём, из чего состоит безопасность веб-приложений по уровням TCP/IP.
Главные термины

Атака — любое действие нарушителя, которое приводит к реализации угрозы путём использования уязвимостей информационной системы.
Приватность (privacy) — гарантия доступа к секретным данным только пользователям с разрешением. Пассивной атакой здесь будет получение логина или пароля пользователя с целью возможного использования. Инструмент защиты приватности — шифрование.
Целостность (integrity) — гарантия сохранности данными правильных значений. Например, активной атакой здесь будет подмена суммы платежа и счёта назначения при оплате на сайте. Инструмент защиты: хеш-функции.
Аутентификация (autentification) — подтверждение того, что сервер, с которым общаемся, именно тот, за кого себя выдаёт. Инструменты защиты: цифровая подпись (например, сервера банка, на сайте которого проводим оплату), инфраструктура открытых ключей (проверка цифровой подписи).
Доступность (availability) — гарантия того, что авторизованные пользователи всегда получат доступ к данным.
Требования безопасности могут меняться в зависимости от назначения системы, характера используемых данных и типа возможных угроз. Например, если вы публикуете веб-приложение и хотите сделать его доступным для широкого круга людей, то конфиденциальность здесь не требуется. Однако требования целостности и доступности нужны. Трудно представить систему, для которой были бы неважны свойства целостности и доступности, но вот конфиденциальность точно не всегда обязательна.
Далее мы будем говорить об угрозах, уязвимости и рисках. Поэтому сначала разберёмся с терминами.
Угроза — потенциально возможное событие, явление или процесс, которое посредством воздействия на компоненты информационной системы может привести к нанесению ущерба. Например, киберпреступник решил получить данные пользователей.
Уязвимость — любая характеристика или свойство информационной системы, использование которой нарушителем может привести к реализации угрозы. Например, код написан таким образом, что нарушитель может получить данные пользователей.
Риск — вероятность того, что источник угрозы воспользуется уязвимостью.
Воздействие — нечто, приводящее к потерям в связи с действиями источника угрозы. Уязвимости воздействуют на компанию и приводит к тому, что ей может быть нанесён ущерб. Если управление паролями слабое, а требования к паролям не внедрены, компания подвержена возможному воздействию в результате компрометации паролей пользователей и их использования для несанкционированного доступа.
Контрмеры (или защитные меры) — меры, внедрение которых позволяет снизить уровень потенциального риска.
Хакер (Hacker) — кто-то, кто взламывает системы, обычно с целью захватить данные или заставить систему работать так, как её разработчики изначально не планировали.
White Hat — их иногда называют «этичными хакерами», так как они используют хакерские методы для помощи компаниям в повышении безопасности.
Black Hat — киберпреступник. Человек, который использует хакерские методы для взлома систем, чтобы получить прибыль, создать хаос или удовлетворить свои интересы и цели.
Grey Hat — нечто среднее между этичными хакерами и киберпреступниками. Иногда такие хакеры нарушают закон, например, пытаются взломать приложения без разрешения. Но часто это делается ради интереса или признания, а не ради выгоды или создания хаоса.
Пентестер (penetration tester) — человек, которому платят за взлом системы теми способами, какие применил бы хакер. Если человек пытается найти ошибки в приложении, с которым у него нет подписанного контракта о подобных действиях, то он считается киберпреступником, а не пентестером.
Охотник за багами (bug bounty hunter) — внештатный пентестер. Часто крупные компании создают «программы ответственного раскрытия информации», в рамках которых за сообщение о «дырах» в системе безопасности можно получить денежное вознаграждение. Некоторые охотники за багами работают в режиме полной занятости, но часто таким вещами занимаются профессионалы в свободное от работы время.
Какая система может считаться безопасной
Абсолютно безопасных систем не бывает — это утопия. Любые определения безопасной системы абстрактны и не описывают конкретных рекомендаций. Всё сводится к тому, что система безопасна, если она ведёт себя точно так, как задумано — и ничего больше. Это можно понять так: если пользователь создаёт пароль, то этот пароль должен получить только сервер данного приложения.
Что мешает создавать безопасное приложение
Программы создают люди, поэтому ответственность за безопасность делят все системы на пути передачи данных. Как мы помним из модели OSI, протоколов на пути огромное количество, и ответственность за безопасность делят все люди, создавшие или работавшие с этими протоколами.
Ещё один важный момент — пользователю нельзя доверять. Например, нельзя разрешать пользователю задавать совершенно любой пароль: важно позаботиться о том, чтобы простой пароль 123456 или password123 невозможно было использовать.
Если невозможно создать абсолютно безопасную систему, то какую информацию стоит защищать
Если веб-разработчик использует своё время на улучшение кода вместо написания новой «опции», это не всегда оправдано для компании. Также важно задавать вопросы. Какой ущерб понесёт компания при потере или раскрытии данных? Кто или что является возможным источником угрозы? С какими атаками можно столкнуться? Насколько они реальны?
Важен баланс между возможным ущербом и затратами на её предотвращение. К примеру, мы можем «принудить» пользователей создавать пароль минимум из 10 символов с использованием цифр и знаков, а также подтверждать свою личность через номер телефона при помощи кода. Такой вариант действительно безопасен, но количество зарегистрированных пользователей будет меньше, чем при создании просто надёжного пароля. Так что здесь важен баланс между безопасностью и итоговым результатом.
Ни одна система безопасности не гарантирует защиту данных на 100%, поскольку является результатом компромисса между возможными рисками, возможными затратами и пользовательским опытом.
Подведём итоги: все веб-приложения уязвимы, данные пользователей не защищены от атак. Дальше мы будем рассматривать варианты защит.