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

Распространенные уязвимости API
#1. Межсайтовый скриптинг (XSS)
XSS-атаки часто встречаются в веб-приложениях, но могут происходить и через API, если входящие данные пользователя не подвергаются должной санитарной обработке. Злоумышленники могут запустить на сервере вредоносные скрипты и получить доступ к конфиденциальным данным.
#2. Нарушение ограничения скорости
Нарушение ограничения скорости передачи данных в API может дать злоумышленникам возможность бомбардировать ваш сервер огромным количеством запросов. В итоге сервер может упасть, а ваши клиенты будут испытывать трудности с доступом к вам.
#3. Неправильная аутентификация
Если API не настроен должным образом с использованием надежного метода аутентификации, любая третья сторона может получить доступ к вашей системе через API. Авторизация также важна, потому что она определяет, кто может получить доступ к тому или иному ресурсу API до определенного времени.
#4. Небезопасная передача данных
Данные, которые отправляются потребителям вашего API, должны быть зашифрованы по пути. Если это не так, то существует вероятность утечки данных злоумышленниками с помощью атаки “человек посередине”. Поэтому всегда рекомендуется использовать для передачи данных безопасный протокол, например HTTPS.
#5. Устаревшие/неактуальные зависимости
API имеют множество внешних зависимостей, которые используются для выполнения сложных задач и разгрузки сложной логики. Если в этих зависимостях есть уязвимость, то косвенно уязвимым становится и ваш API. Всегда следите за тем, чтобы обновлять версии зависимостей.
Теперь, когда вы знаете об уязвимостях API, давайте рассмотрим некоторые лучшие практики для защиты вашего API.

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

Аутентификация
Существует множество способов аутентификации пользователя API. Самый простой способ – использовать имя пользователя/пароль, но он слишком прост и зависит только от того, насколько надежен пароль.
Другой способ – использовать API-ключи для доступа к API. Вы можете предоставить каждому пользователю API уникальный ключ, который он сможет использовать.
JWT-аутентификация – это метод, при котором учетные данные пользователя преобразуются в токен с цифровой подписью и затем отправляются пользователю. Затем пользователь отправляет этот же токен обратно при каждом запросе на сервер для проверки. JWT также имеют срок действия.
Наиболее эффективным решением является OAuth. Он позволяет сторонним пользователям получать доступ к API с уже существующими учетными данными. Например, если вы уже зарегистрированы в Google, приложение может использовать эти учетные данные для входа в ваш аккаунт без необходимости вводить пароль. Паролем становится ваш аккаунт Google.
Авторизация
Авторизация отличается от аутентификации. Пока вы авторизуете пользователя, он уже авторизован для использования вашего API, и дело только в том, к какому ресурсу API он может получить доступ.
Например, преподаватель университета может иметь доступ ко всем студентам в группе, но отдельный студент может получить доступ только к своим данным. В этом случае студент и профессор проходят аутентификацию в одной и той же системе, но имеют право выполнять только определенные действия.
Убедившись, что авторизация API работает правильно, можно предотвратить несанкционированный доступ к ресурсу.
Редактирование данных
Редактирование данных – это процесс выборочного раскрытия информации для пользователей и защиты конфиденциальной информации. Правильная авторизация может привести к более эффективному редактированию данных. Правила конфиденциальности данных, такие как GDPR, также основаны на редактировании данных. Любая нежелательная третья сторона не должна иметь возможности заглянуть в личные или конфиденциальные данные.
Реагирование данных можно реализовать с помощью промежуточного ПО или менеджера шлюзов.

Шифрование
В современном мире это самый важный критерий безопасности. Шифрование является обязательным условием, если вы имеете дело с любой конфиденциальной информацией. Наименьшее шифрование, которое вы можете сделать, это использовать протокол HTTPS, который использует рукопожатие TLS (Transport Layer Security) и SSL (Secure Socket Layer).
Сквозное шифрование – еще один способ надежно защитить передаваемые данные. Данные, хранящиеся в базе данных, также должны быть зашифрованы на случай, если злоумышленник сможет проникнуть в базу и получить доступ к данным.
Обработка ошибок
Информация об инфраструктуре приложения может быть передана злоумышленникам через подробные сообщения об ошибках. Чтобы избежать этого, сделайте сообщения об ошибках общими и реализуйте пользовательскую обработку ошибок. Убедитесь, что в сообщения об ошибках не записывается конфиденциальная информация о системе.
Валидация ввода и санация данных
Валидация ввода очень важна при работе с API, поскольку вы не знаете, какие данные вводятся, пока пользователь их не отправит.
Санитаризация – это процесс удаления нежелательного исполняемого кода из полезной нагрузки. Злоумышленник может ввести Javascript-скрипт, и если вы не продезинфицируете его перед передачей в HTML, он выполнится как скрипт и получит данные.
Неправильная санитарная обработка может привести к атакам межсайтового скриптинга (XSS).
Системы обнаружения вторжений
Системы обнаружения вторжений, также известные как IDS, помогают отслеживать и обнаруживать сетевой трафик, поступающий к API. Если они обнаруживают необычное поведение трафика, то могут вести журнал и оповещать соответствующие органы.
Как правило, существует два типа систем: сетевые и хостовые. В сетевых системах система распределяется между различными контрольными точками, чтобы отслеживать трафик в нескольких точках. В системах на базе хоста она развертывается на одном узле.
Такие системы – отличный способ определить, кто пытается получить доступ к вашей сети, до того, как он помешает вашим данным.
Белые списки IP-адресов
Белые списки IP-адресов – это способ разрешить доступ к API и сети только избранным IP-адресам. Эта техника может не сработать, если у вас есть публичный API, поскольку перечислять все IP-адреса слишком сложно.
Она полезна, если вы знаете, что только некоторые приложения и системы будут обращаться к вашему API.

Веб-токи JSON
JWT обычно используются для аутентификации пользователя путем отправки ему токена с цифровой подписью, созданного на основе его учетных данных. Это работает, потому что скрывает реальные учетные данные пользователя, и вам также не нужно хранить учетные данные в базе данных или на стороне пользователя.
JWT можно разделить на три части: заголовок, полезная нагрузка и подпись. Секция полезной нагрузки содержит учетные данные пользователя, а заголовок может содержать такую информацию, как используемый алгоритм. Секция подписи подписывается цифровой подписью сервера и клиента при каждом последующем запросе.
JWT обычно имеют дату истечения срока действия, после чего сервер генерирует новый токен и отправляет его пользователю.
Ведение журнала и мониторинг
Мониторинг трафика вашего API может быть полезен для заблаговременного обнаружения и идентификации нежелательных посетителей. Вы можете отслеживать каждый запрос, но следите за тем, чтобы в логах не содержалось конфиденциальной информации.
Ограничение скорости
Если в API не реализовано ограничение скорости, он становится уязвимым для DDoS-атак из-за неожиданного притока сетевого трафика. Злоумышленники могут наводнить систему огромным количеством запросов за короткий промежуток времени, что в конечном итоге приведет к краху сервера.
Дросселирование и ограничение скорости API позволяют избежать атак типа “отказ в обслуживании”, ограничивая поток API-трафика.
Безопасные зависимости
Уязвимости возникают не только в коде API, но и в зависимостях от сторонних разработчиков, которые вы можете использовать в своем API. Именно поэтому важно регулярно отслеживать и сканировать зависимости и выявлять любые уязвимости, которые могут в них присутствовать.
Вы можете внедрить запланированное задание для регулярного сканирования и обновления зависимостей, если они могут быть обновлены патчем, устраняющим уязвимость. Кроме того, выбирайте зависимости, которые более безопасны и часто обновляются.
Заголовки безопасности должны возвращаться вместе с ответом API, чтобы проинструктировать браузер о безопасности API и о том, как он должен действовать. Важными заголовками, которые можно отправить для повышения безопасности, являются:
- Cache-Control: Установите значение no-store, чтобы избежать хранения конфиденциальной информации в браузере.
- Content-Security-Policy: Установите значение frame-ancestors ‘none’, чтобы избежать обрамления ответов API в iframe.
- Content-Type (тип содержимого): Этот заголовок важен, поскольку без него браузер пытается угадать тип ответа API, а это может привести к атакам сниффинга. Для JSON-ответов можно установить значение application/json.
- X-Content-Type-Options: Установите значение nosniff, чтобы указать браузеру не угадывать MIME-тип ответа и искать его только в заголовке Content-Type.
Стандарты безопасности и фреймворки
Разработайте свой API с помощью предопределенных стандартов безопасности и фреймворков, чтобы гарантировать, что ваш API соответствует последним требованиям безопасности.
Истечение срока действия токена
Если вы используете токены на предъявителя, то срок действия токена должен быть коротким, так как это требует повторной аутентификации пользователя, что является положительным моментом. В JWT обычно есть два токена: токены доступа и токены обновления. Токены обновления являются долгоживущими, а токены доступа – недолговечными. В любом случае, у ваших токенов должно быть время истечения срока действия.

Брандмауэр веб-приложений
WAF, он же брандмауэр веб-приложений, – это шлюз, который отслеживает, фильтрует и блокирует любой вредоносный сетевой трафик. Часто это лучший способ предотвратить вредоносные атаки по протоколу HTTP.
Использование API-шлюзов
Если вы хотите легко настроить безопасность API и управлять маршрутами API и доступом к ним, вы можете использовать API-шлюзы. Они также предоставляют инструменты мониторинга, протоколирования и аналитики, которые вы можете использовать для контроля работы API.
Zero-Trust
Идея стратегии “нулевого доверия” заключается в том, чтобы не доверять никакому централизованному источнику. Безопасность должна быть многоуровневой и реализована на нескольких контрольных точках.
По сути, доверять нельзя никому, даже разработчикам, работающим над API. Каждый шлюз должен контролироваться и анализироваться, чтобы предотвратить нарушения безопасности.
В таких случаях на помощь приходит автоматизация. Вы можете использовать автоматизированные инструменты для регулярного мониторинга и блокировки необычной или подозрительной активности.

Заключительные слова
Вы можете сделать очень многое для обеспечения безопасности ваших API. В программном обеспечении всегда есть лазейки, которые можно использовать. Такие лазейки приводят к появлению уязвимостей нулевого дня. Поэтому, чтобы обезопасить свои API, самое меньшее, что вы можете сделать, – это обновлять их в соответствии с последними стандартами безопасности.
Переведено с сайта Geekflare