Курс "Промышленное программирование на Java". Набор лекций 2. "Распределенные приложения".
Производительность и ресурсы системы. Распределенные системы. Архитектуры клиент-сервер, клиент-фронтенд-бекенд, Service-Oriented Architecture (SOA). HTTP, REST.
Угрозы безопасности в интернетах. Защита приложения.
МФТИ, 2014 год. Лектор - Лаврентьев Федор Сергеевич
4. На что расходуются ресурсы
Получение запросов по сети, отдача
ответов - сеть
Поддержание соединений и управление
ими - процессор, память
Обработка запроса и формирование
ответа (т.е. логика) - процессор, память
Отдача статического контента - диск
5. На что расходуются ресурсы
Чтение и запись в БД и ФС - диск
Кеши БД и ФС - память
Сложные запросы к БД (filter, aggregate,
join) - диск, память, процессор
Запросы к другим процессам - процессор
Запросы к другим машинам - сеть
Телеметрия - диск, сеть
6. Чем меряют производительность
Нагрузка (load) - число запросов в секунду
(Requests per second, RPS)
Пропускная способность (throughput) -
максимальное значение нагрузки, которое
выдерживает сервис, RPS
Задержка (latency) - время выполнения
одного запроса, мс.
latency = f(load)
7. Из чего складывается задержка
Передача по сети в обе стороны (RTT)
Установление TCP соединения (SYN+ACK)
Получение и разбор запроса
Обращение к базам данных
Обращение к другим сервисам
Вычисления, построение ответа
Обработка (рендеринг) ответа на клиенте
8. Приемлемая задержка
RTT внутри ДЦ <1мс
RTT из Москвы до Нью-Йорка - 120 мс
RTT из Москвы до южного Китая - 250 мс
Get в Redis - 0,3 мс
Prepared query by PK в MySQL - 5 мс
Ответ от Web-сервера - 50-200 мс
Рендеринг на клиенте - 50-100 мс
Незаметное для человека время - 400 мс
9. Деградация сервиса
Ошибки взаимодействия (протокола)
Утрата функциональности
В т.ч. переход в Read-Only
Таймаут - чрезмерная задержка
Ошибки, блокирующие выполнение
Потеря или рассогласование данных
11. Если не хватает процессора
За момент времени обрабатывается
запросов меньше, чем принимается
Запросы встают в очередь
Очередь не уменьшается
Запросы не успевают выполниться
Очередь сжирает всю память
Клиент фиксирует таймауты
12. Если не хватает объема памяти
Выполнение запроса может спонтанно
прерваться в любое время
Может спонтанно прерваться сервисный
тред или сторонняя служба
Система коллапсирует, пока не будет
остановлен расходующий память процесс
Клиент фиксирует всевозможные ошибки
13. Если не хватает скорости сети
Некоторые запросы фрагментируются,
засоряют очередь и отбрасываются
Некоторые ответы теряются
Нарушается связь с другими узлами
Отвалившиеся соединения образуют
очереди и расходуют память и процессор
Клиент фиксирует таймауты
Клиент фиксирует ошибки протоколов
14. Если не хватает скорости дисков
Дисковые операции долго висят в
ожидании, блокируют друг друга или
теребят контроллер диска
Существенно увеличивается время
обработки запросов
За момент времени обрабатывается
запросов меньше, чем принимается…
См. нехватку процессора
15. Если не хватает объема дисков
Прекращается сбор телеметрии (логи,
мониторинг) - оператор системы слепнет
Спонтанно прекращается запись на диск,
возможно, с утратой целостности данных
Фатально деградирует функциональность
систем, пишущих на диск
Клиент фиксирует ошибки сервиса
Система может жить в Read-Only
16. Чего еще может не хватать
Файловых и сокетных дескрипторов
Дескрипторов потоков и процессов
Скорости северного моста (можно считать,
что процессора)
Скорости южного моста - связки между
процессором и I/O
Мощности отдельных устройств - сетевой
карты, дисковых контроллеров и т.п.
18. Оптимизация расхода ресурсов
Рефакторинг кодовой базы
Асимптотческая оптимизация алгоритмов
Дедупликация данных, устранение
избыточности, рефакторинг моделей
Упорядочивание запросов к диску
Кеширование расчетов и данных с диска
Переход на NIO, бинарные протоколы,
внедрение сжатия
19. Разделение ролей
Вынос баз данных на отдельные машины
Разнесение автономных модулей на
разные машины
Создание дополнительных проксирующих
прослоек на других машинах
+ Вышли за пределы одной машины
- Повысили расходы на коммуникацию
20. Вертикальное масштабирование
Заменить в сервере процессоры
Воткнуть туда больше памяти
Вставить быстрый RAID-контроллер
Заменить диски на SSD
Обновить сетевой адаптер
Переехать на новый сервер…
Весело. Но дорого.
21. Горизонтальное масштабирование
Распараллелить выполнение программы
Убрать критические секции
Облегчить работу с общими ресурсами
Обеспечить запуск на нескольких машинах
Равномерно распределить нагрузку
Минимизировать связь между машинами
Получать прирост пропускной способности
при росте числа машин
22. Эластичное масштабирование
Линейная пропорция между пропускной
способностью и объемом ресурсов
Возможность подключения и отключения
машин к кластеру без его остановки
Отсутствие единой точки отказа
26. Клиент-сервер
Монопольный контроль над БД
Просто программировать
Отрисовка данных на клиенте (опц)
Кросс-платформенность с помощью
портирования клиентов
Единая точка отказа
Нельзя горизонтально масштабировать
27. Толстый VS Тонкий клиенты
Тонкий клиент только посылает запросы и
отображает ответы
Толстый клиент проводит некоторые расчеты
без запросов к серверу
Тонкий клиент проще в реализации
Толстый клиент сложнее, но быстрее
На толстом клиенте данные могут устареть
Толстый клиент плохо портируется
31. Backend - Frontend - Client
Разделение server-side на слои
Масштабирование каждого слоя отдельно
Возможность дробить систему на части
Очень большой трафик внутри кластера
Значительно сложнее разработка
Узкая специализация разработчиков
33. Service-Oriented Architecture (SOA)
Физическое выделение отдельных
компонентов на отдельную машину
Уменьшение связности между
компонентами - упрощение разработки
Возможность регулировать работу каждого
сервиса отдельно
Значительное усложнение адресации
внутри кластера
34. Role-based адресация
Закрепление за машиной роли - запуск на
ней определенных сервисов
Всегда ясно, где подняты инстансы сервиса
Легкая стартовая конфигурация со сложным
“горячим” изменением
Возможно оптимально подобрать железо
под нужды конкретного сервиса
35. Cloud-based адресация
Выделение пула машин, на которых могут
быть запущены разные сервисы
Гибкое переключение и оперативное
реагирование на нагрузку и сбои
Приходится абстрагироваться от железа
Необходима отдельная инфраструктура
для учета и управления кластером
42. REST: трактовка HTTP запросов
GET /collection - получить всю коллекцию
PUT /collection - заменить всю коллекцию
POST /collection - добавить элемент в
коллекцию
DELETE /collection - очистить коллекцию
GET /collection/item - получить элемент по ID
PUT /collection/item - заменить элемент по ID
DELETE /collection/item - удалить элемент
46. Ахтунг!
Эта лекция не дает исчерпывающего
списка возможных угроз
Лекция призвана только лишь обратить
внимание на проблему, но не дает сколь-
нибудь приемлемого решения
Tl;dr: кругом враги, приложения полны дыр,
уделяйте внимание безопасности
48. Виды угроз
Отказ в обслуживании (DoS)
Перехват данных пользователя
Подмена действий пользователя
Утечка данных приложения
Модификация данных приложения
Перехват управления
Проникновение в незащищенную зону
…
49. Отказ в обслуживании (DoS)
Генерация множества одновременных
запросов к приложению
Эксплуатация чувствительных к нагрузке
участков кода и методов API
Исчерпание аппаратных ресурсов
Деградация сервиса вплоть до отказа
50. Перехват данных пользователя
Средства прослушки:
Незащищенные публичные сети
Снифферы трафика
Прокси (HTTP Proxy, NAT, анонимайзеры, …)
Спуфинг (подмена) ARP, IP, DNS, …
Атаки Man-In-The-Middle
Фишинг
Социальная инженерия
51. Подмена действий пользователя
Кража учетной записи
Кража сессии (авторизационной куки)
Атаки MITM с модификацией запросов
Cross-Site Request Forgery (CSRF)
Cross-Site Scripting (XSS)
52. Утечка и модификация данных
Инъекции SQL, JS, Shell, XPath, …
Неустойчивые к перебору идентификаторы
(пользователей, сессий, ресурсов, …)
Служебные страницы без авторизации
Уязвимости в серверном ПО
53. Перехват управления
Безумные служебные страницы
Инъекции исполняемого кода
Shell-инъекции
Уязвимости в бинарном коде ПО
Недостаточно защищенные средства
удаленного администрирования
54. Уровни угрозы
Внешняя угроза
Инъекции
Внутренняя угроза
Перехват управления системным пользователем
Перехват управления суперпользователем
Получение доступа к базам данных (R, W)
Компрометация системы внутридоменной
аутентификации
56. Защита транспортного уровня
SSL/TLS: HTTPS
DSA для аутентификации
RSA+DH для обмена шифрами
AES/3DES/… для обмена трафиком
Защищает от:
прослушки трафика
подмены ARP, IP, DNS
атак MITM
57. Аутентификация и авторизация
Аутентификация - определение личности:
Учетные записи
Пользовательские сессии
Подписывание (digesting) запросов
Авторизация - проверка уровня доступа:
Роли пользователей
Группы и разрешения (Groups & Permissions)
Раздельный доступ к ресурсам
58. Защита аутентификации
Шифрование учетных данных по пути от
клиента к серверу (сеансовым ключом)
Хеширование идентификатора сессии
Соленое хеширование паролей в БД
Многофакторная аутентификация
Осложняет кражу учетной записи или сессии
59. Валидация запросов
Защита от инъекций - экранирование,
prepared-запросы, отказ от exec()
Совершение действий только на POST
CSRF-токены для веб-форм
Request Digesting для REST API
60. Защита ресурсов
Обязательная авторизация всех запросов
Маскировка идентификаторов ресурсов
Вынос служебных ресурсов в интранет
Сокрытие средств удаленного
администрирования в интранете
61. Защита от (D)DoS и роботов
Поиск подозрительной активности
(некорректные, неестественные запросы)
Выявление типового поведения (краулеры,
накрутчики)
Ограничение подозрительных подсетей
(интенсивный однотипный трафик)
Сетевое оборудование с возможностью
анализа и ограничения трафика