Безопасность и конфиденциальность данных Proto Observability
На этой странице
- Общая схема обработки данных
- Категории данных, которые могут содержатся в трейсах
- Обфускация данных на уровне Агента
- Обфускация данных на уровне Трейсеров (библиотек инструментации)
Общая схема обработки данных
Общая схема обработки данных выглядит следующим образом:
Приложение -> Трейсер 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