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

Stronghold поддерживает два типа квот:

  • квоты ограничения частоты запросов (rate limit) — ограничивают число запросов в единицу времени;
  • квоты количества аренд (lease count) — ограничивают число одновременно существующих аренд. Доступны в Stronghold EE.

Для управления квотами требуется токен с правами на пути sys/quotas/*.

Квоты ограничения частоты запросов

Квота применяется глобально, к пространству имён, к точке монтирования или к роли метода аутентификации. Параметры квоты описаны в справочнике API /sys/quotas/rate-limit/{name}:

ПараметрОписание
rateМаксимальное число запросов за интервал. Положительное число
intervalИнтервал, за который считается rate. По умолчанию 1s
block_intervalЕсли задан, клиент, превысивший лимит, блокируется на указанное время
pathПуть точки монтирования или пространства имён. Пустое значение — глобальная квота
roleРоль метода аутентификации, к которой применяется квота. path при этом должен указывать на точку монтирования метода аутентификации с поддержкой ролей, без подпути

При превышении квоты Stronghold возвращает HTTP-код 429.

Примеры

Глобальная квота на весь кластер:

d8 stronghold write sys/quotas/rate-limit/global rate=1000

Квота на метод аутентификации AppRole — защита от шторма повторных входов:

d8 stronghold write sys/quotas/rate-limit/approle-login path=auth/approle rate=50 interval=1s

Квота на отдельную роль с блокировкой нарушителя на минуту:

d8 stronghold write sys/quotas/rate-limit/ci-role path=auth/approle role=ci rate=10 interval=1s block_interval=60s

Квота на точку монтирования механизма секретов:

d8 stronghold write sys/quotas/rate-limit/kv-apps path=secret/ rate=200

Квота на пространство имён (Stronghold EE):

d8 stronghold write sys/quotas/rate-limit/team-a path=team-a/ rate=300

Если для запроса подходят несколько квот, применяется наиболее специфичная: роль, затем путь внутри точки монтирования, затем точка монтирования, затем пространство имён, затем глобальная квота.

Просмотр и удаление

Чтобы получить список квот, прочитать квоту и удалить её, выполните команды:

d8 stronghold list sys/quotas/rate-limit
d8 stronghold read sys/quotas/rate-limit/approle-login
d8 stronghold delete sys/quotas/rate-limit/approle-login

Общие настройки квот

Эндпоинт /sys/quotas/config задаёт общие параметры:

ПараметрОписание
rate_limit_exempt_pathsПути, на которые не распространяются квоты ограничения частоты
enable_rate_limit_audit_loggingЗаписывать в журнал аудита запросы, отклонённые из-за квоты
enable_rate_limit_response_headersДобавлять в ответы HTTP-заголовки с информацией о лимите

По умолчанию из квот исключены пути sys/generate-recovery-token/attempt, sys/generate-recovery-token/update, sys/generate-root/attempt, sys/generate-root/update, sys/health, sys/seal-status и sys/unseal. Пример — добавить в этот список sys/metrics, включить заголовки ответов и аудит:

d8 stronghold write sys/quotas/config rate_limit_exempt_paths="sys/generate-recovery-token/attempt,sys/generate-recovery-token/update,sys/generate-root/attempt,sys/generate-root/update,sys/health,sys/seal-status,sys/unseal,sys/metrics" enable_rate_limit_response_headers=true enable_rate_limit_audit_logging=true

Запись в sys/quotas/config заменяет сразу все три параметра: не указанный параметр сбрасывается (булевы — в false, список исключённых путей — в пустой, то есть исключений не остаётся, включая заданные по умолчанию). Всегда передавайте полный набор параметров; предварительно прочитайте текущие значения командой d8 stronghold read sys/quotas/config.

Квоты количества аренд

Квоты количества аренд ограничивают число одновременно существующих аренд на точке монтирования, в пространстве имён или для роли. При достижении лимита новые запросы, создающие аренды, отклоняются до истечения или отзыва существующих аренд. Квоты количества аренд доступны в Stronghold EE.

Квотами управляют через эндпоинты /sys/quotas/lease-count/{name}. Параметры квоты: path, role и max_leases.

Квота, которая ограничивает число аренд на точке монтирования database/ значением 5000:

d8 stronghold write sys/quotas/lease-count/db-creds path=database/ max_leases=5000

Для точного подсчёта аренд по ролям не включайте параметр сервера imprecise_lease_role_tracking.

Подбор значений

  1. Соберите фактическую нагрузку по метрикам stronghold_core_handle_request и stronghold_expire_num_leases за несколько недель. Метрики описаны в разделе «Мониторинг».
  2. Установите лимиты с запасом относительно пиковых значений.
  3. Включите enable_rate_limit_audit_logging и проанализируйте отклонённые запросы.
  4. Постепенно снижайте лимиты для клиентов с аномальной нагрузкой.