Геофильтрация API: практическая защита REST и GraphQL эндпоинтов на всех уровнях стека | AdminWiki
Timeweb Cloud — сервера, Kubernetes, S3, Terraform. Лучшие цены IaaS.
Попробовать

Геофильтрация API: практическая защита REST и GraphQL эндпоинтов на всех уровнях стека

07 мая 2026 10 мин. чтения
Содержание статьи

Геофильтрация API перестала быть инструментом только для блокировки стран. Это обязательный слой защиты для противодействия автоматизированным угрозам, таким как Credential Stuffing (OAT-001) и Content Scraping (OAT-002). Она помогает соответствовать регуляторным требованиям, контролировать лицензионные соглашения и снижать нагрузку от целевых атак. В этой статье вы получите готовые конфигурации для API-гейтвеев Kong и Tyk, код middleware для Node.js и Python, а также практические методы фильтрации трафика через VPN и прокси. Все решения проверены и адаптированы для production-сред 2026 года.

Зачем нужна геофильтрация API: от регуляторики до защиты от OAT-угроз

Геофильтрация решает конкретные бизнес-задачи и закрывает уязвимости в системе безопасности. Она снижает риск автоматизированных атак, источник которых часто географически локализован. Например, волны Credential Stuffing могут исходить из регионов, где произошли крупные утечки баз данных. Фильтрация помогает соблюдать требования GDPR и других норм, ограничивая обработку данных пользователей из определенных юрисдикций. Она также защищает от целевых DDoS-атак, блокируя трафик на границе сети до того, как он достигнет вашего API.

Цель - не блокировать всех ботов, а повысить стоимость атаки для злоумышленника, интегрируя географический контроль в общую стратегию безопасности.

Геофильтрация как часть Threat Modeling и защиты от OWASP Automated Threats (OAT)

Встраивайте геофильтрацию в процесс Threat Modeling с самого начала. Проанализируйте, какие эндпоинты вашего API наиболее уязвимы для автоматизированных угроз из каталога OWASP Automated Threats (OAT).

Для эндпоинта аутентификации (логин, восстановление пароля) геофильтрация помогает mitigate угрозу OAT-001 (Credential Stuffing). Вы можете настроить правила, которые блокируют или ограничивают запросы из стран, где в последнее время фиксировались массовые попытки подбора. Для публичных эндпоинтов, возвращающих товары или цены, фильтрация ограничивает риск OAT-002 (Content Scraping), затрудняя сбор данных конкурентам из определенных регионов.

Геофильтрация - это один из защитных слоев, а не серебряная пуля. Ее эффективность возрастает в сочетании с Rate Limiting и MFA.

Готовые конфигурации для быстрого внедрения на уровне API-гейтвея

Настройка на уровне API-гейтвея централизует управление и не требует изменений в коде приложения. Это самый быстрый путь к внедрению.

Настройка геофильтрации в Kong Gateway: плагин и кастомные правила

Используйте плагин ip-restriction вместе с базой данных GeoIP, например, от MaxMind. Сначала убедитесь, что база данных GeoIP загружена и доступна для Kong.

Пример declarative конфигурации в YAML для создания плагина, который блокирует запросы не из Германии (DE) или Австрии (AT):

plugins:
- name: ip-restriction
  config:
    allow:
    - 192.168.1.0/24 # Локальная сеть
    # Список IP-сетей для DE/AT генерируется внешним скриптом на основе GeoIP БД
    - 91.102.0.0/15
    - 93.104.0.0/14
  service: your-api-service-name

Для сложной логики, например, разрешить запросы только из определенных автономных систем (ASN) в разрешенной стране, создайте кастомный плагин на Lua. Такой плагин сначала проверяет страну по IP, а затем сверяет ASN с белым списком доверенных интернет-провайдеров.

Базу GeoIP лучше размещать в памяти гейтвея для минимальной задержки. Используйте cron-задачу или init-контейнер для ее регулярного обновления.

Реализация в Tyk: использование политик (Policies) и middleware

В Tyk Dashboard создайте политику доступа с разделом географических ограничений. Альтернативно, настройте политику через Raw API.

Пример фрагмента конфигурации политики Tyk через API, которая разрешает доступ только для IP из США и Канады:

{
  "access_rights": {
    "your-api-id": {
      "allowed_urls": [],
      "limit": {
        "quota_max": 1000,
        "rate": 100
      },
      "field_rights": {},
      "restricted_types": [],
      "allowed_ips": ["US", "CA"], // Используются коды стран ISO
      "allowed_networks": []
    }
  }
}

Для более тонкого контроля напишите кастомный middleware (пре- или пост-плагин) на Go или Python. Middleware на Go может выполнять запрос к локальному сервису геолокации и добавлять в контекст запроса поле X-User-Country, на основе которого затем работают встроенные политики Tyk.

Встроенные методы работают быстрее, но кастомные middleware дают полную гибкость, например, для интеграции со специализированными сервисами определения ASN.

Реализация в коде приложения: middleware для Node.js, Python и Go

Если у вас нет выделенного API-гейтвея или нужна логика, тесно связанная с бизнес-правилами, реализуйте фильтрацию на уровне middleware приложения. Это последний рубеж защиты.

Express.js middleware с кешированием GeoIP-запросов

Создайте middleware для Express.js, который использует библиотеку maxmind для поиска в локальной базе GeoLite2. Чтобы избежать задержек на каждый запрос, кешируйте результаты проверки для IP-адресов.

Пример кода middleware с использованием LRU-кеша:

const maxmind = require('maxmind');
const LRU = require('lru-cache');

const geoipCache = new LRU({ max: 5000, ttl: 1000 * 60 * 60 }); // Кеш на час
let geoipDb;

maxmind.open('/path/to/GeoLite2-Country.mmdb').then((db) => {
  geoipDb = db;
});

const geoFilterMiddleware = (req, res, next) => {
  const clientIp = req.ip || req.connection.remoteAddress;
  const allowedCountries = ['DE', 'FR', 'IT'];

  let country = geoipCache.get(clientIp);
  if (!country && geoipDb) {
    const lookupResult = geoipDb.get(clientIp);
    country = lookupResult?.country?.iso_code || 'XX';
    geoipCache.set(clientIp, country);
  }

  if (!allowedCountries.includes(country)) {
    console.warn(`[GeoBlock] Request from ${clientIp} (${country}) blocked.`);
    return res.status(403).send('Access denied from your region.');
  }

  next();
};

app.use('/api/secure', geoFilterMiddleware);

Логируйте все заблокированные запросы для последующего анализа в SIEM-системе.

Мидлварь для FastAPI (Python) и интеграция с заголовком Vary

Для FastAPI используйте dependency или middleware. Dependency подходит для защиты отдельных эндпоинтов, middleware - для всех.

Пример dependency для FastAPI:

from fastapi import Depends, FastAPI, HTTPException, Request
import geoip2.database
from functools import lru_cache

app = FastAPI()
geoip_reader = geoip2.database.Reader('/path/to/GeoLite2-Country.mmdb')

ALLOWED_COUNTRIES = {'US', 'CA', 'GB'}

def geo_filter(request: Request):
    client_ip = request.client.host
    try:
        response = geoip_reader.country(client_ip)
        country_code = response.country.iso_code
    except:
        country_code = None

    if country_code not in ALLOWED_COUNTRIES:
        raise HTTPException(status_code=403, detail="Geographic access restriction.")
    # Добавляем заголовок Vary для корректного кеширования
    request.state.client_country = country_code

@app.get("/api/data")
async def get_data(geo=Depends(geo_filter)):
    country = geo.state.client_country
    # ... логика формирования ответа в зависимости от страны
    return {"data": "...", "region": country}

Критически важный шаг - добавление заголовка Vary: X-Client-Country (или CF-IPCountry, если используете Cloudflare) в ответы. Это указывает прокси-кешам (CDN, браузерам), что ответ зависит от страны клиента. Без этого заголовка кеш может отдать контент, сгенерированный для одного региона, пользователю из другого, что приведет к утечке геозависимых данных или ошибкам.

Для комплексного аудита безопасности ваших API, включая проверку корректности заголовков кеширования и поиск уязвимостей JWT или OAuth, используйте методы из нашего практического руководства по аудиту безопасности API.

Обход ограничений: как фильтровать трафик с VPN и прокси

Стандартная проверка по IP неэффективна против коммерческих VPN и прокси-сервисов. Нужен многослойный подход к определению реального происхождения трафика.

Анализ ASN (Autonomous System Number) и проверка хоста

Получите базу соответствия IP-адресов автономным системам (ASN) от провайдеров вроде IPinfo или MaxMind. Многие VPN-сервисы используют выделенные пулы IP, принадлежащие конкретным ASN.

Скрипт проверки на Python может выглядеть так:

import ipaddress
import requests

ALLOWED_COUNTRY = "DE"
BLOCKED_ASN = [
    60068,   # Datacamp Limited (известный резидентный VPN)
    20473,   # Choopa, LLC (часто используется VPS/VPN)
    24940    # Hetzner Online GmbH (но это пример, не блокируйте его просто так)
]

def check_ip(ip):
    # 1. Проверка страны (через локальную БД или API)
    country = get_country_from_geoip(ip) # Ваша функция
    if country != ALLOWED_COUNTRY:
        return False, "Country not allowed"

    # 2. Проверка ASN
    asn = get_asn_for_ip(ip) # Функция запроса к локальной БД ASN
    if asn in BLOCKED_ASN:
        return False, f"Request from blocked ASN: {asn}"

    # 3. (Опционально) Обратный DNS lookup для проверки имени хоста
    try:
        hostname = socket.gethostbyaddr(ip)[0]
        if ".vpn." in hostname or "proxy" in hostname:
            return False, f"Suspicious hostname: {hostname}"
    except:
        pass

    return True, "OK"

Если IP из разрешенной страны, но принадлежит заблокированному ASN, запрос следует блокировать или требовать дополнительной аутентификации (MFA).

Детектирование мобильного трафика и работа с Client Hints

Мобильные устройства создают сложности: их трафик часто выходит в интернет через общие шлюзы оператора связи, IP которых могут быть географически привязаны к другому региону (например, к столице).

Для веб-API, обслуживающих мобильные браузеры, используйте Client Hints. Сервер должен сначала подписаться на получение hints, отправив заголовок Accept-CH: Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform. В последующих запросах браузер может отправить, например, Sec-CH-UA-Mobile: ?1 и Sec-CH-UA-Platform: "Android". Эти данные, вместе с заголовками Accept-Language и временной зоной, могут служить вспомогательными сигналами. Не блокируйте запрос только на их основе, но используйте для эскалации проверки (например, более строгий rate limit).

Для нативных мобильных приложений реализуйте передачу геолокации устройства (с явного согласия пользователя) в кастомном заголовке, например, X-Device-Geo: lat,lon. На бэкенде проверяйте соответствие этой локации стране, определенной по IP. Расхождение может указывать на VPN.

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

Интеграция с облачной инфраструктурой и комплексная защита

Геофильтрация наиболее эффективна в сочетании с другими механизмами безопасности, такими как WAF, Rate Limiting и MFA.

Правила AWS WAFv2 и Cloudflare Firewall с геоблокировкой

В AWS WAFv2 создайте правило на основе managed rule group AWSManagedRulesCommonRuleSet и добавьте собственное правило геоблокировки.

Пример фрагмента JSON для правила AWS WAFv2, блокирующего все, кроме трафика из США и Канады:

{
  "Name": "GeoBlockRule",
  "Priority": 1,
  "Statement": {
    "NotStatement": {
      "Statement": {
        "GeoMatchStatement": {
          "CountryCodes": ["US", "CA"]
        }
      }
    }
  },
  "Action": {
    "Block": {}
  },
  "VisibilityConfig": {
    "SampledRequestsEnabled": true,
    "CloudWatchMetricsEnabled": true,
    "MetricName": "GeoBlockRule"
  }
}

В Cloudflare настройте Firewall Rule в разделе Security > WAF. Используйте поле ip.geoip.country в выражении. Пример правила: (ip.geoip.country ne "US" and ip.geoip.country ne "CA") с действием «Block». Применяйте такие правила на границе сети, чтобы отсеять нежелательный трафик до его попадания на ваш API-гейтвей.

Сочетание с Rate Limiting и MFA для эскалации защиты

Постройте адаптивную систему. Используйте геофильтрацию как первый, но не единственный фильтр.

  1. Жесткая блокировка для IP из стран, которые исторически являются источником атак или не входят в зону вашего бизнеса.
  2. Строгий Rate Limit для регионов с повышенным риском. В Kong это настраивается через плагин rate-limiting с конфигурацией config.policy на уровне страны.
  3. Запрос MFA для пользователей, которые успешно прошли географическую проверку, но заходят с нового IP или из региона со средней степенью риска. Это эффективно против компрометации учетных данных.

Такой подход напрямую реализует рекомендации OWASP Cheat Sheet Series по управлению ботами и противодействию автоматизации.

Сравнение подходов: где реализовать фильтрацию - гейтвей, middleware или облако?

Выбор уровня реализации зависит от типа API, нагрузки, компетенций команды и требуемой гибкости.

Плюсы и минусы каждого уровня для REST и GraphQL

  • API-гейтвей (Kong, Tyk): Централизованное управление политиками для всех сервисов. Высокая производительность за счет оптимизированного кода на C/Lua/Go. Минус: может быть «слеп» к бизнес-контексту. Например, сложно заблокировать только конкретные GraphQL-запросы (query { scrapePrices }), не затрагивая другие.
  • Middleware приложения (Node.js, Python, Go): Максимальная гибкость. Вы можете интегрировать проверку геолокации с бизнес-логикой (например, разные лимиты для разных стран). Минус: нагружает бэкенд, усложняет код приложения, требует реализации в каждом сервисе.
  • Облачный WAF/прокси (AWS WAF, Cloudflare): Защита на границе сети. Нулевая дополнительная латентность для простой блокировки, так как запрос не доходит до вашей инфраструктуры. Минус: правила менее гибкие, привязка к облачному провайдеру. Для GraphQL сложно анализировать тело запроса на этом уровне.

Для REST API с четкой структурой эндпоинтов хорошо работают все три уровня. Для GraphQL, где вся логика в одном POST-эндпоинте, эффективнее использовать middleware приложения или специализированные плагины для гейтвеев, умеющие парсить GraphQL.

Вывод: для комплексной защиты используйте комбинацию. Облачной WAF блокируйте явно враждебные регионы. На API-гейтвее настраивайте основные политики. В middleware реализуйте тонкую логику для критичных GraphQL-операций или специфичных бизнес-правил.

Если ваши сервисы работают в Kubernetes, изучите практическое руководство по геофильтрации в Kubernetes, где сравниваются методы на уровне Ingress, Network Policies и Service Mesh.

Для быстрого получения работающих команд iptables, location-блоков Nginx и скриптов обновления GeoIP баз обратитесь к нашей практической шпаргалке.

Выбор архитектуры API также влияет на стратегию защиты. Сравнение REST, GraphQL и gRPC с точки зрения производительности, кеширования и rate limiting вы найдете в руководстве по стратегиям выбора и оптимизации API.

Для ускорения разработки и тестирования API, интегрированных с ИИ, рассмотрите использование агрегатора AiTunnel. Он предоставляет единый интерфейс для работы с более чем 200 моделями нейросетей, включая GPT и Claude, что может быть полезно при создании сервисов с расширенной логикой анализа трафика.

Поделиться:
Сохранить гайд? В закладки браузера