Breaking

Saturday, December 5, 2020

Tracee - Kontainer Dan Pelacakan Peristiwa Sistem Menggunakan eBPF

 Kang IT


Tracee - Kontainer Dan Pelacakan Peristiwa Sistem Menggunakan eBPF



Tracee adalah container dan alat pelacakan sistem yang ringan dan mudah digunakan. Ini memungkinkan Anda untuk mengamati panggilan sistem dan peristiwa sistem lainnya secara real-time. Fitur unik Tracee adalah ia hanya akan melacak proses dan penampung yang baru dibuat (yang dimulai setelah Tracee dimulai), untuk membantu pengguna fokus pada peristiwa yang relevan alih-alih setiap hal yang terjadi pada sistem (yang dapat luar biasa). Menambahkan peristiwa baru ke Tracee (terutama panggilan sistem) sangatlah mudah, dan biasanya tidak lebih dari menambahkan beberapa baris kode.




Selain tracing, Tracee juga mampu menangkap file yang ditulis ke disk atau memori ("fileless"), dan mengekstrak binari yang dimuat secara dinamis ke memori aplikasi (misalnya saat aplikasi menggunakan pengemas). Dengan fitur-fitur ini, dimungkinkan untuk dengan cepat mendapatkan wawasan tentang proses yang berjalan yang sebelumnya membutuhkan penggunaan alat analisis dinamis dan pengetahuan khusus.

Lihat demo cepat jejak ini


Memulai

Prasyarat
  • Untuk menjalankan, Tracee membutuhkan versi kernel Linux> = 4.14

Tidak diperlukan jika menggunakan image Docker:

  • Pustaka standar C (diuji dengan glibc)
  • libelfdan zlibperpustakaan
  • dentang> = 9

Tidak diperlukan jika melakukan pra-kompilasi kode eBPF (lihat Opsi penginstalan ):

  • dentang> = 9
  • Header kernel yang tersedia di bawah /usr/src, harus disediakan oleh pengguna dan cocok dengan versi kernel yang sedang berjalan, tidak diperlukan jika membangun program eBPF sebelumnya

Memulai cepat dengan Docker
docker run --name tracee --rm --privileged --pid=host -v /lib/modules/:/lib/modules/:ro -v /usr/src:/usr/src:ro -v /tmp/tracee:/tmp/tracee aquasec/tracee

Catatan: Anda mungkin perlu mengubah mount volume untuk header kernel berdasarkan pengaturan Anda.

Ini akan menjalankan Tracee tanpa argumen, yang secara default mengumpulkan semua kejadian dari semua proses yang baru dibuat dan mencetaknya dalam tabel ke keluaran standar.


Opsi penyiapan

Tracee dibuat dari sebuah executable yang menjalankan program eBPF ( tracee), dan program eBPF itu sendiri ( tracee.bpf.$kernelversion.$traceeversion.o). Ketika traceeeksekusi dimulai, program eBPF akan mencari di sebelah yang dapat dieksekusi, atau di /tmp/tracee, atau di direktori yang ditentukan dalam TRACEE_BPF_FILEvariabel lingkungan. Jika program eBPF tidak ditemukan, executable akan mencoba membangunnya secara otomatis sebelum dimulai (Anda dapat mengontrolnya menggunakan --build-policytanda).

Cara termudah untuk memulai adalah dengan membiarkan traceeexecutable membangun program eBPF untuk Anda secara otomatis. Anda bisa mendapatkan executable dengan salah satu cara berikut:

  1. Unduh dari GitHub Releases ( tracee.tar.gz).
  2. Gunakan image buruh pelabuhan dari Docker Hub: aquasec/tracee(termasuk semua dependensi yang diperlukan).
  3. Buat file yang dapat dieksekusi dari sumber menggunakan make build. Untuk itu Anda perlu perkakas pengembangan tambahan.
  4. Bangun executable dari sumber dalam wadah Docker yang mencakup semua perkakas pengembangan, menggunakan make build DOCKER=1.

Alternatifnya, Anda dapat melakukan pra-kompilasi program eBPF, dan menyediakannya ke traceefile yang dapat dieksekusi. Ada beberapa keuntungan dari pendekatan ini karena Anda tidak memerlukan clang dan header kernel saat runtime lagi, serta mengurangi risiko pemanggilan program eksternal saat runtime. Anda dapat membangun program eBPF dengan cara berikut:

  1. make bpf
  2. make bpf DOCKER=1 untuk membangun dalam wadah Docker yang mencakup semua perkakas pengembangan.
  3. Ada juga berguna make all(dan make all DOCKER=1varian) yang membangun program yang dapat dieksekusi dan eBPF.

Setelah Anda memiliki artefak program eBPF, Anda dapat memberikannya ke Tracee di salah satu lokasi yang disebutkan di atas. Dalam hal ini, gambar Docker lengkap dapat diganti dengan gambar yang lebih ringan aquasec/tracee:slim. Gambar ini tidak dapat membangun program eBPF sendiri, dan dimaksudkan untuk digunakan ketika Anda telah menyusun program eBPF sebelumnya.


Berjalan dalam wadah

Tracee menggunakan direktori sistem file , secara default /tmp/traceeuntuk menangkap artefak runtime, komponen internal, dan lain-lain. Saat menjalankan dalam sebuah wadah, ada gunanya untuk memasang direktori ini, sehingga artefak dapat diakses setelah penampung keluar. Misalnya, Anda dapat menambahkan ini ke perintah jalankan buruh pelabuhan -v /tmp/tracee:/tmp/tracee.

Jika dijalankan dalam container, terlepas dari apakah itu gambar penuh atau tipis, disarankan untuk menggunakan kembali program eBPF di seluruh proses dengan memasangnya dari host ke container. Dengan cara ini, jika penampung membangun program eBPF, ia akan tetap ada di host, dan jika program eBPF sudah ada di host, penampung akan secara otomatis menemukannya. Jika Anda sudah memasang /tmp/traceedirektori dari host, Anda siap melakukannya, karena Tracee secara default akan menggunakan lokasi ini untuk program eBPF. Anda juga dapat me-mount file program eBPF individual jika disimpan di tempat lain (misalnya dalam volume bersama), misalnya: -v /path/to/tracee.bpf.1_2_3.4_5_6.o:/some/path/tracee.bpf.1_2_3.4_5_6.o -e TRACEE_BPF_FILE=/some/path.

Saat menggunakan --capture execopsi, Tracee memerlukan akses ke namespace PID host. Untuk Docker, tambahkan --pid=hostke perintah run.

Jika Anda membuat program eBPF dalam sebuah wadah, Anda harus menyediakan header kernel di dalam wadah tersebut. Contoh quickstart memiliki mount lebar yang berfungsi dalam berbagai kasus, untuk tujuan demonstrasi. Jika Anda ingin, Anda dapat mempersempit mereka tunggangan turun ke direktori yang berisi header pada setup Anda, misalnya: -v /path/to/headers:/myheaders -e KERN_SRC=/myheaders. Seperti disebutkan sebelumnya, praktik yang lebih baik untuk produksi adalah dengan melakukan pra-kompilasi program eBPF, dalam hal ini header kernel tidak diperlukan pada waktu proses.


Izin

Jika Tracee sebenarnya tidak melacak, Tracee tidak membutuhkan hak istimewa. Misalnya, hanya membangun program eBPF, atau membuat daftar opsi yang tersedia, dapat dilakukan dengan pengguna biasa.
Untuk benar-benar melacak, Tracee perlu dijalankan dengan kemampuan yang memadai:

  • CAP_SYS_RESOURCE (untuk mengelola batas peta eBPF)
  • CAP_BPF+ CAP_TRACINGyang tersedia pada kernel terkini (> = 5,8), atau SYS_ADMINpada kernel lama (untuk memuat dan memasang program eBPF).

Sebagai alternatif, menjalankan sebagai rootatau dengan --privilegedbendera Docker, adalah cara mudah untuk memulai.


Menggunakan Tracee

Memahami output

Berikut adalah contoh keluaran dari menjalankan Tracee tanpa argumen tambahan (yang secara default melacak semua kejadian):

TIME(s)        UID    COMM             PID     TID     RET             EVENT                ARGS
176751.746515 1000 zsh 14726 14726 0 execve pathname: /usr/bin/ls, argv: [ls]
176751.746772 1000 zsh 14726 14726 0 security_bprm_check pathname: /usr/bin/ls, dev: 8388610, inode: 777
176751.747044 1000 ls 14726 14726 -2 access pathname: /etc/ld.so.preload, mode: R_OK
176751.747077 1000 ls 14726 14726 0 security_file_open pathname: /etc/ld.so.cache, flags: O_RDONLY|O_LARGEFILE, dev: 8388610, inode: 533737
...

Setiap baris adalah satu peristiwa yang dikumpulkan oleh Tracee, dengan informasi berikut:

  1. TIME - menunjukkan waktu acara relatif terhadap waktu boot sistem dalam hitungan detik
  2. UID - id pengguna nyata (dalam namespace pengguna host) dari proses panggilan
  3. COMM - nama proses panggilan
  4. PID - pid dari proses panggilan
  5. TID - tid dari utas panggilan
  6. RET - nilai yang dikembalikan oleh fungsi
  7. EVENT - mengidentifikasi acara (misalnya nama syscall)
  8. ARGS - daftar argumen yang diberikan ke fungsi tersebut

Saat menggunakan output tabel-verbose, informasi berikut ditambahkan:

  1. UTS_NAME - nama namespace uts. Karena tidak ada objek id kontainer di kernel, dan buruh pelabuhan / k8s biasanya akan menyetel ini ke id kontainer, kami menggunakan bidang ini untuk membedakan antar kontainer.
  2. MNT_NS - pasang nomor inode namespace.
  3. PID_NS - nomor inode ruang nama pid. Untuk mengetahui apakah ada kontainer yang berbeda dalam namespace pid yang sama (misalnya dalam pod k8s), dimungkinkan untuk memeriksa nilai ini
  4. PPID - pid induk dari proses panggilan

Bendera konfigurasi
  • Gunakan --helpuntuk melihat deskripsi lengkap dari semua opsi. Berikut beberapa flag yang umumnya berguna:
  • --traceSet mode jejak. Untuk informasi lebih lanjut lihat Konfigurasi Mode Jejak di bawah ini
  • --eventmemungkinkan Anda menentukan peristiwa tertentu untuk dilacak. Anda dapat menggunakan tanda ini beberapa kali, misalnya --event execve --event openat.
  • --listmencantumkan peristiwa yang tersedia untuk dilacak, yang dapat Anda berikan ke --eventbendera.
  • --outputmemungkinkan Anda mengontrol format keluaran, misalnya --output jsonakan menampilkan sebagai baris JSON, bukan tabel.
  • --capturemenangkap artefak yang ditulis, dijalankan, atau ditemukan mencurigakan, dan menyimpannya ke direktori keluaran. Nilai yang memungkinkan adalah: 'write' / 'exec' / 'mem' / 'all'

Konfigurasi Mode Jejak

--tracedan -tmenyetel apakah akan melacak peristiwa berdasarkan proses di seluruh sistem, atau Penampung. Ini juga digunakan untuk menyetel apakah hanya melacak proses / penampung baru (default), proses / penampung yang ada, atau proses tertentu. Melacak kontainer tertentu saat ini tidak dimungkinkan. Opsi yang memungkinkan adalah:

PilihanBendera:
Lacak proses baru (default)tidak ada --tracebendera --trace p,, --trace processatau--trace process:new
Lacak proses yang ada dan yang baru--trace process:all
Lacak PID tertentu--trace process:<pid>,<pid2>,... atau --trace p:<pid>,<pid2>,...
Lacak penampung baru--trace c, --trace containeratau--trace container:new
Lacak penampung yang ada dan yang baru--trace container:all

Anda juga dapat menggunakan -tmis-t p:all


Pelacakan aman

Saat Tracee membaca informasi dari program pengguna, Tracee tunduk pada kondisi perlombaan di mana program pengguna mungkin dapat mengubah argumen setelah Tracee membacanya. Misalnya, sebuah program dipanggil execve("/bin/ls", NULL, 0), Tracee mengambilnya dan akan melaporkannya, kemudian program mengubah argumen pertama dari /bin/lsmenjadi /bin/bash, dan inilah yang akan dijalankan oleh kernel. Untuk mengurangi hal ini, Tracee juga menyediakan peristiwa berbasis "LSM" (Modul Keamanan Linux), misalnya, bprm_checkperistiwa yang dapat dilaporkan oleh pelacakan dan referensi silang dengan peristiwa syscall reguler yang dilaporkan.




Regards

dr. Muhammad Sobri Maulana, S.Kom

No comments:

Post a Comment