un

guest
1 / ?
back to lessons

Kepala sebagai Tas

Framework logging HTTP menganggap header permintaan sebagai tas kunci-nilai. API logging mengungkapkan tas penuh. Operator memungkinkan logging header untuk debugging: ketika permintaan gagal, header memberi tahu cerita. Tidak ada denylist bawaan. Tidak ada filtrasi kredit di dokumentasi. Header penuh ke disk.

Header kredit dalam permintaan yang biasa:

- Authorization: Bearer eyJhbGciOiJIUzI1NiJ9... (JWT atau token OAuth)

- Cookie: session=abc123; auth=xyz789

- X-API-Key: sk-live-abc123...

- X-Auth-Token: ghp_abc123... (pattern token akses pribadi GitHub)

Nilai-nilai ini mengautentikasi permintaan. Ditulis ke file log, mereka mengautentikasi setiap permintaan.

Pipa Kredit

Kredit yang ditulis ke file log tidak tinggal di satu tempat. Ini perjalanan:

1. Server web menulis ke /var/log/nginx/access.log

2. Agent rotasi log (logrotate) mengcopy ke /var/log/nginx/access.log.1

3. Log shipper (Fluentd, Filebeat, Logstash) membaca & mengirim ke agregator

4. Log aggregator (Elasticsearch, Splunk, Datadog) mengindeks & menyimpan

5. Disimpan selama 30-90 hari berdasarkan kebijakan default

Kredit ada di semua lima lokasi secara bersamaan. Menarik kembali token sesi tidak menghapus kredit dari agregator log. Tetap dapat dicari, diekspor, & diakses oleh siapa pun yang memiliki akses log untuk jendela retensi penuh.

Jendela Eksposur

Jendela eksposur untuk kredit dalam memori: max(jangka waktu sesi, waktu proses). Sesi: jam sampai hari. Proses: jam sampai minggu.

Jendela eksposur untuk kredit dalam log: max(jangka waktu sesi, retensi log). Sesi: jam sampai hari. Retensi: 30-90 hari.

Kredit yang dirampas dari memori diperlukan penjahat hadir selama jendela sesi. Kredit yang dirampas dari log hanya membutuhkan akses ke agregator log, tersedia secara retroaktif, untuk periode retensi penuh.

MOAD-0003 vs MOAD-0004

MOAD-0003 (Rincian Terkorban): kredit dalam memori bocor ke pengelola permintaan yang salah. Hanya dapat diakses selama jendela proses, melalui pool thread. Ephemeral.

MOAD-0004 (Secret Terkait Log): kreditenal yang disimpan di disk tetap bertahan melalui rotasi log, pengiriman log, & agregasi log. Akses secara retroaktif, oleh siapa pun dengan akses log, selama 30-90 hari. Persisten.

Perbedaan struktural: sementara vs persisten. Perbaikan beroperasi pada lapisan yang berbeda.

Sementara vs Persisten

Perbedaan sementara/persisten menentukan permukaan risiko, lapisan perbaikan, & persyaratan tanggapan insiden.

Mengapa MOAD-0004 lebih berisiko dibanding MOAD-0003? Bandingkan di mana setiap kreditenal hidup dan berapa lama.

Daftar Pembatas Kreditenal di Lapisan Serialisasi

Perbaikan: daftar pembatas kreditenal di lapisan serialisasi. Sebelum nilai kepala mencapai output log, periksa nama kepala terhadap daftar pembatas. Gantikan nilai dengan [REDACTED].

CREDENTIAL_HEADERS = {
    'authorization',
    'cookie',
    'x-api-key',
    'x-auth-token',
    'x-csrf-token',
    'proxy-authorization',
}

def sanitize_headers(headers: dict) -> dict:
    return {
        k: '[REDACTED]' if k.lower() in CREDENTIAL_HEADERS else v
        for k, v in headers.items()
    }

Daftar tolak harus berada pada lapisan serialisasi, bukan pada lapisan query log. Pengurangan query log: diterapkan setelah kredensial mencapai disk; nilai mentah tetap ada, hanya tersembunyi dari tampilan. Pengurangan lapisan serialisasi: kredensial tidak pernah mencapai disk. Nilai mentah tidak pernah masuk ke dalam file log, buffer pengiriman log, atau indeks pengagregasi log.

Pengujian Daftar Tolak

Tiga pola uji:

- Positif: permintaan dengan Authorization: Bearer token123 menghasilkan entri log dengan Authorization: [REDACTED]

- Negatif: permintaan dengan Content-Type: application/json menghasilkan entri log dengan nilai utuh

- Case-insensitive: AUTHORIZATION: Bearer token123 juga menghasilkan [REDACTED] (nama header HTTP tidak case-sensitive)

Daftar tolak membutuhkan perawatan: pola baru kredensial header (misalnya, header kustom X-Service-Auth) membutuhkan penambahan eksplisit. Perbaikan ini struktural tetapi tidak mempertahankan diri sendiri.

Terapkan Daftar Tolak

Sebuah tim mengonfigurasi format log akses Nginx mereka untuk mencakup semua header permintaan untuk debugging insiden produksi. Konfigurasi:

log_format debug_format '$remote_addr - $request - $http_authorization - $http_cookie';
access_log /var/log/nginx/debug.log debug_format;

Mereka menyelesaikan insiden & berencana menghapus konfigurasi debug, tetapi perubahan tidak mencapai produksi sebelum siklus deploy berikutnya (7 hari lagi).

Identifikasi kecacatan. Apa yang bisa terpapar sebagai kredensial header? Deskripsikan pendekatan daftar tolak: di mana ia diterapkan, apa yang diperiksa, dan apa yang dihasilkan?