Очистка конфиденциальных данных¶
LogfireSDK сканирует и редактирует потенциально чувствительные данные из журналов и диапазонов, прежде чем экспортировать их.
Отключение очистки¶
Чтобы полностью отключить очистку, [scrubbing][logfire.configure(scrubbing)] Установить как False:
import logfire
logfire.configure(scrubbing=False)
Дополнительная очистка с использованием пользовательского режима¶
По умолчанию SDK ищет несколько чувствительных регулярных выражений. Чтобы добавить свои собственные шаблоны, установите extra_patterns в список строк регулярных выражений:
import logfire
logfire.configure(scrubbing=logfire.ScrubbingOptions(extra_patterns=['my_pattern']))
logfire.info('Hello', data={
'key_matching_my_pattern': 'This string will be redacted because its key matches',
'other_key': 'This string will also be redacted because it matches MY_PATTERN case-insensitively',
'password': 'This will be redacted because custom patterns are combined with the default patterns',
})
Ниже приведены режимы очистки по умолчанию:
'password', 'passwd', 'mysql_pwd', 'secret', 'auth', 'credential', 'private[._ -]?key', 'api[._ -]?key', 'session', 'cookie', 'csrf', 'xsrf', 'jwt', 'ssn', 'social[._ -]?security', 'credit[._ -]?card'
Уменьшение очистки с помощью обратного вызова¶
С другой стороны, если очистка является радикальной, вы можете передать функции callback , чтобы предотвратить редактирование определенных данных.
Функция вызывается для каждого потенциального соответствия, найденного скруббером. Если вы вернетесь к None, то значение будет отредактировано. В противном случае возвращаемое значение будет заменено соответствующим значением. Функция принимает logfire.ScrubMatch .
Вот пример:
import logfire
def scrubbing_callback(match: logfire.ScrubMatch):
# 'my_safe_value' 通常包含字符串 'password',但它实际上并不敏感。
if match.path == ('attributes', 'my_safe_value') and match.pattern_match.group(0) == 'password':
# 返回原始值,防止脱敏。
return match.value
logfire.configure(scrubbing=logfire.ScrubbingOptions(callback=scrubbing_callback))
Советы по безопасности¶
Использование шаблонов сообщений¶
Полное сообщение span/log не очищается, а только поля в нем. Например, следующее:
logfire.info ('Сведения о пользователе:{user}', user=User(id=123, password='secret')
... может быть записано следующее:
Сведения о пользователе:[Исчищено из-за пароля]
... но это:
user = User(id=123, password ='secret')
logfire.info ('Сведения пользователя:' + str(пользователь))
Будут записаны:
Данные пользователя: User(id=123, password='secret')
Это необходимо для того, чтобы сообщения безопасности, такие как «правильный пароль», не редактировались полностью.
Если inspect_arguments(значение по умолчанию в Python 3.11+) включен и работает правильно, то строка f (например,logfire.info(f'User details: {user}')) ) является безопасной. Для получения дополнительной информации см.здесь.
Короче говоря, не форматируйте сообщение самостоятельно. Для Другие причины Это, как правило, является хорошей практикой.
¶
Исключить конфиденциальные данные из URL
Свойство “http.url”, записанное в библиотеке обнаружения OpenTelemetry, считается безопасным, поэтому URL-адреса, подобные 像“http://example.com/users/123/authenticate”, не редактируются.
Как правило, для Logfire предполагается, что URL-адрес (включая параметры запроса) будет записываться, поэтому конфиденциальные данные должны быть помещены в тело запроса или заголовок.
¶
Использование параметрических запросов базы данных
Свойство “db.statement”, записанное в базе данных OpenTelemetry, считается безопасным, поэтому SQL-запросы, такие как 像 “SELECT secret_value FROM table WHERE ..., не редактируются.
Используйте параметрические запросы (например, предварительно подготовленные инструкции), чтобы конфиденциальные данные не вставлялись непосредственно в строку запроса, даже если используемый метод интерполяции не подвержен влиянию SQL-вливаний.
本文总阅读量次