Защита API в API Gateway
Zeping Bai
November 4, 2022
Предисловие
В июне 2021 года данные почти 92% пользователей LinkedIn были утеряны через публичные API, которые не имели достаточных мер безопасности. Утечка данных, которые были проданы на черном рынке, включала 700 миллионов имен пользователей, личные данные, адреса электронной почты, номера телефонов и другую информацию. Хотя LinkedIn рассматривает этот инцидент как сбор публичных данных, а не несанкционированный доступ, он подчеркивает важность мер безопасности для API.
API, как внешний интерфейс для предоставления услуг приложениями, постоянно подвергаются внешнему трафику и сталкиваются с враждебными атаками, такими как отказ в обслуживании, инъекции и использование известных уязвимостей. Например, в декабре 2020 года злоумышленники использовали уязвимости log4j 2 для проведения атак на API. Поэтому необходимо усилить способность API противостоять таким злоумышленникам. Однако, прежде чем принимать меры для защиты API, давайте сначала разберемся, что такое API.
Что такое API?
Традиционный API (Application Programming Interface) представляет собой статические или динамические библиотеки программного обеспечения для вызова его функций. Разработчики могут повторно использовать функции, предоставляемые существующим программным обеспечением, на основе вызовов его API, таких как TCP/IP, предоставляемые операционными системами.
С развитием программных систем и сетей термин "API" теперь относится к сетевым интерфейсам, доступным через сеть. Клиенты вызывают эти интерфейсы с использованием протоколов, таких как HTTP, для выполнения функций, например, запроса информации о погоде через Weather API.
В изначальном смысле API — это канал, предоставляемый программной системой для других сервисов, который определяет спецификацию взаимодействия между различными подсистемами. Например, сервис аутентификации предоставляет интерфейсы для входа пользователей, регистрации и получения информации о пользователях. Другие сервисы могут использовать эти интерфейсы для выполнения функции аутентификации пользователей. Таким образом, через API подсистемы могут взаимодействовать для выполнения задач всего приложения.
Что такое безопасность API?
После обзора API мы перейдем к безопасности API. Безопасность API включает три основные перспективы:
Информационная безопасность (InfoSec): С точки зрения информации, обеспечение защиты данных на всех этапах их жизненного цикла: создание, передача, хранение и уничтожение.
Сетевая безопасность (NetSec): С точки зрения сети, обеспечение того, чтобы передаваемые данные не были перехвачены или изменены, а также предотвращение несанкционированного доступа к сети.
Безопасность приложений (AppSec): С точки зрения приложений, обеспечение того, чтобы разработанные приложения могли противостоять злонамеренным атакам.
Безопасность API — это пересечение этих трех аспектов, что означает, что все три аспекта необходимы для обеспечения безопасности API.

Распространенные атаки на безопасность API
OWASP, проект по безопасности веб-приложений, опубликовал список из 10 распространенных проблем безопасности API OWASP API Security Project | OWASP Foundation.
Он включает следующие проблемы:
Некорректная авторизация на уровне объектов: Пользователи получают доступ к данным, к которым у них нет прав доступа.
Некорректная аутентификация пользователей: Ошибки в реализации сервиса аутентификации позволяют пользователям обходить механизмы аутентификации и получать несанкционированный доступ к API.
Избыточное раскрытие данных: Пользователи получают доступ к избыточным чувствительным данным, которые должны быть защищены.
Отсутствие ограничений на ресурсы и скорость запросов: Отсутствие ограничений на количество ресурсов, необходимых для выполнения запросов клиентов, а также на объемы запросов.
Некорректная авторизация на уровне функций: Пользователи получают доступ к функциям API, к которым у них нет прав доступа.
Массовое присвоение: Пользователи непреднамеренно изменяют данные, которые они не имеют права редактировать, через некорректно разработанный интерфейс.
Некорректная настройка безопасности: Неправильная настройка мер безопасности для API.
Инъекции: Ввод ненадежных данных вызывает SQL-инъекции, выполнение команд или несанкционированный доступ к данным.
Некорректное управление активами: Неправильное управление ресурсами API, например, выпуск API для тестовых сред или устаревших версий.
Недостаточное ведение журналов и мониторинг: Отсутствие инструментов для ведения журналов и мониторинга доступа к API затрудняет выявление аномалий безопасности.
После рассмотрения распространенных проблем безопасности API, какие меры следует принять для защиты API?
Как защитить ваш API?
Для защиты API можно принять меры с трех точек зрения:
InfoSec: Мы можем создать систему конфиденциальности информации в соответствии с правовыми и безопасностными требованиями, чтобы избежать утечки личных данных.
NetSec: Необходимо шифрование и проверка данных при передаче.
AppSec: Необходимо усилить безопасность приложения.
Вот несколько дополнительных практик для обеспечения безопасности API.
Постоянное шифрование: Мы можем предотвратить перехват и изменение данных через настройку полного потока TLS. Кроме того, необходимо включить mTLS для проверки подлинности клиента, чтобы предотвратить несанкционированный доступ.
Осторожное использование токенов: Необходимо осторожно использовать JWT, так как клиент может их декодировать, что может привести к утечке конфиденциальной информации. Кроме того, отзыв конкретной сессии может быть сложным из-за ограничений JWT.
Минимальные права доступа: Назначайте минимальные права доступа к API и данным, чтобы избежать несанкционированного доступа.
Проверка входных данных: Никогда не доверяйте входным данным клиента. Необходимо проверять входные данные клиента, чтобы убедиться, что они соответствуют требованиям безопасности.
Ограничение скорости запросов: Ограничьте скорость доступа к API. Это предотвращает атаки типа "отказ в обслуживании", когда система перегружена запросами, которые она не может обработать.
Ведение журналов и мониторинг: Разработка подходящего механизма ведения журналов и мониторинга позволяет быстро выявлять события безопасности и принимать соответствующие меры. Мы также можем вернуться к прошлому после инцидента безопасности, чтобы определить затронутые системы и данные, а также оценить масштабы утечки данных.
Упомянутые выше меры требуют внесения изменений в приложение, что может быть дорогостоящим и привести к новым проблемам.
Как можно внедрить меры безопасности, не ставя под угрозу сервисы приложения?
API Gateway
API Gateway предлагает новый подход, отличный от модификации системы, что значительно снижает затраты на преобразование и обеспечивает централизованное управление входящим трафиком. API Gateway также предоставляет богатые функции безопасности, которые позволяют запрещать и регистрировать несанкционированные запросы.
Используя Apache APISIX в качестве примера, следующий раздел опишет несколько сценариев использования API Gateway для защиты API.
Шифрование (TLS/mTLS)
Вы можете не только включить TLS для API, чтобы обеспечить доступ по HTTPS, но и активировать mTLS для проверки подлинности клиента. Естественно, вы также можете включить TLS/mTLS для вышестоящих сервисов, чтобы гарантировать безопасность трафика при передаче через внутреннюю сеть. Вы можете ознакомиться с руководством по mTLS, чтобы активировать необходимые функции.
Проверка подлинности
Все соединения могут быть зашифрованы, но это не гарантирует безопасность API. Поэтому в реальных бизнес-сценариях мы должны включать компоненты, связанные с аутентификацией. Для решения этой проблемы APISIX предлагает различные плагины, связанные с аутентификацией, которые могут быть легко интегрированы с внешними сервисами аутентификации или напрямую через шлюз. Эти плагины варьируются от простых, таких как Basic Auth, Key Auth, JWT Auth и Forward Auth, до более сложных, таких как LDAP, OpenID Connect и Open Policy Agent.
Ограничение скорости запросов
Отсутствие ограничений на ресурсы и скорость запросов — это две распространенные атаки. Для таких случаев шлюзы обычно включают плагины, связанные с ограничением скорости; Apache APISIX не исключение. Он предлагает три плагина: limit-count, limit-req и limit-conn, которые предоставляют функции ограничения скорости запросов, измерения запросов и ограничения соединений. Они помогают эффективно контролировать нагрузку на API и предотвращают перегрузку системы.
Ограничения безопасности
APISIX предлагает плагины CORS и CSRF для защиты API от межсайтовых запросов и подделки запросов, что дополнительно усиливает его способность защищать безопасность. Кроме того, его плагины ограничений позволяют блокировать IP, UA, Referer и URI, что может противостоять большинству атак на API.
Проверка входных данных
APISIX предоставляет плагин request-validation, который позволяет поставщикам API проверять входные данные пользователя через jsonschema. Структурированные данные и язык описания правил проверки могут быть эффективно использованы для проверки данных.
Наблюдаемость
Перечисленные выше методы — это способы защиты API. Однако ни одна система не является полностью безопасной. Как только система подвергается атаке, мы должны быстро определить причину атаки и предотвратить дальнейший ущерб. Поэтому APISIX также предлагает широкий спектр плагинов для ведения журналов, которые могут отправлять логи в различные места, включая Kafka, Clickhouse и решения для ведения журналов, предоставляемые облачными провайдерами, такими как Google Cloud, Splunk и другие.
Кроме того, APISIX предлагает функциональность отслеживания связей с интеграцией с Skywalking, OpenTelemetry и другими системами трассировки.
Также APISIX предоставляет плагин Prometheus, который может вычислять и экспортировать метрики, связанные с запросами API, в сервис мониторинга Prometheus, чтобы помочь в выявлении проблем с производительностью и предотвращении сбоев в работе системы.
Мы можем своевременно выявлять потенциальные инциденты безопасности, сделав систему достаточно наблюдаемой.
Программируемость
Наконец, APISIX также предлагает плагин serverless для устранения уязвимостей нулевого дня, позволяя пользователям использовать код Lua для выполнения логики при поступлении запроса. Мы можем использовать эту функциональность для временной блокировки некоторых уязвимостей нулевого дня по мере их появления.
Заключение
Безопасность API важна для поставщиков услуг, поэтому разработчики должны прилагать усилия для ее поддержания. В этой статье на примере Apache APISIX показано, как API Gateway может использоваться в различных сценариях приложений, что является новым подходом, отличным от модификации системы, который помогает разработчикам снизить затраты на обеспечение безопасности.