Apakah ada cara mudah untuk mencatat semua perintah yang dijalankan, termasuk argumen baris perintah?

11

Saya mencoba menemukan cara mencatat instantiasi khusus rrdtooluntuk melihat apakah jalur yang diterimanya salah.

Saya tahu saya bisa membungkus executable dalam skrip shell yang akan mencatat parameter, tapi saya bertanya-tanya apakah ada cara yang lebih spesifik untuk memonitor kernel itu, mungkin panggilan balik sistem file yang melihat ketika / proc / pid / exe tertentu cocok dengan biner yang diberikan?

Peter Grace
sumber
Apakah ada cara untuk auditdmerekam argumen baris perintah serta program yang dijalankan? serverfault.com/questions/765179/…
Neil

Jawaban:

16

Ya, ada fasilitas kernel: subsistem audit. The auditddaemon tidak logging, dan perintah auditctlmenyiapkan aturan logging. Anda dapat mencatat semua panggilan ke sistem tertentu alls, dengan beberapa penyaringan. Jika Anda ingin mencatat semua perintah yang dijalankan dan argumennya, catat execvepanggilan sistem:

auditctl -a exit,always -S execve

Untuk secara khusus melacak permintaan program tertentu, tambahkan filter pada program yang dapat dieksekusi:

auditctl -a exit,always -S execve -F path=/usr/bin/rrdtool

Log muncul di /var/log/audit.log, atau di mana pun distribusi Anda menempatkannya. Anda harus root untuk mengendalikan subsistem audit.

Setelah Anda selesai menyelidiki, gunakan baris perintah yang sama dengan -dalih - alih -amenghapus aturan logging, atau jalankan auditctl -Duntuk menghapus semua aturan audit.

Untuk keperluan debugging, mengganti program dengan skrip wrapper memberi Anda lebih banyak fleksibilitas untuk mencatat hal-hal seperti lingkungan, informasi tentang proses induk, dll.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Mengapa -F path=/ust/bin/rrdtool? Saya tidak mengerti bagaimana rrdtoolbahkan perangkat lunak terkait.
Graeme
@Graeme Masalah yang dijelaskan dalam pertanyaan adalah melacak permohonan rrdtool. Jika Anda ingin mencatat semua program, masukkan -F path=…bagian tersebut (tentu saja Anda akan mendapatkan banyak log).
Gilles 'SO- stop being evil'
Benar ... pertanyaan pertama. Terima kasih.
Graeme
Ini semua hebat, tapi bagaimana cara mereset konfigurasi ke keadaan awal? Kalau tidak, ia akan terus mengisi log dengan perintah baru dan baru diluncurkan ... atau apakah auditctlperintah ini hanya efektif sampai reboot?
Ruslan
@Ruslan Efek auditctlhanya bertahan sampai reboot, tapi itu bagus juga, saya telah menambahkan instruksi untuk menghapusnya tanpa me-reboot jawaban saya.
Gilles 'SANGAT berhenti menjadi jahat'
6

Anda bisa menggunakan snoopy .

Snoopy adalah solusi yang lebih ringan karena tidak memerlukan kerja sama kernel. Semua yang diperlukan adalah dynamic loader (dl) yang memuat pramuka perpustakaan snoopy, path yang ditentukan dalam /etc/ld.so.preload.

Pengungkapan: Saya pengelola snoopy saat ini.

Bostjan Skufca
sumber
Apakah mungkin untuk melakukan logging untuk perintah yang secara langsung atau tidak langsung dihasilkan dari shell tertentu saja?
rv
Saya tidak yakin saya mengerti pertanyaan Anda - maksud Anda "shell" sebagai program khusus yang digunakan sebagai shell (bash, dash, zsh dll), atau maksud Anda Anda ingin login hanya PTY tertentu? Snoopy menyediakan kerangka kerja penyaringan, tetapi saat ini hanya beberapa filter yang sangat mendasar yang diterapkan, lihat di sini untuk daftar: tautan . Jika Anda memiliki usecase konkret yang mungkin berlaku untuk orang lain, harap jelaskan dalam permintaan fitur, dan, oh, btw, patch diterima :)
Bostjan Skufca
Maksud saya hanya PTY tertentu.
rv
Tidak ada filter khusus untuk ATM PTY yang tersedia. Namun, Anda bisa menggunakan snoopy untuk mencatat semuanya, termasuk acara PTY mana yang terjadi, dan kemudian melakukan pemfilteran dalam daemon syslog Anda. Saya tidak tahu yang mana yang Anda gunakan, tetapi syslog-ng (misalnya) dapat melakukan pencocokan regex, positif atau negatif.
Bostjan Skufca
Tentu, terima kasih! Alat dan pendekatannya secara umum cukup bermanfaat. Saya dapat dengan mudah melakukan penyaringan untuk mendapatkan apa yang saya butuhkan.
rv
2

Subsistem "audit" kernel Linux dapat melakukan apa yang Anda butuhkan.

mis. jika Anda menjalankan perintah ini:

auditctl -a exit,always -F arch=b64 -S execve
auditctl -a exit,always -F arch=b32 -S execve

Kemudian setiap peristiwa eksekusi dicatat, dan banyak informasi disediakan tentang itu

misal ini adalah output dari saya berjalan tail /var/log/audit/audit.log

exit=0 a0=7f0e4a21e987 a1=7f0e4a21e6b0 a2=7f0e4a21e808 a3=8 items=2 ppid=906 pid=928 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts0 ses=1 comm="tail" exe="/usr/bin/tail" subj=kernel key=(null)
type=EXECVE msg=audit(1543671660.203:64): argc=2 a0="tail" a1="/var/log/audit/audit.log"
type=CWD msg=audit(1543671660.203:64):  cwd="/home/sweh"
type=PATH msg=audit(1543671660.203:64): item=0 name="/usr/bin/tail" inode=266003 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PATH msg=audit(1543671660.203:64): item=1 name="/lib64/ld-linux-x86-64.so.2" inode=273793 dev=fd:03 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=unlabeled objtype=NORMAL cap_fp=0000000000000000 cap_fi=0000000000000000 cap_fe=0 cap_fver=0
type=PROCTITLE msg=audit(1543671660.203:64): proctitle=7461696C002F7661722F6C6F672F61756469742F61756469742E6C6F67

Ada beberapa nilai menarik yang bisa dilihat; misalnya "auid" adalah 500, yang merupakan ID login saya, meskipun "uid" adalah nol (karena saya menjalankannya di bawah su). Jadi meskipun pengguna mungkin telah beralih akun suatau sudokami masih dapat melacak kembali ke "ID audit" mereka

Sekarang auditctlperintah itu akan hilang pada saat reboot. Anda dapat meletakkannya di file konfigurasi (mis. Dalam /etc/audit/rules.d/direktori, pada CentOS 7). Lokasi yang tepat akan tergantung pada versi OS Anda. The auditctlhalaman pengguna harus membantu di sini.

Hati-hati, meskipun ... ini akan menyebabkan banyak pesan log dihasilkan. Pastikan Anda memiliki cukup ruang pada disk!

Jika perlu aturan dapat dibatasi untuk pengguna tertentu, atau perintah tertentu.

Dan waspadalah juga; jika pengguna memasukkan kata sandi dalam eksekusi perintah (mis. mysql --user=username --password=passwd) maka ini akan dicatat.

Stephen Harris
sumber