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

Контроль расходования ресурсов

StarVault — это система, управляемая API, поэтому все коммуникации между клиентами и StarVault осуществляются через StarVault API.

По мере увеличения количества клиентских приложений неавторизованные приложения могут снижать производительность StarVault. Проблема часто возникает из-за приложений, которые:

  • Генерирование неограниченного количества аренд и/или загрузка слишком большого объема данных в StarVault, что приводит к исчерпанию доступной памяти бэкенда хранилища

  • Потребление ошибочно большого количества пропускной способности, что приводит к внутреннему тротлингу кластера StarVault в целом

1. Решение

Установите квоты на ресурсы StarVault, чтобы защитить стабильность среды StarVault и сети, а также потребление ресурсов хранения от неконтролируемого поведения приложений и распределенных атак типа "отказ в обслуживании" (DDoS).

Операторы StarVault могут управлять тем, как приложения запрашивают ресурсы StarVault, а также хранилищем и сетевой инфраструктурой StarVault, задавая следующие параметры:

Характеристика Описание

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

Ограничьте максимальное количество запросов в секунду (RPS) к системе или монтированию, чтобы защитить пропускную способность сети.

Чтобы установить квоты на ограничение скорости и квоты на количество арендованных ресурсов, используйте конечную точку sys/quotas/<type>. Каждая квота ресурса имеет имя для идентификации правила квоты. Для управления отдельным правилом квоты конечной точкой становится sys/quotas/<type>/<name>.

<type> может быть:

  • rate-limit: квота предельной скорости

2. Необходимое условие

Для выполнения задач, описанных в этом руководстве, вам потребуется StarVault. Для установки StarVault обратитесь к руководству по установке StarVault. Убедитесь, что сервер StarVault инициализирован и распечатан.

3. Лабораторная установка

  1. Откройте терминал и запустите dev-сервер StarVault с root в качестве корневого токена.

    starvault server -dev -dev-root-token-id root

    По умолчанию dev-сервер StarVault работает по адресу 127.0.0.1:8200. Сервер также инициализируется и распечатывается.

    Не запускайте dev-сервер StarVault в боевой среде. Этот подход используется здесь только для упрощения процесса распечатывания в качестве демонстрации.

  2. Экспортируйте переменную окружения для starvault CLI, чтобы обратиться к серверу StarVault.

    export STARVAULT_ADDR=http://127.0.0.1:8200
  3. Экспортируйте переменную окружения для starvault CLI, чтобы аутентифицироваться на сервере StarVault.

    export STARVAULT_TOKEN=root

Сервер StarVault готов.

4. Настройка квот ресурсов

Чтобы настроить квоту ресурсов, используйте конечную точку sys/quotas/config.

Параметр Тип Описание

enable_rate_limit_audit_logging

boolean

Включите или отключите ведение логов аудита, когда запросы отклоняются из-за нарушения квоты лимита скорости. По умолчанию ведение логов аудита отключено (false).

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

Включение регистрации аудита ограничения скорости может повлиять на производительность StarVault, если объем отклоненных запросов велик.

4.1. Комнды cli

  1. Включите устройство файлового аудита, которое выводит данные в файл /var/log/starvault-audit.log (или в нужное вам место).

    starvault audit enable file file_path="/var/log/starvault-audit.log"
  2. Чтобы включить логирование аудита для квот на ограничение скорости, выполните следующую команду.

    starvault write sys/quotas/config enable_rate_limit_audit_logging=true
  3. Прочитайте конфигурацию квоты для проверки.

    starvault read sys/quotas/config
    
    Key                                   Value
    ---                                   -----
    enable_rate_limit_audit_logging       true
    enable_rate_limit_response_headers    false
    rate_limit_exempt_paths               []

4.2. Вызов API с помощью cURL

  1. Включите устройство аудита файлов.

    Сначала создайте полезную нагрузку HTTP-запроса, указав путь к логам аудита /var/log/starvault-audit.log (или желаемое местоположение файла).

    tee audit-payload.json <<EOF
    {
      "type": "file",
      "options": {
          "file_path": "/var/log/starvault-audit.log"
      }
    }
    EOF

    Используйте конечную точку sys/audit, чтобы включить журнал аудита файлов.

    curl --header "X-Vault-Token: $STARVAULT_TOKEN" \
        --request POST \
        --data @audit-payload.json \
        $STARVAULT_ADDR/v1/sys/audit/file

    Установите целевой путь файла (file_path) в нужное вам место.

  2. Создайте полезную нагрузку HTTP-запроса, чтобы включить логирование аудита квоты ограничения скорости.

    tee payload.json <<EOF
    {
       "enable_rate_limit_audit_logging": true
    }
    EOF
  3. Вызовите конечную точку sys/quotas/config.

    curl --header "X-Vault-Token: $STARVAULT_TOKEN" \
        --request POST \
        --data @payload.json \
        $STARVAULT_ADDR/v1/sys/quotas/config
  4. Прочитайте конфигурацию квоты для проверки.

    curl -s --header "X-Vault-Token: $STARVAULT_TOKEN" \
        $STARVAULT_ADDR/v1/sys/quotas/config | jq -r ".data"

    Пример вывода:

    {
      "enable_rate_limit_audit_logging": true,
      "enable_rate_limit_response_headers": false,
      "rate_limit_exempt_paths": []
    }

5. Квоты на ограничение скорости

Квоты на ограничение скорости предназначены для защиты StarVault от внешних распределенных атак типа "отказ в обслуживании" (DDoS) и являются основой модели безопасности StarVault.

5.1. Параметры

Параметр Тип Описание

name

string

Имя правила для квоты

path

string

Целевой путь или пространство имен для применения правила квоты. Пустой путь настраивает глобальную квоту ограничения скорости

rate

float

Скорость количества разрешенных запросов в секунду (RPS)

role

string

Роль входа в систему, к которой следует применить эту квоту. Когда этот параметр установлен, путь должен быть настроен на действительный метод аутентификации с концепцией ролей.

interval

second

Продолжительность, в течение которой будет действовать ограничение скорости (по умолчанию 1 секунда).

block_interval

string

Если установлено, то когда клиент достигает порога ограничения скорости, ему запрещается выполнять дальнейшие запросы до истечения block_interval.

Путь может быть полностью определенным и заканчиваться символом (например, auth/token/create).

5.1.1. Комнды cli

  1. Создайте квоту с именем global-rate, которая ограничивает входящую нагрузку до 1500 запросов в секунду.

    starvault write sys/quotas/rate-limit/global-rate rate=1500
  2. Прочитайте правило global-rate, чтобы проверить его конфигурацию.

    $ starvault read sys/quotas/rate-limit/global-rate
    
    Key               Value
    ---               -----
    block_interval    0
    inheritable       true
    interval          1
    name              global-rate
    path              n/a
    rate              1500
    role              n/a
    type              rate-limit

    Если отсутствует path, то правило квоты применяется к глобальному уровню, а не к конкретному монтированию.

  3. Создайте квоту ограничения скорости с именем transit-limit, которая ограничивает доступ к механизму секретов Transit до 1000 запросов в минуту (60 секунд).

    Во-первых, включите механизм секретов Transit в transit.

    $ starvault secrets enable transit
    Success! Enabled the pki secrets engine at: transit/

    Во-вторых, создайте квоту на ограничение скорости transit-limit.

    starvault write sys/quotas/rate-limit/transit-limit \
       path="transit" \
       rate=1000 \
       interval=60

    Вывод:

    Success! Data written to: sys/quotas/rate-limit/transit-limit
  4. Прочитайте правило transit-limit, чтобы проверить его конфигурацию.

    starvault read sys/quotas/rate-limit/transit-limit

Пример вывода:

Key               Value
---               -----
block_interval    0
inheritable       true
interval          60
name              transit-limit
path              transit/
rate              1000
role              n/a
type              rate-limit

Ограничение скорости установлено на 1000 запросов в 60 секунд.

5.1.1.1. Детализация пути

Вы можете задать путь (path) глубже, чем точка монтирования (в данном примере transit/).

  1. Создайте квоту ограничения скорости с именем transit-order, чтобы ограничить количество запросов на шифрование данных с использованием ключа orders до 500 в секунду.

    Во-первых, включите создайте ключ шифрования с именем, orders.

    $ starvault write -f transit/keys/orders
    
    Key                       Value
    ---                       -----
    allow_plaintext_backup    false
    auto_rotate_period        0s
    deletion_allowed          false
    derived                   false
    exportable                false
    imported_key              false
    keys                      map[1:1695147293]
    latest_version            1
    min_available_version     0
    min_decryption_version    1
    min_encryption_version    0
    name                      orders
    supports_decryption       true
    supports_derivation       true
    supports_encryption       true
    supports_signing          false
    type                      aes256-gcm96

    Во-вторых, создайте квоту на ограничение скорости transit-order.

    starvault write sys/quotas/rate-limit/transit-order \
       path="transit/encrypt/orders" \
       rate=500

    Вывод:

    Success! Data written to: sys/quotas/rate-limit/transit-order
  2. Проверьте конфигурацию квоты ограничения скорости.

    starvault read sys/quotas/rate-limit/transit-order

    Вывод:

    Key               Value
    ---               -----
    block_interval    0
    inheritable       true
    interval          1
    name              transit-order
    path              transit/encrypt/orders
    rate              500
    role              n/a
    type              rate-limit

5.1.2. Вызов API с помощью cURL

Создайте квоту с именем global-rate, которая ограничивает входящую нагрузку до 1500 запросов в секунду.

  1. Вызовите конечную точку sys/quotas/rate-limit.

    curl --header "X-Vault-Token: $STARVAULT_TOKEN" \
        --request POST \
        --data '{ "rate": 1500 }' \
        $STARVAULT_ADDR/v1/sys/quotas/rate-limit/global-rate
  2. Прочитайте только что созданное правило квоты global-rate.

    curl -s --header "X-Vault-Token: $STARVAULT_TOKEN" \
        $STARVAULT_ADDR/v1/sys/quotas/rate-limit/global-rate | jq -r ".data"

    Вывод:

    {
       "block_interval": 0,
       "interval": 1,
       "name": "global-rate",
       "path": "",
       "rate": 1500,
       "role": "",
       "type": "rate-limit"
    }

    Если отсутствует path, то правило квоты применяется к глобальному уровню, а не к конкретному монтированию.

  3. Создайте квоту ограничения скорости с именем transit-limit, которая ограничивает доступ к механизму секретов Transit до 1000 запросов в минуту (60 секунд).

    Во-первых, включите механизм секретов Transit в transit.

    curl --header "X-Vault-Token: $STARVAULT_TOKEN" \
        --request POST \
        --data '{"type":"transit"}' \
        $STARVAULT_ADDR/v1/sys/mounts/transit

    Во-вторых, создайте квоту на ограничение скорости transit-limit.

    curl --header "X-Vault-Token: $STARVAULT_TOKEN" \
       --request POST \
       --data '{"path": "transit", "rate": 1000, "interval": 60 }' \
       $STARVAULT_ADDR/v1/sys/quotas/rate-limit/transit-limit
  4. Прочитайте правило transit-limit, чтобы проверить его конфигурацию.

    curl -s --header "X-Vault-Token: $STARVAULT_TOKEN" \
       $STARVAULT_ADDR/v1/sys/quotas/rate-limit/transit-limit | jq -r ".data"

Пример вывода:

{
   "block_interval": 0,
   "interval": 60,
   "name": "transit-limit",
   "path": "transit/",
   "rate": 1000,
   "role": "",
   "type": "rate-limit"
}

Ограничение скорости установлено на 1000 запросов в 60 секунд.

5.1.2.1. Детализация пути

Вы можете задать путь (path) глубже, чем точка монтирования (в данном примере transit/).

  1. Создайте квоту ограничения скорости с именем transit-order, чтобы ограничить количество запросов на шифрование данных с использованием ключа orders до 500 в секунду.

    Во-первых, включите создайте ключ шифрования с именем, orders.

    curl --header "X-Vault-Token: $STARVAULT_TOKEN" \
        --request POST \
        $STARVAULT_ADDR/v1/transit/keys/orders

    Во-вторых, создайте квоту на ограничение скорости transit-order.

    curl --header "X-Vault-Token: $STARVAULT_TOKEN" \
       --request POST \
       --data '{ "path": "transit/encrypt/orders", "rate": 500 }' \
       $STARVAULT_ADDR/v1/sys/quotas/rate-limit/transit-order
  2. Проверьте конфигурацию квоты ограничения скорости.

    curl -s --header "X-Vault-Token: $STARVAULT_TOKEN" \
       $STARVAULT_ADDR/v1/sys/quotas/rate-limit/transit-order | jq -r ".data"

Вывод:

{
   "block_interval": 0,
   "interval": 1,
   "name": "transit-order",
   "path": "transit/encrypt/orders",
   "rate": 500,
   "role": "",
   "type": "rate-limit"
}

Следующий шаг
Обязательно посетите раздел "Тест на понимание квот ресурсов", чтобы узнать, как работает применение квот ресурсов.

6. Тест на понимание квот на ресурсы

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

6.1. Тест на определение квоты на ограничение скорости

  1. Включите механизм транзита секретов, если он не включен.

    starvault secrets enable transit
  2. Удалите определение квоты, которое было создано ранее

    starvault delete sys/quotas/rate-limit/transit-limit
  3. Создайте ключ шифрования "test".

    starvault write -f transit/keys/test
  4. Для демонстрации создайте квоту ограничения скорости test-transit так, чтобы вы могли делать только 1 запрос в минуту.

    starvault write sys/quotas/rate-limit/rate-test \
       path=transit \
       rate=1 \
       interval=1m
  5. Создайте скрипт test-encryption.sh, который выполняет запрос на шифрование данных с помощью ключа test.

    tee test-encryption.sh <<EOF
    echo "Request 1"
    starvault write transit/encrypt/test plaintext=$(base64 <<< "4111 1111 1111 1111")
    echo "\nRequest 2"
    starvault write transit/encrypt/test plaintext=$(base64 <<< "4222 2222 2222 2222")
    echo "\nRequest 3"
    starvault write transit/encrypt/test plaintext=$(base64 <<< "4333 3333 3333 3333")
    EOF
  6. Убедитесь, что сценарий является исполняемым.

    chmod +x test-encryption.sh
  7. Запустите скрипт, чтобы посмотреть, как поведет себя правило квоты.

    ./test-encryption.sh

    Вывод:

    Request 1
    Key            Value
    ---            -----
    ciphertext     vault:v1:6zY2JVtuw3r11ST/JjMkmoNbbcCpQwGbJJ0BJfByk//GLQof8mcxAoerq5Y++BZK
    key_version    1
    
    Request 2
    Error writing data to transit/encrypt/test: Error making API request.
    
    URL: PUT http://127.0.0.1:8200/v1/transit/encrypt/test
    Code: 429. Errors:
    
    * request path "transit/encrypt/test": rate limit quota exceeded
    
    Request 3
    Error writing data to transit/encrypt/test: Error making API request.
    
    URL: PUT http://127.0.0.1:8200/v1/transit/encrypt/test
    Code: 429. Errors:
    
    * request path "transit/encrypt/test": rate limit quota exceeded

    Второй и третий запросы не прошли из-за лимита.

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

    more /var/log/starvault-audit.log | jq

    Если путь к журналу аудита не является /var/log/starvault-audit.log, обязательно установите правильный путь.

    ...snip...
       "request": {
          "id": "4170a181-6a18-589b-f026-a62ad08ae644",
          "operation": "update",
          "namespace": {
             "id": "root"
          },
          "path": "transit/encrypt/test",
          "data": {
             "plaintext": "hmac-sha256:50978c7cb3f0f463491a26152353f485b579d1e8759ec7b7b7c28f3c5b9232cd"
          },
          "remote_address": "127.0.0.1",
          "remote_port": 61028
       },
       "error": "request path \"transit/encrypt/test\": rate limit quota exceeded"
    }

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

  9. Создайте еще одну квоту ограничения скорости, чтобы указать путь к transit/encrypt/test, где разрешенная скорость равна 2 с интервалом в 1 минуту.

    starvault write sys/quotas/rate-limit/encryption-limit \
       path="transit/encrypt/test" \
       rate=2 \
       interval=1m
  10. Запустите скрипт еще раз, чтобы посмотреть, как поведет себя правило квоты.

    ./test-encryption.sh

    Вывод:

    Request 1
    Key            Value
    ---            -----
    ciphertext     vault:v1:44sOnzePg8c0XaxzGeGzwJ94UZ1uuif8p0nGuze8utbvWVhqNHDiIwo8VZmPrcli
    key_version    1
    
    Request 2
    Key            Value
    ---            -----
    ciphertext     vault:v1:w9tyXqoXH6uXuOWUktVWP/yrzOOZDv+TrRbbRU5GZEVappASIRnh3+6KwkJkjWKE
    key_version    1
    
    Request 3
    Error writing data to transit/encrypt/test: Error making API request.
    
    URL: PUT http://127.0.0.1:8200/v1/transit/encrypt/test
    Code: 429. Errors:
    
    * request path "transit/encrypt/test": rate limit quota exceeded

    На этот раз не сработал только последний запрос. Если задан более подробный путь, правило квоты ограничения скорости имеет приоритет перед путем.

    Если у вас есть другой ключ или вы пытаетесь расшифровать (transit/decrypt/test), будет применена квота ограничения скорости rate-test.

7. Очистка

Если вы хотите очистить среду после завершения обучения, выполните действия, описанные в этом разделе.

  1. Сбросьте переменные окружения STARVAULT_TOKEN и STARVAULT_ADDR.

    unset STARVAULT_TOKEN STARVAULT_ADDR
  2. Удалите файлы, созданные во время теста.

    rm test-encryption.sh payload.json audit-payload.json
  3. Если вы запускаете StarVault локально в режиме -dev, вы можете остановить dev-сервер StarVault, нажав Ctrl+C там, где запущен сервер. Или выполните следующую команду.

    pgrep -f starvault | xargs kill