Безопасность и конфиденциальность данных Proto Observability

Агенты и трейсеры Proto Observability Platform собирают только те данные, которые необходимы для диагностики производительности приложений. Вся собраемая информация хранится исключительно на серверах Заказчика, не покидает периметр Заказчика. Данные никаким образом не отсылаются ни в какие облачные системы. В компонентах продукта (библиотеках инструментации приложений и Агенте) предусмотрены механизмы для обфускации конфиденциальных данных для минимизации рисков сбора и обработки таких данных.

На этой странице

Общая схема обработки данных

Общая схема обработки данных выглядит следующим образом:

Приложение -> Трейсер ProtoOBP -> Агент ProtoOBP -> бэкенд ProtoOBP (self-hosted, on-premise)

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

Категории данных, которые могут содержатся в трейсах

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

Категория Описание
Запросы к базам данных Литерал, последовательность литералов или связующие переменные, используемые в выполняемом операторе базы данных.
URI параметры Значения параметров в переменной части пути URI или запроса URI.
Параметры URI Значения параметров в переменной части пути URI или запроса URI.
Данные о пользователе в URI Строка в URI, которая может содержать имя пользователя.

Обфускация – замена строковых параметров на символ ?.

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

Категория Собирается Обфусцируется
Запросы к базам данных
Параметры URI
Данные о пользователе в URI
Категория Собирается Обфусцируется
Запросы к базам данных
Параметры URI
Данные о пользователе в URI

Обратите внимание: Параметры URI по умолчанию выключены и должны быть явно включены.

Категория Собирается Обфусцируется
Запросы к базам данных
Параметры URI
Данные о пользователе в URI
Категория Собирается Обфусцируется
Запросы к базам данных
Параметры URI
Данные о пользователе в URI

Обратите внимание: Параметры URI по умолчанию выключены и должны быть явно включены.

Категория Собирается Обфусцируется
Запросы к базам данных
Параметры URI
Данные о пользователе в URI
Категория Собирается Обфусцируется
Запросы к базам данных
Параметры URI
данные о пользователе в URI

Обратите внимание: Запросы к базам данных обфусцируются на уровне Агента.

Категория Собирается Обфусцируется
Запросы к базам данных
Путь в URI клиента
Строка запроса в URI клиента
Путь в URI на стороне сервера
Строка запроса в URI на стороне сервера
HTTP тело
HTTP cookies
HTTP заголовки
Категория Собирается Обфусцируется
Запросы к базам данных
Путь в URI клиента
Строка запроса в URI клиента
Путь в URI на стороне сервера
Строка запроса в URI на стороне сервера
HTTP тело
HTTP cookies
HTTP заголовки

Обфускация данных на уровне Агента

Обфускация данных именах ресурсов

Спаны включают в себя атрибут “имя ресурса”, который может содержать конфиденциальную информацию. Агент ProtoOBP предоставляет возможности дополнительной обфускации имен ресурсов для следующий сценариев:

  • Числовые литералы SQL и переменные привязки обфусцируются: Например, следующий запрос

    SELECT data FROM table WHERE key=123 LIMIT 10 обфусцируется до

    SELECT data FROM table WHERE key = ? LIMIT ? перед тем, как установить значение тега resource для спана.

  • Буквенные строки SQL обозначаются с помощью стандартных кавычек ANSI SQL: Это означает, что строки должны быть заключены в одинарные кавычки('). Некоторые варианты SQL опционально поддерживают двойные кавычки (") для строк, но большинство рассматривает двойные кавычки как идентификаторы. Обфускатор ProtoOBP рассматривает их как идентификаторы, а не как строки, и не обфусцирует их.

  • Запросы к Redis изменяются путем выбора только командных лексем: Например, следующий запрос MULTI\nSET k1 v1\nSET k2 v2 преобразуется в MULTI SET SET.

Обфускация данных в содержимом трейсов

Агент также обфусцирует конфиденциальные данные в трейсах, помимо имени ресурсов. Вы можете дополнительно настроить правила обфусцирования используя переменные окружения для агента или используя файл конфигурации агента (protobopp.yaml).

Могут быть обфусцированы следующие данные:

  • тело запроса MongoDB
  • тело запроса ElasticSearch
  • команда Redis
  • команда MemCached
  • HTTP URL
  • стэк трейсы (stack traces)

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

Примечание: Вы можете использовать автоматическую обфускацию для нескольких типов сервисов одновременно. Настройте каждый из них в секции obfuscation вашего файла protoobp.yaml.

Запрос к MongoDB (тип спанов – mongodb) обфусцируются по умолчанию.

Пример обфусцированного значения:

{"$and":[{"status":{"$in":"?"}},{"type":{"$eq":"?"}},{"company_guid":{"$eq":"?"}},{"loading":{"$elemMatch":{"address":{"$regex":"?","$options":"?"},"is_unloading":"?"}}},{"base1c":{"$eq":"?"}}]}

Конфигурация (protoobp.yaml):

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    mongodb:
      ## Настраивает правила обфускации для спано типа "mongodb". По умолчанию включено.
      enabled: true
      keep_values:
        - document_id
        - template_id
      obfuscate_sql_values:
        - val1

Это поведение можно отключить с помощью переменной окруженияPOBP_APM_OBFUSCATION_MONGODB_ENABLED=false.

  • keep_values или переменная окруженияPOBP_APM_OBFUSCATION_MONGODB_KEEP_VALUES - определяет набор ключей, которые необходимо исключить из обфускации трейсов на агенте. Если значение не задано, все ключи обфусцируются.
  • obfuscate_sql_values или переменная окружения POBP_APM_OBFUSCATION_MONGODB_OBFUSCATE_SQL_VALUES - определяет набор ключей для включения в обфускацию трейсов на агенте. Если значение не задано, все ключи обфусцируются.

Тело запросов к ElasticSearch (спаны с типом – elasticsearch) обфусцируются по умолчанию.

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    elasticsearch:
      ## Настраивает правила обфускации для спанов типа "elasticsearch". По умолчанию включено.      
      enabled: true
      keep_values:
        - client_id
        - product_id
      obfuscate_sql_values:
        - val1

Это поведение можно отключить с помощью переменной окружения POBP_APM_OBFUSCATION_ELASTICSEARCH_ENABLED=false.

  • keep_valuesили переменная окруженияPOBP_APM_OBFUSCATION_ELASTICSEARCH_KEEP_VALUES - определяет набор ключей, которые необходимо исключить из обфускации трейсов на агенте. Если значение не задано, все ключи обфусцируются.
  • obfuscate_sql_valuesили переменная окружения POBP_APM_OBFUSCATION_ELASTICSEARCH_OBFUSCATE_SQL_VALUES - определяет набор ключей для включения в обфускацию трейсов на агенте. Если значение не задано, все ключи обфусцируются.

Команды Redis (спаны с типом – redis) обфусцируются по умолчанию.

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    ## Настраивает правила обфускации для спанов типа "redis". Включено по умолчанию.
    redis:
      enabled: true
      remove_all_args: true

Это поведение можно отключить с помощью переменной окружения POBP_APM_OBFUSCATION_REDIS_ENABLED=false.

  • remove_all_args или переменная окружения POBP_APM_OBFUSCATION_REDIS_REMOVE_ALL_ARGS - заменяет все аргументы команды redis одним символом “?”, если значение true. По умолчанию отключено.

Команды MemCached (спаны типа – memcached) обфусцируются по умолчанию.

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    memcached:
      ## Настраивает правила обфускации для спанов типа "memcached". Включено по умолчанию.
      enabled: true

Это поведение можно отключить с помощью переменной окружения POBP_APM_OBFUSCATION_MEMCACHED_ENABLED=false.

Значение тега HTTP URL внутри спанов типа http или web не обфусцируется по умолчанию.

Примечание: Пароли, содержащиеся в Userinfo URL, не собираются.

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    http:
     ## Включает обфускацию строк запросов в URL. По умолчанию отключена.
      remove_query_string: true
      remove_paths_with_digits: true
  • remove_query_string или переменная окружения POBP_APM_OBFUSCATION_HTTP_REMOVE_QUERY_STRING: Если true, обфусцирует строки запросов в URL. (http.url).
  • remove_paths_with_digits или переменная окружения POBP_APM_OBFUSCATION_HTTP_REMOVE_PATHS_WITH_DIGITS: Если true, сегменты пути в URL (http.url), содержащие только цифры, заменяются на “?”.

По умолчанию отключено.

Установите параметр remove_stack_traces в true, чтобы удалить трассировки стека и заменить их на ?.

apm_config:
  enabled: true

  ## (...)

  obfuscation:
    ## Включает удаление трассировок стека, чтобы заменить их на "?". По умолчанию отключена.
    remove_stack_traces: true # по умолчанию false

Это также можно включить с помощью переменной окружения POBP_APM_OBFUSCATION_REMOVE_STACK_TRACES=true.

Замена тегов

Чтобы удалить конфиденциальные данные из тегов ваших спанов, используйте настройку replace_tags в конфигурационном файле protoobp.yaml или переменную окружения POBP_APM_REPLACE_TAGS. Значение настройки или переменной окружения представляет собой список из одной или нескольких групп параметров, определяющих способ замены чувствительных данных в тегах. К таким параметрам относятся:

  • name: Ключ тега, который нужно заменить. Чтобы заменить все теги, используйте *. Для имени ресурса используйте resource.name.
  • pattern: Шаблон regexp для сравнения.
  • repl: Строка замены.

Например:

apm_config:
  replace_tags:
    # Замените все символы, начиная со строки `token/` в теге "http.url", на "?".
    - name: "http.url"
      pattern: "token/(.*)"
      repl: "?"
    # Удалите конечный символ "/" в именах ресурсов
    - name: "resource.name"
      pattern: "(.*)\/$"
      repl: "$1"
    # Замените все вхождения "foo" в любом теге на "bar".
    - name: "*"
      pattern: "foo"
      repl: "bar"
    # Удалите все значения тега "error.stack"
    - name: "error.stack"
      pattern: "(?s).*"
    # Замена ряда чисел в сообщениях об ошибках
    - name: "error.msg"
      pattern: "[0-9]{10}"
      repl: "[REDACTED]"
POBP_APM_REPLACE_TAGS=[
      {
        "name": "http.url",
        "pattern": "token/(.*)",
        "repl": "?"
      },
      {
        "name": "resource.name",
        "pattern": "(.*)\/$",
        "repl": "$1"
      },
      {
        "name": "*",
        "pattern": "foo",
        "repl": "bar"
      },
      {
        "name": "error.stack",
        "pattern": "(?s).*"
      },
      {
        "name": "error.msg",
        "pattern": "[0-9]{10}",
        "repl": "[REDACTED]"
      }
]

Используйте переменную окружения POBP_APM_REPLACE_TAGS:

  • при установке через Helm, в agents.containers.traceAgent.env в вашем файле values.yaml
- name: POBP_APM_REPLACE_TAGS
  value: '[
            {
              "name": "http.url",
              "pattern": "token/(.*)",
              "repl": "?"
            },
            {
              "name": "resource.name",
              "pattern": "(.*)\/$",
              "repl": "$1"
            },
            {
              "name": "*",
              "pattern": "foo",
              "repl": "bar"
            },
            {
              "name": "error.stack",
              "pattern": "(?s).*"
            },
            {
              "name": "error.msg",
              "pattern": "[0-9]{10}",
              "repl": "[REDACTED]"
            }
          ]'

Примеры

Helm:

agents:
  containers:
    traceAgent:
      env:
        - name: POBP_APM_REPLACE_TAGS
          value: '[
                   {
                     "name": "http.url",
                  # (...)
                  ]'
- POBP_APM_REPLACE_TAGS=[{"name":"http.url","pattern":"token/(.*)","repl":"?"},{"name":"resource.name","pattern":"(.*)\/$","repl":"$1"},{"name":"*","pattern":"foo","repl":"bar"},{"name":"error.stack","pattern":"(?s).*"},{"name":"error.msg","pattern":"[0-9]{10}","repl":"[REDACTED]"}]

Игнорирование ресурсов

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

Агент может быть настроен на исключение определенных имен ресурсов из трейсов. Чтобы предотвратить отправку трейсов с определенными ресурсами, используйте параметр ignore_resources в файле protoobp.yaml. Затем создайте список из одного или нескольких регулярных выражений, указывающих, какие ресурсы Агент должен отфильтровать на основе их названия.

Если вы работаете в контейнерной среде, установите переменную окружения POBP_APM_IGNORE_RESOURCES для контейнера с агентом ProtoOBP.

###### ignore_resources: ["(GET|POST) /healthcheck","API::NotesController#index"]

Обфускация данных на уровне Трейсеров (библиотек инструментации)

HTTP

ProtoOBP стандартизирует семантику тегов спанов во всех библиотеках трассировки. Информация из HTTP-запросов добавляется в виде тегов с префиксом http.. Библиотеки имеют следующие опции конфигурации для контроля конфиденциальных данных собираемых в HTTP-тегах.

Изменение query strings

Тегу http.url присваивается полное значение URL, включая строку запроса. Строка запроса может содержать конфиденциальные данные, поэтому по умолчанию ProtoOBP анализирует ее и редактирует подозрительно выглядящие значения. Этот процесс редактирования можно настраивать. Чтобы изменить регулярное выражение, используемое для редактирования, установите переменную окружения POBP_TRACE_OBFUSCATION_QUERY_STRING_REGEXP на правильный regex по вашему выбору. Валидный regex зависит от платформы. Когда regex находит подозрительную пару ключ-значение, он заменяет ее на <redacted>.

Если вы не хотите собирать строку запроса, установите переменную окружения POBP_HTTP_SERVER_TAG_QUERY_STRING в значение false. По умолчанию используется значение true.

Сбор HTTP заголовков

Чтобы собирать значения HTTP заголовков в теги трейсов, установите переменную окружения POBP_TRACE_HEADER_TAGS с картой ключей заголовков в имена тегов (не зависят от регистра). Трейсер применяет совпадающие значения заголовков в качестве тегов к корневым спанам. Параметр также принимает записи без указанного имени тега, например:

POBP_TRACE_HEADER_TAGS=CASE-insensitive-Header:my-tag-name,User-ID:userId,My-Header-And-Tag-Name