Этот контрольный список фокусируется на стратегиях и решениях для понимания и митигации уникальных уязвимостей и рисков безопасности интерфейсов прикладного программирования (API).
Он охватывает top 10 проблем безопасности API по версии OWASP.
Этот контрольный список применим ко всем видам приложений, использующих API для взаимодействия.
Прежде чем разбираться в лучших практиках, мы должны сначала понять, почему разработчикам важно обеспечить безопасность API.
Это связано с тем, что:
- От банков, розничной торговли и транспорта до IoT, автономных транспортных средств и умных городов, API являются важной частью современных мобильных, SaaS и веб-приложений и могут быть найдены в приложениях, ориентированных на клиентов, партнеров и внутренние приложения.
- По своей природе API раскрывают логику приложений и конфиденциальные данные, такие как персонально идентифицируемая информация (PII), и поэтому все чаще становятся целью злоумышленников.
- Без безопасных API быстрые инновации были бы невозможны.
- Неправильная авторизация на уровне объектов
- Неправильная аутентификация
- Избыточное воздействие данных
- Недостаток ресурсов и ограничение скорости
- Неправильная авторизация на уровне функций
- Массовое назначение
- Неправильная конфигурация системы безопасности
- Инъекции
- Неправильное управление активами
- Недостаточное логирование и мониторинг
Неправильная авторизация на уровне объектов
- Реализуйте проверку авторизации с помощью пользовательских политик и иерархии.
- Не полагайтесь на идентификаторы, которые отправляет клиент. Вместо этого используйте идентификаторы, хранящиеся в объекте сессии.
- Проверяйте авторизацию для каждого запроса клиента на доступ к базе данных.
- Используйте случайные идентификаторы, которые невозможно угадать (UUID).
Неправильная аутентификация
- Проверьте все возможные способы аутентификации во всех API.
- API для сброса пароля и одноразовые ссылки также позволяют пользователям проходить аутентификацию, и их следует защищать так же строго.
- Используйте стандартную аутентификацию, генерацию токенов, хранение паролей и многофакторную аутентификацию (MFA).
- Используйте токены доступа с коротким сроком действия.
- Аутентифицируйте свои приложения (чтобы знать, кто с вами разговаривает).
- Используйте более строгое ограничение скорости аутентификации, применяйте политики блокировки и проверки слабых паролей.
Избыточное воздействие данных
- Никогда не полагайтесь на то, что клиент будет фильтровать данные!
- Проанализируйте все ответы API и адаптируйте их в соответствии с тем, что действительно нужно потребителям API.
- Тщательно определяйте схемы для всех ответов API.
- Не забывайте об ответах на ошибки, также определите соответствующие схемы.
- Определите все конфиденциальные данные или персонально идентифицируемую информацию (PII) и обоснуйте их использование.
- Обеспечьте проверку ответов, чтобы предотвратить случайную утечку данных или исключений.
Недостаток ресурсов и ограничение скорости
- Определите правильное ограничение скорости.
- Ограничьте размер полезной нагрузки.
- Настройте ограничение скорости в соответствии с тем, какие методы API, клиенты или адреса должны или должны быть разрешены.
- Добавьте проверку коэффициентов сжатия.
- Определите ограничения для ресурсов контейнера.
Неправильная авторизация на уровне функций
- Не полагайтесь на клиента в вопросе обеспечения доступа администратора.
- По умолчанию запрещайте любой доступ.
- Разрешайте операции только пользователям, принадлежащим к соответствующей группе или роли.
- Правильно разрабатывайте и тестируйте авторизацию.
Массовое назначение
- Не связывайте автоматически входящие данные и внутренние объекты.
- Явно определяйте все ожидаемые параметры и полезные нагрузки.
- Используйте свойство readOnly, установленное в true в схемах объектов для всех свойств, которые могут быть получены через API, но никогда не должны быть изменены.
- Точно определите схемы, типы и шаблоны, которые вы будете принимать в запросах во время проектирования, и применяйте их во время выполнения.
Неправильная конфигурация системы безопасности
- Создайте повторяющиеся процессы усиления и исправления.
- Автоматизируйте поиск недостатков конфигурации.
- Отключите ненужные функции.
- Ограничьте административный доступ.
- Определите и обеспечьте выполнение всех результатов, включая ошибки для отладки.
Инъекции
- Никогда не доверяйте потребителям API, даже если они являются внутренними.
- Строго определяйте все входные данные, такие как схемы, типы и шаблоны строк, и обеспечивайте их соблюдение во время выполнения.
- Проверяйте, фильтруйте и все входящие данные.
- Определите, ограничьте и обеспечьте выполнение выходных данных API, чтобы предотвратить утечку данных.
Неправильное управление активами
- Поддерживайте в актуальном состоянии инвентаризацию всех узлов API.
- Ограничьте доступ ко всему, что не должно быть общедоступным.
- Ограничьте доступ к производственным данным и разделите доступ к производственным и непроизводственным данным.
- Внедряйте дополнительные внешние средства контроля, такие как брандмауэры API.
- Правильно выводите из эксплуатации старые версии API или добавляйте в них исправления безопасности.
- Внедрите строгую аутентификацию, перенаправления, CORS и так далее.
Недостаточное логирование и мониторинг
- Регистрируйте неудачные попытки, отказ в доступе, ошибки проверки ввода или любые сбои в проверке политики безопасности.
- Убедитесь, что логи отформатированы таким образом, что другие инструменты могут их использовать.
- Защищайте логи как особо важную информацию.
- Включите достаточно подробную информацию, чтобы идентифицировать злоумышленников.
- Избегайте наличия конфиденциальных данных в логах – если информация нужна для отладки, частично отредактируйте ее.
- Интеграция с SIEM и другими инструментами мониторинга и оповещения.
см. также:
🌐 OWASP APICheck – набор инструментов DevSecOps для HTTP API
💉 Astra – автоматизированное тестирование безопасности для REST API
🐧 Secretx – извлечение ключей и секретов API путем запроса каждого URL
🦟 Обнаружение угроз безопасности в Интернете через API
🕷️ OWASP Top 10 – Разбираем уязвимости и как их устранить