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.
Memulai
Prasyarat
- Untuk menjalankan, Tracee membutuhkan versi kernel Linux> = 4.14
Tidak diperlukan jika menggunakan image Docker:
- Pustaka standar C (diuji dengan glibc)
libelf
danzlib
perpustakaan- 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 tracee
eksekusi dimulai, program eBPF akan mencari di sebelah yang dapat dieksekusi, atau di /tmp/tracee
, atau di direktori yang ditentukan dalam TRACEE_BPF_FILE
variabel lingkungan. Jika program eBPF tidak ditemukan, executable akan mencoba membangunnya secara otomatis sebelum dimulai (Anda dapat mengontrolnya menggunakan --build-policy
tanda).
Cara termudah untuk memulai adalah dengan membiarkan tracee
executable membangun program eBPF untuk Anda secara otomatis. Anda bisa mendapatkan executable dengan salah satu cara berikut:
- Unduh dari GitHub Releases (
tracee.tar.gz
). - Gunakan image buruh pelabuhan dari Docker Hub:
aquasec/tracee
(termasuk semua dependensi yang diperlukan). - Buat file yang dapat dieksekusi dari sumber menggunakan
make build
. Untuk itu Anda perlu perkakas pengembangan tambahan. - 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 tracee
file 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:
make bpf
make bpf DOCKER=1
untuk membangun dalam wadah Docker yang mencakup semua perkakas pengembangan.- Ada juga berguna
make all
(danmake all DOCKER=1
varian) 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/tracee
untuk 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/tracee
direktori 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 exec
opsi, Tracee memerlukan akses ke namespace PID host. Untuk Docker, tambahkan --pid=host
ke 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_TRACING
yang tersedia pada kernel terkini (> = 5,8), atauSYS_ADMIN
pada kernel lama (untuk memuat dan memasang program eBPF).
Sebagai alternatif, menjalankan sebagai root
atau dengan --privileged
bendera 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:
- TIME - menunjukkan waktu acara relatif terhadap waktu boot sistem dalam hitungan detik
- UID - id pengguna nyata (dalam namespace pengguna host) dari proses panggilan
- COMM - nama proses panggilan
- PID - pid dari proses panggilan
- TID - tid dari utas panggilan
- RET - nilai yang dikembalikan oleh fungsi
- EVENT - mengidentifikasi acara (misalnya nama syscall)
- ARGS - daftar argumen yang diberikan ke fungsi tersebut
Saat menggunakan output tabel-verbose, informasi berikut ditambahkan:
- 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.
- MNT_NS - pasang nomor inode namespace.
- 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
- PPID - pid induk dari proses panggilan
Bendera konfigurasi
- Gunakan
--help
untuk melihat deskripsi lengkap dari semua opsi. Berikut beberapa flag yang umumnya berguna: --trace
Set mode jejak. Untuk informasi lebih lanjut lihat Konfigurasi Mode Jejak di bawah ini--event
memungkinkan Anda menentukan peristiwa tertentu untuk dilacak. Anda dapat menggunakan tanda ini beberapa kali, misalnya--event execve --event openat
.--list
mencantumkan peristiwa yang tersedia untuk dilacak, yang dapat Anda berikan ke--event
bendera.--output
memungkinkan Anda mengontrol format keluaran, misalnya--output json
akan menampilkan sebagai baris JSON, bukan tabel.--capture
menangkap artefak yang ditulis, dijalankan, atau ditemukan mencurigakan, dan menyimpannya ke direktori keluaran. Nilai yang memungkinkan adalah: 'write' / 'exec' / 'mem' / 'all'
Konfigurasi Mode Jejak
--trace
dan -t
menyetel 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:
Pilihan | Bendera: |
---|---|
Lacak proses baru (default) | tidak ada --trace bendera --trace p ,, --trace process atau--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 container atau--trace container:new |
Lacak penampung yang ada dan yang baru | --trace container:all |
Anda juga dapat menggunakan -t
mis-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/ls
menjadi /bin/bash
, dan inilah yang akan dijalankan oleh kernel. Untuk mengurangi hal ini, Tracee juga menyediakan peristiwa berbasis "LSM" (Modul Keamanan Linux), misalnya, bprm_check
peristiwa 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