Lewati ke isi

Membersihkan data sensitif

Logfire SDK memindai dan mengedit data yang berpotensi sensitif dari log dan bentang sebelum mengekspornya.

Pembersihan yang tidak bisa dinonaktifkan

Untuk menonaktifkan pembersihan sepenuhnya, silakan [scrubbing][logfire.configure(scrubbing)] Setel ke False Apa itu?

import logfire

logfire.configure(scrubbing=False)

Gunakan pola khusus untuk pembersihan lebih lanjut

Secara default, SDK mencari beberapa ekspresi reguler yang sensitif. Untuk menambahkan skema Anda sendiri, atur extra_patterns untuk ditambahkan ke daftar string ekspresi reguler:

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

Berikut ini adalah mode pembersihan default:

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

Gunakan panggilan balik untuk mengurangi pembersihan

Di sisi lain, jika pembersihan agresif, Anda dapat meneruskan fungsi ke callback untuk mencegah data tertentu diedit.

Untuk setiap kecocokan potensial yang ditemukan oleh scrubber, fungsi disebut. Jika None dikembalikan, nilai diedit. Jika tidak, nilai yang dikembalikan menggantikan nilai yang sesuai. Fungsi menerima logfire.ScrubMatch .

Berikut ini contohnya:

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

Kiat Keamanan

Menggunakan template pesan

Pesan full span / log tidak dibersihkan, hanya kolom di dalamnya. Misalnya, berikut ini:

logfire.info ('Rincian pengguna:{user}', user = User (id = 123, password = 'secret'))

Berikut ini dapat dicatat:

Rincian pengguna: [Dibersihkan karena "kata sandi"]

... Tapi ini:

Pengguna = Pengguna (id = 123, kata sandi = 'rahasia')
logfire.info ('detail pengguna:' + str (pengguna))

Akan merekam:

Rincian pengguna: Pengguna (id = 123, kata sandi = 'rahasia')

Hal ini diperlukan agar pesan keamanan seperti "kata sandi yang benar" tidak sepenuhnya diedit.

Jika inspect_arguments(default dalam Python 3.11 +) diaktifkan dan bekerja dengan baik, menggunakan string f (misalnya logfire.info(f'User details: {user}')) ) adalah.Untuk informasi lebih lanjut, lihat di sini.

Singkatnya, jangan memformat pesan sendiri. Untuk alasan lain, ini biasanya praktik yang baik juga.

Kecualikan data sensitif dari URL

Properti “http.url” yang direkam oleh perpustakaan deteksi OpenTelemetry dianggap aman, sehingga URL seperti 像“http://example.com/users/123/authenticate” tidak diedit.

Sebagai aturan umum, tidak hanya untuk Logfire, tetapi juga mengasumsikan bahwa URL (termasuk parameter kueri) akan dicatat, sehingga data sensitif harus di tempatkan di badan permintaan atau header.

Menggunakan kueri database parameterisasi

Atribut “db.statement” yang direkam oleh perpustakaan alat database OpenTelemetry dianggap aman, dan oleh karena itu kueri SQL seperti "像 “SELECT secret_value FROM table WHERE ..." tidak diedit.

Gunakan kueri parameterisasi, seperti pernyataan yang sudah disiapkan, sehingga data sensitif tidak dimasukkan langsung ke dalam string kueri, bahkan jika Anda menggunakan metode interpolasi yang tidak terpengaruh oleh injeksi SQL.


本文总阅读量次