Bagaimana saya bisa melacak file executable yang dibuat oleh pengguna saya di Linux?

11

Menggunakan Linux, saya ingin melacak executable yang dieksekusi atas nama saya, termasuk seluruh baris perintah (dalam praktiknya, setiap exec * () dilakukan sebagai pengguna saya sendiri). Suatu program yang tidak saya kendalikan seharusnya, untuk menangani suatu tugas, untuk mengeksekusi program yang saya lewati, tetapi saya ingin memastikan ia melakukannya, dan opsi apa yang digunakannya. Program yang tidak saya kontrol itu licik, dan tampaknya mengubah perilaku tergantung pada nama program yang seharusnya dijalankan untuk tugas tersebut, jadi saya tidak bisa meneruskan skrip shell yang akan mencatat info dan memanggil yang asli program.

Apakah mungkin bagi saya untuk diberitahu tentang semua eksekutif * () yang dilakukan sebagai pengguna saya pada sistem di Linux, termasuk baris perintah penuh? Pendek berjalan psdalam satu lingkaran, yaitu. Saya lebih suka melakukannya secara langsung pada sistem tempat saya bekerja dan tidak memerlukan akses root, tetapi jika perlu saya dapat menelurkan sistem di mana saya memiliki akses root, instal program dan selidiki di sana.

Menggunakan Ubuntu 12,4 LTS.

Pierre Lebeaupin
sumber
Saya bertanya di sini daripada Tanya Ubuntu, karena ini lebih merupakan pertanyaan Unix / Linux daripada pertanyaan Ubuntu nyata.
Pierre Lebeaupin
1
Seberapa licik programnya? Apakah ia mencoba mendeteksi atau mem-bypass debuggers? Apakah ini terkait secara dinamis? Jika terlalu licik, Anda mungkin perlu menggunakan mesin virtual tempat Anda melakukan root. (Ini mungkin strategi paling sederhana bahkan untuk program yang tidak terlalu licik.)
Gilles 'SO-stop being evil'
@Gilles Itu memang kemungkinan, saya akan mencoba VM, lalu perbarui pertanyaan jika itu ternyata bisa diterapkan.
Pierre Lebeaupin
Catatan: Anda tampaknya benar-benar menginginkan nama program dan argumen, yang diberikan oleh jawaban audit, tetapi 'seluruh baris perintah' di shell juga dapat memengaruhi proses anak menggunakan pengaturan pengalihan / perpipaan dan envvar serta berisi pergantian / ekspansi, kutipan tidak signifikan dan jarak, dan kontrol struktur suka doa && dob, dan Anda tidak akan mendapatkannya.
dave_thompson_085

Jawaban:

10

Anda harus mengonfigurasi auditduntuk merekam execveacara. Contoh pada RHEL5:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]#

Saya mengabaikan peringatan lengkung dan sepertinya tidak masalah tetapi Anda dapat menggunakan -F arch=b64atau -F arch=b32mengaturnya jika Anda mau.

Hasil di atas adalah:

[root@ditirlns01 ~]# ls /tmp/whatever
ls: /tmp/whatever: No such file or directory
[root@ditirlns01 ~]# grep whatever /var/log/audit/audit.log
type=EXECVE msg=audit(1386797915.232:5527206): argc=3 a0="ls" a1="--color=tty" a2="/tmp/whatever"
type=EXECVE msg=audit(1386797927.133:5527241): argc=3 a0="grep" a1="whatever" a2="/var/log/audit/audit.log"
[root@ditirlns01 ~]#

Itu jelas cepat dan kotor tetapi itulah dasar bagaimana Anda melakukannya. Apa yang perlu Anda lakukan mungkin sangat bergantung pada apa yang Anda coba lakukan dengan tepat. Anda dapat mengurangi aliran audit menggunakan berbagai filter dalam auditctlperintah tetapi saya tidak tahu informasi itu sehingga saya tidak tahu apa yang harus dimasukkan. Jika Anda memerlukan sesuatu yang lebih spesifik, saya sarankan Anda memeriksa halaman manual atau mengirim komentar untuk jawaban ini dan saya akan memperbaruinya lagi.

Harapan yang membantu mendorong Anda ke arah yang benar.

EDIT:

Karena pertanyaan Anda melibatkan melihat pengguna tertentu, saya dapat menunjukkan kepada Anda bahwa:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F euid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Identik dengan yang di atas, tetapi hanya execveoleh seseorang yang menjalankan dengan ID pengguna efektif yang 16777216akan dicatat. Jika Anda perlu menentukan nilai pengguna loginuid(yang awalnya mereka login ke sistem) maka Anda memfilter dengan auid:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216
WARNING - 32/64 bit syscall mismatch, you should specify an arch

Filter AUID / loginuid akan berguna misalnya jika pengguna akan melakukan suatau sudomelakukan root. Dalam situasi itu akan ada banyak hal berjalan sebagai root, tetapi Anda hanya peduli dengan hal-hal yang ditendang oleh pengguna yang bersangkutan. auditctljuga memungkinkan Anda menumpuk filter sehingga Anda dapat memfilter dengan keduanya euiddan auid:

[root@ditirlns01 ~]# auditctl -a always,entry -S execve -F auid=16777216 -F euid=0
WARNING - 32/64 bit syscall mismatch, you should specify an arch
[root@ditirlns01 ~]# ls /tmp/nashly -ltar
ls: /tmp/nashly: No such file or directory
[root@ditirlns01 ~]# grep nashly /var/log/audit/audit.log
type=EXECVE msg=audit(1386798635.199:5529285): argc=4 a0="ls" a1="--color=tty" a2="/tmp/nashly" a3="-ltar"
type=EXECVE msg=audit(1386798646.048:5529286): argc=3 a0="grep" a1="nashly" a2="/var/log/audit/audit.log"
Bratchley
sumber
1
"Perhatikan bahwa saya tidak memiliki akses root". (Kalau tidak, ini akan menjadi jawaban yang baik.)
Gilles 'SANGAT berhenti menjadi jahat'
Sial ... sangat dekat ...
Bratchley
Terima kasih, itu berhasil. Saya harus menambahkan bahwa saya harus menginstal auditctl dengan apt-get, itu belum diinstal pada Ubuntu.
Pierre Lebeaupin
Terima kasih. Contoh yang bagus. Tetapi apakah ada cara untuk mengeluarkan kode keluar dari log audit?
Kaos
0

Anda telah menanyakan sesuatu yang sederhana. Saya telah membuat contoh dengan mplayertetapi saya kira itu dapat disesuaikan dengan situasi lain:

#! /bin/sh
# This executable must be used instead of /usr/bin/mplayer
# do not forget the chmod +x filename...
LOG=/tmp/mplayer.log
echo "$@" >> $LOG
if [ -n "$1" ] && [ -f "$1" ] ; then
        filename="$1"
        echo "$(date "+%F %T") $(basename "$filename")" \
        | tee -a "$(dirname "$filename")/mplayer.log"  >> $LOG
fi
/usr/bin/mplayer "$@"

Seperti yang Anda lihat ini sangat sederhana: Ini mem-parsing argumen pertama, karena merupakan file, log dibuat menjadi file pusat $LOGdan digabungkan menjadi file (yang selalu memiliki nama mplayer.logyang sama di direktori yang sama.

Jadi, pengguna dapat memperoleh film terbaru yang telah ia baca di setiap direktori.

MUY Belgia
sumber
Q secara khusus mengatakan bahwa mengganti skrip tidak akan berhasil.
dave_thompson_085
Mungkin, tetapi ini lebih cocok untuk situasi saya: Saya tidak memiliki masalah keamanan dan saya dapat memilih skrip yang saya jalankan. Meskipun luar biasa kelihatannya, saya memiliki solusi sederhana yang paling sederhana ini, mungkin orang lain akan tertarik untuk tidak pergi ke barang-barang geek saja. Saya akui solusi sebelumnya lebih aman!
MUY Belgium