GNU/Linux >> Belajar Linux >  >> Linux

Cara Andal Untuk Menjebloskan Proses Anak Menggunakan `nsenter:`?

Saya tahu bahwa ruang nama Linux, di antara banyak hal lainnya, dapat dimanfaatkan untuk menangani pembatasan dan pemenjaraan proses anak dengan aman tanpa ada kemungkinan mereka menjadi zombie dan dibuang di init . Tapi saya bingung dengan detail implementasi. Bagaimana saya bisa menggunakan alat yang disediakan oleh util-linux seperti mount dan nsenter untuk melihat, memantau, dan memastikan bahwa semua proses yang diluncurkan adalah turunan langsung namespace dari proses lain?

Jawaban yang Diterima:

Buat ruang nama PID

Perintah yang benar untuk digunakan di sini adalah unshare . Perhatikan bahwa opsi yang diperlukan untuk melakukan ini hanya tersedia dari util-linux 2.23 . Idenya adalah untuk membuat namespace PID baru untuk program yang Anda jalankan sedemikian rupa sehingga semua anaknya juga dibuat di namespace ini. Anda dapat menjalankan perintah di namespace PID baru hanya dengan melakukan:

sudo unshare -fp some_command

Untuk menjalankan shell, hilangkan saja perintahnya. Ini akan membuat proses yang, bersama dengan anak-anaknya, akan memiliki PID seperti biasa di dalam namespace induk (sistem). Namun, dalam namespace baru, ia akan memiliki PID 1 bersama dengan beberapa karakteristik khusus dari init proses. Mungkin karakteristik yang paling relevan dari perspektif pemantauan adalah jika salah satu keturunannya menjadi yatim piatu, mereka akan diasuh ulang ke proses ini daripada init yang sebenarnya. proses.

Cukup melakukan ini mungkin cukup untuk sebagian besar kasus pemantauan. Seperti disebutkan sebelumnya, semua proses dalam namespace memiliki PID di dalam namespace induk sehingga perintah biasa dapat digunakan untuk memantau aktivitasnya. Kami juga yakin bahwa jika ada proses dalam namespace yang menjadi yatim piatu, proses tersebut tidak akan keluar dari cabang pohon proses di bawah PID dari program tingkat atas yang berarti masih dapat dengan mudah dilacak.

Gabungkan dengan namespace mount

Namun, yang tidak dapat kami lakukan adalah memantau proses terkait PID yang pikirkan yaitu memiliki. Untuk melakukan ini, dan khususnya untuk dapat menggunakan ps perintah di dalam namespace baru, Anda perlu memasang procfs separate yang terpisah sistem file untuk namespace. Hal ini pada gilirannya menyebabkan masalah lain karena satu-satunya lokasi yang ps menerima untuk procfs adalah /proc . Salah satu solusinya adalah dengan membuat chroot jail dan pasang procfs baru di sana. Tapi ini adalah pendekatan yang rumit karena minimal kita perlu menyalin (atau setidaknya hard link) semua binari yang ingin kita gunakan bersama dengan perpustakaan yang mereka andalkan ke root baru.

Terkait:Bagaimana cara menghapus izin eksekusi secara rekursif dari file tanpa menyentuh folder?

Solusinya adalah juga menggunakan mount namespace . baru . Di dalam ini kita dapat memasang procfs baru dengan cara yang menggunakan /proc root yang sebenarnya direktori, dapat digunakan dalam namespace PID dan tidak mengganggu hal lain. Untuk membuat proses ini sangat sederhana, unshare perintah memberikan --mount-proc pilihan:

sudo unshare -fp --mount-proc some_command

Sekarang menjalankan ps dalam ruang nama gabungan hanya akan menampilkan proses dengan ruang nam PID dan itu akan menunjukkan proses tingkat atas memiliki PID 1 .

Bagaimana dengan nsenter ?

Seperti namanya, nsenter dapat digunakan untuk memasukkan namespace yang telah dibuat dengan unshare . Ini berguna jika kita ingin mendapatkan informasi yang hanya tersedia dari dalam namespace dari skrip yang tidak terkait. Cara paling sederhana adalah dengan mengakses memberikan PID dari program apa pun yang berjalan di dalam namespace. Agar jelas, ini harus berupa PID dari program target di dalam namespace tempat nsenter sedang dijalankan (karena ruang nama dapat disarangkan, dimungkinkan untuk satu proses memiliki banyak PID). Untuk menjalankan shell di target PID/mount namespace, cukup lakukan:

sudo nsenter -t $PID -m -p

Jika namespace ini diatur seperti di atas, ps sekarang hanya akan mencantumkan proses dalam namespace itu.


Linux
  1. Mengapa Proses Pgid Anak Bukan Pid Orang Tua?

  2. Cegah Sigint Mencapai Proses Anak?

  3. Linux – Bagaimana Menemukan Proses Menggunakan Port Serial?

  1. Proses UNIX / Linux:C fork() Fungsi

  2. Bagaimana menemukan semua proses anak?

  3. Periksa apakah direktori kosong menggunakan C di Linux

  1. Bagaimana cara menghentikan proses dari Python menggunakan pid?

  2. Bagaimana cara membuat daftar proses milik ruang nama jaringan?

  3. Cara sederhana untuk memulai kembali proses yang macet?