Безопасность и конфиденциальность данных 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.
Маскирование номеров банковских карт
Агент проверяет значения тегов спанов и атрибутов событий спанов (span events) на сходство с номером банковской карты и заменяет найденные значения на ?. Маскирование включено по умолчанию и выполняется на агенте, до отправки данных в бэкенд ProtoOBP.
Значение считается номером карты, если одновременно:
- значение целиком состоит из цифр, пробелов и дефисов:
4111111111111111,4111 1111 1111 1111,4111-1111-1111-1111; - начинается с префикса эмитента (IIN) из встроенного списка:
1,2200–2204(карты «Мир»),2221–2720,300–305,309,34–39,4,50–58,6; - содержит от 12 до 19 цифр; для префиксов
1,34,37,51–55и2221–2720— не более 16 цифр.
Карты «Мир» и номера длиной 17–19 цифр распознаются начиная с версии агента 7.80.2.
Конфигурация (protoobp.yaml):
apm_config:
enabled: true
## (...)
obfuscation:
credit_cards:
## Маскирование номеров банковских карт в тегах спанов. По умолчанию включено.
enabled: true
## Проверка контрольной суммы по алгоритму Луна. По умолчанию отключена.
luhn: true
## Теги, значения которых не проверяются.
keep_values:
- order_id
- customer_id
enabledили переменная окруженияPOBP_APM_OBFUSCATION_CREDIT_CARDS_ENABLED— включает маскирование. По умолчаниюtrue.luhnили переменная окруженияPOBP_APM_OBFUSCATION_CREDIT_CARDS_LUHN— еслиtrue, значение маскируется, только если его контрольная сумма корректна по алгоритму Луна. Снижает число ложных срабатываний на идентификаторах, похожих на номер карты. По умолчаниюfalse.keep_valuesили переменная окруженияPOBP_APM_OBFUSCATION_CREDIT_CARDS_KEEP_VALUES— ключи тегов, которые исключаются из проверки. В переменной окружения значения перечисляются через пробел или JSON-массивом:POBP_APM_OBFUSCATION_CREDIT_CARDS_KEEP_VALUES="order_id customer_id". По умолчанию список пуст.
Что встроенная проверка не находит
- Номер внутри более длинной строки:
card 4111111111111111, JSON или URL в значении тега. - Числовые теги спана (номер, записанный в тег как число, а не как строка).
- Теги, которые всегда исключены из проверки, в том числе
error,error.msg,error.type,error.stack,sql.query,graphql.query,graphql.field,graphql.type,graphql.operation.name,grpc.request,grpc.method,grpc.code,http.method,http.status_code,out.host,out.port,service,service.name,span.name,span.type,env,version,account_id,aws_account,runtime-id,sampling.priority, а также все теги, имя которых начинается с_. - В версиях агента ниже 7.80.2 — карты «Мир» и номера длиной 17–19 цифр.
Для этих случаев добавьте правило замены тегов для всех тегов (name: "*"). Такое правило применяется к строковым и числовым тегам, имени ресурса и атрибутам событий спанов и находит номер внутри строки. Пример заменяет на ? последовательности из 13–19 цифр, которые начинаются с цифры от 2 до 6 (в том числе карты «Мир») и могут быть разделены пробелами или дефисами:
apm_config:
replace_tags:
- name: "*"
pattern: '\b[2-6](?:[ -]?\d){12,18}\b'
repl: "?"
POBP_APM_REPLACE_TAGS=[{"name":"*","pattern":"\\b[2-6](?:[ -]?\\d){12,18}\\b","repl":"?"}]
Примечание: Правило для всех тегов выполняется для каждого спана и увеличивает нагрузку на агент. Под шаблон попадают и другие числа такой длины (номера заказов, идентификаторы). Проверьте шаблон на своих данных и при необходимости сузьте его.
Проверить, остались ли номера карт в уже собранных спанах, можно на экране «Проверка на ПДн» в разделе «Роли и доступ» (доступен с версии 203): экран показывает сервисы и ключи тегов, в значениях которых найдены номера карт.
Замена тегов
Чтобы удалить конфиденциальные данные из тегов ваших спанов, используйте настройку 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"]
Маскирование данных в логах
По умолчанию агент не маскирует содержимое логов. Чтобы скрыть конфиденциальные данные до отправки записей в бэкенд ProtoOBP, используйте правила обработки логов с типом mask_sequences: агент заменяет каждое совпадение с регулярным выражением на строку-заменитель.
Параметры правила:
type— тип правила,mask_sequences.name— имя правила. Обязательный параметр.pattern— регулярное выражение (синтаксис RE2: просмотр вперёд и назад не поддерживается).replace_placeholder— строка, на которую заменяется совпадение. На группы захвата изpatternможно ссылаться как${1},${2}.
Правила задаются в двух местах, и при наличии обоих агент применяет оба списка:
- для всех логов агента —
logs_config.processing_rulesв файлеprotoobp.yamlили переменная окруженияPOBP_LOGS_CONFIG_PROCESSING_RULES; - для отдельного источника логов —
log_processing_rulesв секцииlogs:файла интеграции (conf.d/<интеграция>.d/conf.yaml) или в лейбле контейнераcom.protoobp.ad.logs.
Пример ниже заменяет на [MASKED_PAN] номера банковских карт: последовательности из 13–19 цифр, которые начинаются с цифры от 2 до 6 (в том числе карты «Мир») и могут быть разделены пробелами или дефисами. Строка pan=4111 1111 1111 1111 превращается в pan=[MASKED_PAN].
logs_config:
processing_rules:
- type: mask_sequences
name: mask_card_numbers
pattern: '\b[2-6](?:[ -]?\d){12,18}\b'
replace_placeholder: "[MASKED_PAN]"
logs:
- type: file
path: /var/log/app/*.log
source: app
service: app
log_processing_rules:
- type: mask_sequences
name: mask_card_numbers
pattern: '\b[2-6](?:[ -]?\d){12,18}\b'
replace_placeholder: "[MASKED_PAN]"
POBP_LOGS_CONFIG_PROCESSING_RULES=[{"type":"mask_sequences","name":"mask_card_numbers","pattern":"\\b[2-6](?:[ -]?\\d){12,18}\\b","replace_placeholder":"[MASKED_PAN]"}]
services:
app:
labels:
com.protoobp.ad.logs: '[{"source": "app", "service": "app", "log_processing_rules": [{"type": "mask_sequences", "name": "mask_card_numbers", "pattern": "\\b[2-6](?:[ -]?\\d){12,18}\\b", "replace_placeholder": "[MASKED_PAN]"}]}]'
Чтобы оставить последние четыре цифры номера, выделите их группой захвата: pattern: '\b[2-6](?:[ -]?\d){8,14}[ -]?(\d{4})\b' и replace_placeholder: "[MASKED_PAN ****${1}]". В docker-compose.yaml символ $ нужно удвоить: $${1}.
Примечание: Правило проверяется для каждой записи лога и увеличивает нагрузку на агент. Под шаблон попадают и другие числа такой длины (номера заказов, идентификаторы). Проверьте шаблон на своих данных и при необходимости сузьте его.
Обфускация данных на уровне Трейсеров (библиотек инструментации)
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