Senario
Anda menyelenggara API Node.js dalam kontena dengan kebergantungan pihak ketiga. Ia membaca konfigurasi, mengakses storan objek dan kadangkala melancarkan proses anak pemprosesan imej. Pasukan keselamatan mencadangkan --permission dengan hanya kebenaran fail, rangkaian dan proses anak yang diperlukan. Terangkan model ancaman, inventori kebenaran, ujian keserasian, pemantauan dan pembalikan.
Perkara yang dinilai oleh penemu duga
- Mengetahui bahawa Permission Model ialah tali pinggang keledar untuk kod yang dipercayai, bukan kotak pasir (sandbox) untuk kod berniat jahat.
- Menguraikan keupayaan fail, rangkaian, proses anak, worker dan addon natif kepada keistimewaan paling rendah (least privilege).
- Mengenal pasti pautan simbolik (symlinks), deskriptor fail sedia ada, susunan pemulaan dan had pewarisan.
- Mereka bentuk canary, telemetri penafian yang berguna dan pelan pembalikan yang selamat untuk perniagaan.
Soalan penjelasan
Sahkan versi Node, titik masuk (entrypoint), addon natif, keperluan worker/FFI/WASI, laluan dan domain, serta sama ada aplikasi mesti menjana (spawn) proses. Periksa kawalan kontena dan OS sedia ada seperti seccomp, identiti pengguna dan sistem fail baca sahaja supaya Node tidak dianggap sebagai satu-satunya benteng pertahanan.
Jawapan 30 saat
Saya akan menganggapnya sebagai kawalan keistimewaan paling rendah untuk kod yang dipercayai, bukan pertahanan lengkap terhadap kebergantungan berniat jahat. Bina pemberian kebenaran daripada audit kebergantungan pengeluaran dan masa jalanan (runtime) untuk fs.read, fs.write, skop rangkaian, anak dan worker. Dayakannya dalam mod bayangan (shadow mode) dan 1% trafik, rekod ERR_ACCESS_DENIED serta kependaman, dan uji addon natif, pautan simbolik serta deskriptor sedia ada. Kekalkan pengasingan kontena. Jika kadar ralat atau kebergantungan kritikal mengalami regresi, buang bendera permulaan untuk membalikkan keadaan dan perhalusi inventori.
Penaakulan langkah demi langkah
1. Tentukan sempadan keselamatan
Node menerangkan Permission Model sebagai sekatan sumber proses dan secara jelas menyatakan bahawa ia tidak melindungi daripada kod berniat jahat; Node mempercayai kod yang diarahkan untuk dijalankan. Ia mengurangkan akses tidak sengaja oleh aplikasi yang dipercayai, tetapi tidak boleh menggantikan kontena, pengguna OS, seccomp atau kawalan rantaian bekalan kebergantungan.
2. Bina inventori kebenaran
Mulakan dengan penafian lalai (default deny). Berikan --allow-fs-read hanya kepada konfigurasi dan laluan statik, sempitkan --allow-fs-write kepada output sementara, dan --allow-net kepada domain storan objek yang diperlukan. Tambah --allow-child-process, --allow-worker, atau --allow-addons hanya dengan keperluan yang didokumenkan. Kenakan versi pada pemberian kebenaran dan wajibkan semakan pemilik perkhidmatan.
3. Sahkan tingkah laku masa jalanan
Rangkumi permulaan, pemeriksaan kesihatan (health checks), muat naik, pemprosesan imej, tugasan berjadual dan laluan ralat. Sahkan process.permission.has() dan ingat bahawa permission.drop() tidak boleh diubah (irreversible) dan hanya mempengaruhi semakan masa hadapan; ia tidak menutup deskriptor, soket atau worker yang telah dibuka. Uji pautan simbolik, addon natif, npx dan sempadan proses anak.
4. Canary dan pembalikan
Dayakannya terlebih dahulu dalam persekitaran pementasan (staging) dan satu tika (instance) tanpa keadaan (stateless). Kumpulkan kelas sumber yang dinafikan, timbunan (stack trace), versi dan penyewa tanpa merekod nilai sensitif. Jadikan kadar ralat, P95, kejayaan permulaan dan tugasan perniagaan yang selesai sebagai syarat perluasan. Pembalikan dilakukan dengan membuang --permission atau bendera --allow-* yang berkaitan; kekalkan kawalan baca sahaja, bukan root (non-root) dan rangkaian pada lapisan kontena.
Contoh jawapan berkualiti tinggi
Saya akan merangka matriks kebenaran: konfigurasi baca sahaja, direktori sementara yang boleh ditulis, domain storan objek yang diperlukan, proses anak penukaran imej, dan tiada worker atau addon natif tanpa sebab perniagaan. Permission Model menyekat fs secara lalai, jadi parameter permulaan memberikan setiap keupayaan secara eksplisit. Saya akan meletakkan versi pada parameter tersebut, menjalankan senario penyepaduan dalam CI dengan imej terkecil, dan mengesahkan setiap laluan serta tugas latar belakang. Canary meliputi satu kelas stateless, mengagregatkan ERR_ACCESS_DENIED, dan mencincang (hash) laluan sumber. Saya akan menguji pautan simbolik, deskriptor sedia ada secara khusus, dan hakikat bahawa proses anak serta worker tidak mewarisi model dengan cara yang sama; risiko kod berniat jahat kekal ditangani oleh pengasingan kontena dan OS. Luaskan hanya selepas kriteria permulaan, P95, penafian dan penyempurnaan tugasan dipenuhi. Jika kebergantungan kritikal dinafikan atau ralat meningkat, buang bendera untuk memulihkan tingkah laku asal, kemudian kemas kini inventori sebelum mencuba semula.
Kesilapan biasa
- Mendakwa bahawa Permission Model selamat untuk menjalankan pakej pihak ketiga yang berniat jahat.
- Memberikan
--allow-fs-read=*dan--allow-fs-write=*tanpa keperluan. - Mengabaikan sekatan addon natif, worker, proses anak, WASI, FFI atau rangkaian.
- Menganggap bahawa
permission.drop()menutup deskriptor, soket atau worker yang sedia dibuka. - Hanya menguji permulaan setempat dan terlepas pandang npx, pautan simbolik atau tugasan latar belakang sebenar.
Soalan susulan dan jawapan
“Bolehkah ia menggantikan kotak pasir kontena?”
Tidak. Node menyatakan secara jelas bahawa ia tidak melindungi daripada kod berniat jahat. Gabungkannya dengan pelaksanaan bukan root, sistem fail baca sahaja, seccomp, dasar rangkaian dan kawalan rantaian bekalan kebergantungan.
“Mengapa perkhidmatan masih tidak dapat membaca fail?”
Periksa titik masuk dan laluan yang dikonfigurasikan, tingkah laku kad liar (wildcard), dan sama ada bacaan pemulaan berlaku selepas model ditetapkan. Gunakan permission.has() dan peristiwa penafian untuk mengesan kebenaran yang hilang.
“Bagaimanakah anda membenarkan pemprosesan imej?”
Berikan --allow-child-process secara berasingan, hadkan fail boleh laksana (executable) serta direktori input/output, dan kekalkan sekatan OS dan kontena. Jika panggilan pustaka boleh menggantikan proses anak, buang kebenaran tersebut sebagai ganti.