Aller au contenu

Nettoyage des données sensibles

Le SDKLogfireanalyse et édite les données potentiellement sensibles des journaux et des span avant de les exporter.

Désactiver le nettoyage

Pour désactiver complètement le nettoyage, définissez [scrubbing ][logfire.configure(scrubbing)] sur False:

import logfire

logfire.configure(scrubbing=False)

Nettoyer davantage avec le mode Custom

Par défaut, le SDK recherche quelques expressions rationnelles sensibles. Pour ajouter votre propre schéma, définissez extra_patterns pour ajouter à la liste des chaînes d'expressions rationnelles:

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',
})

Voici le mode de nettoyage par défaut:

'password', 'passwd', 'mysql_pwd', 'secret', 'auth', 'credential', 'private[._ -]?key', 'api[._ -]?key', 'session', 'cookie', 'csrf', 'xsrf', 'jwt', 'ssn', 'social[._ -]?security', 'credit[._ -]?card'

Utiliser les callbacks pour réduire le nettoyage

D'autre part, si le nettoyage est radical, vous pouvez passer la fonction à callback pour éviter que certaines données ne soient éditées.

La fonction est appelée pour chaque correspondance potentielle trouvée par le laveur. si None est retourné, la valeur est éditée. sinon, la valeur retournée remplace la valeur correspondante. la fonction accepte logfire.ScrubMatch .

Voici un exemple:

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))

Conseils de sécurité

Travailler avec Message Templates

Les messages span/log complets ne sont pas nettoyés, seuls les champs sont nettoyés.

logfire.info ('Détails de l'utilisateur:{user}', user=User(id=123, password='secret'))

... peut être enregistré comme suit:

Détails de l'utilisateur:[Nettoyé en raison de "mot de passe"]

... mais celui-ci:

user = User(id=123, password ='secret')
logfire.info ('Détails de l'utilisateur:' + str(utilisateur))

seront enregistrés:

Détails de l'utilisateur: User(id=123, password='secret')

Ceci est nécessaire pour que les messages sécurisés tels que « Password Right » ne soient pas complètement édités.

Si inspect_arguments(la valeur par défaut dans Python 3.11+) est activé et fonctionne correctement, alors_est sécurisé avec une chaîne f (par exemple logfire.info(f'User details: {user}')) _).Pour plus d'informations, voir ici.

Bref, ne mettez pas en forme vos messages vous-même.Autres raisons, c'est généralement une bonne pratique aussi.

Exclure les données sensibles de l'URL

La propriété “http.url” enregistrée par la bibliothèque de détection OpenTelemetry est considérée comme sécurisée et ne modifie donc pas les URL telles que 像“http://example.com/users/123/authenticate”.

En règle générale, non seulement pour Logfire, mais aussi pour les URL(y compris les paramètres de requête), il est supposé que les données sensibles doivent être placées dans le corps de la requête ou dans l'en-tête.

Utiliser des requêtes de base de données paramétrées

Documenté par la base de données OpenTelemetry “db.statement” Les propriétés sont considérées comme sécurisées et ne sont donc pas éditées 像 “SELECT secret_value FROM table WHERE ... Une telle requête SQL.

Utilisez des requêtes paramétriques (par exemple, des instructions préparées) afin que les données sensibles ne soient pas directement insérées dans la chaîne de requête, même si la méthode d'interpolation que vous utilisez n'est pas affectée par l'injection SQL.


本文总阅读量次