Безопасность API: базовые принципы
Проектирование API не ограничивается реализацией HTTP запросов в определенном стиле и формированием ответов в соответствии со спецификацией. Крайне важно уделить внимание вопросам безопасности.
Способы обеспечения безопасности
-
Использование зашифрованного протокола TLS. Рекомендуется шифровать трафик зап росов и ответов API для защиты конфиденциальности информации при передаче по незащищенным сетям. Общепринятой практикой является использование протокола шифрования TLS. Поверх TLS работает HTTPS, о котором мы уже писали здесь.
-
Авторизация запросов. Авторизация подразумевает, что данному клиенту разрешено выполнять операцию над ресурсом. Следует учитывать:
- Проверку прав доступа к объектам при каждом запросе.
- Проверку того, что залогиненный пользователь имеет доступ только к разрешенным объектам.
- ID объектов должны быть сложными для подбора, например в виде UUID, а не простая последовательность 1, 2, 3.
-
Проверка содержимого запроса. Необходимо проверять, что запрос не содержит опасных компонентов (например, SQL-инъекции, XSS-атаки, DTD-атаки). При этом недопустимо автоматически десериализовать пришедшие данные и записывать их в БД без каких-либо проверок бизнес-логики и прав доступа.
-
Проверка скорости и количества запросов. Контроль, что запросы API не превышают определенной скорости для защиты сервиса от перегрузки ил и атак. Может настраивать квоты запросов на клиента. Сюда входит, например, блокировка IP по результатам неудачных попыток входа.
-
Контроль размера запроса. Проверяет, что полезная нагрузка запроса не превышает ограничения для операции API. Предотвращает попадание неправильных (больших) запросов к сервису.
-
Мониторинг безопасности. Логировние ключевых событий, таких как неудачные попытки аутентификации, отказы в доступе, ошибки валидации входных данных. Также следует мониторить инфраструктуру, сетевую активность, загрузку ОС. Важно настроить алерты, чтобы максимально оперативно реагировать на риски.
-
Ограничение доступа. Если API непубличное, следует ограничить адреса, с которых разрешено использование API. Также можно ограничивать HTTP методы, которые могут быть использованы для доступа к API и задать список заголовков, которые сервер может принимать.