API и облака: как тестировать то, что нельзя потрогать?

Введение. Когда ваша система — это невидимые нити и летающие данные  

После небольшого перерыва мы хотим вернуться к разговору о тестировании безопасности. Мы начали этот разговор, потому что современные технологии и методологии меняют подходы к тестированию безопасности и специалистам нужно адаптироваться к новым реалиям. В блоге уже писали о том, как ИИ, оркестрация и Shift-Left трансформируют процессы тестирования безопасности, делая их более эффективными, автоматизированными и адаптивными. А также затронули очень важную тему секьюрности в 2025 году и необходимости внедрения DevSecOps. Пришло время API. В третьей статье цикла о тестировании безопасности мы с вами рассмотрим, какие появились сложности и новые требования тестирования API и облачных систем.

Пожалуй, одна из самых популярных фраз-объяснений, что такое API, это:

«официант в ресторане, который передает запросы между кухней (сервером) и клиентом, и наоборот»

Похоже, но все-таки API (Application Programming Interface) – это интерфейс, который позволяет разным программам взаимодействовать друг с другом. Подробнее можно прочитать тут. А пока идем дальше к безопасности…

API – сердце большинства современных приложений. Если оно работает некорректно, приложение может сломаться в самый неподходящий момент. Современные системы напоминают паутину: API связывают микросервисы, облака хранят тонны данных, а пользователи ждут, что всё будет работать даже во время апокалипсиса. Но как проверить то, что нельзя увидеть или пощупать? И как грамотно протестировать API, чтобы избежать неприятных сюрпризов?

Сегодня разбираем:

  • Тестирование API — авторизация, управление данными и проверка под нагрузкой.
  • Безопасность облаков — конфиденциальность, защита и доступность в мире, где данные живут «где-то там».
  • Реальные кейсы — как уязвимости в API и облаках уже в 2024 году приводили к утечкам, и как их предотвратить.  

И да, ответим на вопрос: «Почему облако — это не волшебная коробка, а скорее чемодан без ручки?» 

API тестирование API тестирование безопасности

Тестирование API. Там, где падают даже идеальные сценарии  

Application Programming Interface — это мосты между системами. Но если мост шатается, то транспорт (данные) падает в реку, а злоумышленники радостно его ловят.  

1. Авторизация: когда «дверь» открыта всем  

Проблема: API часто проверяют права доступа слишком поздно или слишком просто.  

📌Кейс (2023):  API метод /getUserData?id=123 не проверял авторизацию. Результат? Любой мог получить данные аккаунта, подставив ID.  

Как это выглядит в коде: 

@app.route('/getUserData')  
def get_user_data():  
    user_id = request.args.get('id')  
    user_data = db.query(f"SELECT * FROM users WHERE id = {user_id}")  # SQL-инъекция!  
    return jsonify(user_data)

Уязвимость кода связана с недостаточной авторизацией и инъекцией, нет проверки прав доступа, он передаёт user_id напрямую в SQL-запрос без параметризации. Злоумышленник может передать в id вредоносный SQL-код, например: ?id=1; DROP TABLE users и удалить всю таблицу. Исправить это можно, используя параметризованные запросы:

@app.route('/getUserData')
@auth_required  # Проверка авторизации
def get_user_data():
    user_id = request.args.get('id')
    if not user_id or not user_id.isdigit():  # Проверяем, что ID - число
        return jsonify({"error": "Invalid ID"}), 400
    if int(user_id) != current_user.id:  # Проверяем, что пользователь запрашивает только свои данные
        return jsonify({"error": "Unauthorized access"}), 403
    user_data = db.execute("SELECT * FROM users WHERE id = ?", (user_id,)).fetchone()
    if user_data:
        return jsonify(dict(user_data))
    else:
        return jsonify({"error": "User not found"}), 404  

Лучше проверять, соответствует ли user_id авторизованному пользователю. Здесь проводим дополнительную проверку ID, чтобы избежать SQL-инъекций и защитить данные пользователей.

Как тестировать:

  • Проверяйте все методы на наличие проверок прав (JWT, OAuth, API-ключи).
  • Используйте Postman для подмены токенов:
  GET /getUserData?id=123

  Headers:

  Authorization: Bearer invalid_token
  • Рассмотрите сценарий: «А если токен украден? А если роль пользователя изменится во время сессии?»

2. Управление данными: где мой JSON пропал?  

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

📌Пример можно было бы привести простой, где API возвращает объект пользователя с полем password: "qwerty" в открытом виде, а утечку обнаруживают через пару месяцев только. Но вот на самом деле опасность утечки токенов значительно выше, чем простых паролей, особенно если API-ключи оказываются в публичных репозиториях. Так что важнее тут уделить внимание тому, чтобы не ушли данные о session tokens, refresh tokens или private API keys.

Как такое тестировать?

  • Проверяйте ответы на наличие чувствительных данных (пароли, токены, PII).
  • Используйте OpenAPI/Swagger для валидации структуры:
yaml  
  responses:
  200:
    content:
      application/json:
        schema:
          type: object
          properties:
            email:
              type: string
          # Поле "password" отсутствует!

3. Нагрузочное тестирование: когда API ломается от «толпы»

Если API работает на 10 пользователей, а при 1000 — падает, как подкошенный, то у вас проблема.  

📌Кейс (2024): Сервис доставки еды запустил акцию «бесплатный бургер». Их API не выдержал 50k RPS (запросов в секунду). Приложение «легло» на 3 часа. Убытки — $200k + ооочень много голодных клиентов. Поэтому стоит использовать JMeter для имитации нагрузки:

Thread Group:
  Users: 1000
  Ramp-Up: 60 сек
  Loop: 100
HTTP Request:
  Method: GET
  Path: /api/menu

При этом имитация 1000 пользователей ≠ 1000 RPS. Лучше уточнить целевой RPS (requests per second — «число запросов в секунду») и добавить Throughput Controller в JMeter, если цель — стабильная нагрузка.

Проанализируйте, где возникает бутылочное горлышко (CPU, память, сеть) и как система восстанавливается после пика.

Безопасность облачных систем. Тучки не такие уж пушистые  

Облака — это удобно, пока ваши данные не утекли в чужое «ведро». Основные требования к тестированию: конфиденциальность, защищённость, доступность (CIA-триада).  

1. Конфиденциальность: кто ещё читает ваши файлы?  

Проблема часто заключается в том, что настройки доступа в облаках часто оставляют по умолчанию. В итоге получаем: какой-нибудь стартап Х хранит резервные копии в AWS S3 с настройкой `public-read`, и хакеры спокойно качают 10 млн записей через открытый URL.  

Поэтому проверяйте права через AWS CLI:

bash  

  aws s3api get-bucket-policy --bucket my-bucket 

  # Если в выводе есть "AllUsers" — это тревога!

Для проверки безопасности облака используйте CloudSploit 1для автоматического сканирования.  

2. Защищённость: когда облако «собирает» уязвимости  

Облачные системы состоят из сотен сервисов, и каждый может стать точкой входа.  

📌Кейс (2024): Компания использовала AWS Lambda с чрезмерными правами в IAM-роли. Злоумышленник нашёл уязвимость в коде функции (например, SQL-инъекция, уязвимый API или Server-Side Request Forgery (SSRF)) и с её помощью использовал IAM-роль Lambda для доступа к S3 и RDS

Предотвратить такое можно, если использовать AWS IAM Access Analyzer для поиска избыточных прав и придерживаться принципа минимальных привилегий2. Вот что его нарушает:

{
  "Effect": "Allow",
  "Action": "s3:*",  // ❌ Разрешает ВСЕ действия в S3
  "Resource": "*"    // ❌ На ВСЕ ресурсы (все бакеты и объекты)
}

Поясняем: s3:* — разрешает любое действие с S3 (чтение, запись, удаление, управление политиками и т. д.) Resource: "*" — даёт полный доступ ко всем S3-бакетам в аккаунте. Если злоумышленник получит доступ к этой роли, он сможет стереть все данные, сделать их публичными или украсть.

А вот так он должен выглядеть:

{
"Effect": "Allow",
"Action": [
"s3:GetObject", // ✅ Только чтение объектов
"s3:ListBucket" // ✅ Только список объектов в бакете
],
"Resource": [
"arn:aws:s3:::my-secure-bucket", // ✅ Доступ ТОЛЬКО к конкретному бакету
"arn:aws:s3:::my-secure-bucket/*" // ✅ Доступ к объектам ВНУТРИ бакета
]
}

3. Доступность: а если облако «упадёт»?  

Каким бы странным это нам ни казалось, но иногда так бывает. Облака редко падают, но когда это случается — последствия катастрофичны.  

📌 Кейс (2018-2019). Сбой в Google Cloud из-за ошибки BGP3-маршрутизации оставил без доступа к сервисам 20% пользователей на несколько часов. 

BGP может повлиять на доступность облачных сервисов, но он не всегда связан с тестированием облаков. Лучший способ тестирования доступности — эмуляция отказов через Chaos Engineering. Инструменты для Chaos Engineering:

  • Chaos Monkey (Netflix) — случайно выключает сервисы, проверяя отказоустойчивость.
  • Gremlin — симулирует сбои (например, падение узла, высокую нагрузку, сетевые проблемы).
  • AWS Fault Injection Simulator — имитирует отказ сервисов в AWS.

Пример сценария теста:

1) Выключить 30% EC2-инстансов в us-east-1 gremlin attack shutdown --target-type host --percent 30 --region us-east-1
2) Проверить балансировщик нагрузки (ELB) (вопросы, которые нас волнуют — что с ресурсами для восстановления? остаются ли остальные инстансы доступными? возрастает ли время отклика?)
3) Проверить авто-масштабирование (Auto Scaling) (Запускаются ли новые инстансы автоматически?)

Примеры уязвимостей на реальных кейсах

Кейс 1. Утечка данных через API Twitter (2022)

Хакеры использовали недокументированный API-метод для сбора данных 5.4 млн пользователей. Причина — отсутствие rate limiting и проверки прав. Как можно было предотвратить? Регулярно аудировать «теневые» API-методы и ограничить частоту запросов даже при распределённой атаке:

limit_req_zone $binary_remote_addr zone=api_limit:10m rate=100r/s;

Кейс 2. Успешное предотвращение атаки на облако (2024)  

Fintech-компания внедрила IAST и AWS GuardDuty. Система обнаружила подозрительные запросы к S3 и заблокировала их до утечки. Помог мониторинг аномальной активности в реальном времени и автоматическая блокировка IP-адресов с подозрительным поведением.

Кейс 3. DDoS-атака на API матчмейкера (2024)  

Игровой сервис подвергся DDoS через уязвимый API-метод. Он не имел ограничений по количеству запросов, а злоумышленники использовали ботнет для массовости. В итоге серверы перегрузились → система легла на 12 часов. Решили проблему внедрением Cloudflare WAF (Web Application Firewall для блокировки подозрительных запросов) с правилами для фильтрации бот-трафика и ограничениеь частоты запросов (rate limiting). Также стали проводить нагрузочное тестирование с имитацией атак.

Проблемы, возражения и решения  

1. «Наш legacy-код не дружит с облаками» → Решите вопрос контейнеризацией приложения через Docker (+ постепенная миграция в Kubernetes).  

2. «Тестирование API занимает больше времени, чем разработка» → Автоматизируйте через Postman Collections (+ интеграция в CI/CD).  

3. «Облако дороже, чем мы думали» → Освойте AWS Cost Explorer, инструмент, который помогает анализировать расходы на AWS. Используя метрику можно сократить расходы на 40%, например, удалив неиспользуемые EC2-инстансы.  

Итоги. Как не потеряться в мире API и облаков?  

  • Правило 1: API без авторизации — это дверь без замка. Закройте её. 
  • Правило 2: Облако — не свалка. Настройки доступа должны быть жестче, чем пароль от вашего телеграм-аккаунта.
  • Правило 3: Тестируйте не только «как должно быть», но и «как может сломаться». 

Совет. Если не уверены в своих силах — обратитесь к специалистам. Лучше заплатить за аудит безопасности, чем за ликвидацию последствий взлома.

FAQ  

1. Как выбрать между AWS, Azure и Google Cloud? Смотрите на экосистему. Например, AWS — для стартапов, Azure — если используете Microsoft-стек.  

2. Что важнее тестировать: API или UI? API. Потому что если сломается UI — это неудобно. Если сломается API — это катастрофа.  

3. Как убедить бизнес инвестировать в облачную безопасность? «Если наш API упадёт на 1 час, мы потеряем $50k. Инструменты безопасности снизят риск на 90%».  

P.S. Облака и API — как воздух: их не видно, но без них никуда. Облако — это мощный инструмент, но его использование требует внимательного планирования, глубоких знаний и постоянного контроля. Без этого облако может превратиться в «чемодан без ручки» — неудобный и дорогой.

  1. CloudSploit — это инструмент для анализа безопасности облачной инфраструктуры. Он автоматически сканирует облачные аккаунты (AWS, Azure, GCP) на наличие уязвимостей, ошибок конфигурации и несоответствий лучшим практикам безопасности. CloudSploit можно использовать как SaaS-платформу или open-source инструмент. ↩︎
  2. Принцип минимальных привилегий (Principle of least privilege, PoLP), также называемый «принципом наименьших полномочий» (POLA), — практика в кибербезопасности, при которой субъекту (пользователю, процессу, программе, модулю и т. п.) предоставляют только те права в информационной системе, которые ему необходимы для корректной работы. Если для выполнения задач не требуется доступ к определенным ресурсам и функциям, он не предоставляется. Основное преимущество этого принципа: в случае инцидента с конкретным субъектом (например, взлома аккаунта или сбоя в работе приложения) ущерб организации будет меньше, чем если бы у этого субъекта были неограниченные права. (источник) ↩︎
  3. Border Gateway Protocol (BGP) — Прикладной протокол, применяемый для маршрутизации пакетов между автономными сегментами сети Интернет. Используется для передачи информации об узлах сети, доступных для группы хостов, между которыми установлено соединение. На основании этой информации определяется кратчайший путь прохождения каждого конкретного пакета. (источник)   ↩︎
Другие статьи
5 1 голос
Рейтинг статьи
Подписаться
Уведомить о
Email
guest
0 комментариев
Популярные
Новые Старые
Межтекстовые Отзывы
Посмотреть все комментарии
Об авторе
author

Специалист по тестированию, контент-менеджер "Лаборатории качества". В IT с 2022 года. В журналистике с 2003 года. Работает в департаменте развития и производственном департаменте.

Поиск
Получите совет