Cara mencatat setiap perintah linux ke server log

13

Saya ingin setiap perintah yang diketik pergi ke server log. Yang sudah dikonfigurasi adalah syslog-ng untuk mengirim semua log ke server log.

Saya tertarik pada semua dan semua metode untuk melakukan ini. Saya akan mengharapkan beberapa diskusi tentang pengguna jahat dan keamanan tetapi tujuan utama pertama adalah hanya mendapatkan sesi untuk login. Semua sesi lebih dari ssh tetapi perintah koneksi konsol harus dicatat juga. Saya ingin ini terjadi untuk semua shell tetapi yang utama adalah bash. (Sekali lagi, saya tahu pengguna jahat bisa membuat shell sendiri ...)

Leo
sumber

Jawaban:

29

Ini bukan cara Anda mendekati masalah. Setelah Anda memberikan akses shell ke pengguna, Anda mempercayakan pengguna itu untuk melakukan apa pun yang ia memiliki izin yang tepat. Lupakan pembuatan perintah, ada terlalu banyak cara untuk menjalankan perintah di sistem Unix apa pun.

Misalnya, pengguna dapat memulai klien email (satu-satunya perintah yang dicatat pine, misalnya), di sana ia memilih "Tulis" yang dimulai VI, dan dari VI ia meluncurkan perintah apa pun yang ia inginkan :!cmd. Perintah ini tidak dicatat di mana pun, dan dari sudut pandang sistem, itu seperti aplikasi pembantu yang dipanggil oleh VI, seperti grep atau sortir. Satu-satunya perintah yang dicatat oleh shell adalah pine.

Tampaknya apa yang sebenarnya Anda inginkan disebut audit . Aktifkan subsistem audit dan gunakan auditctlperintah dan auditddaemon dari paket audit untuk mengontrol apa yang dicatat. Informasi lebih lanjut ada di halaman buku panduan auditctl (8) .

Perhatikan bahwa mencatat setiap proses instantiasi mungkin juga tidak optimal. Sebagai contoh, sederhana ./configureuntuk paket perangkat lunak (dibuat menggunakan autotools) terkenal untuk membuat ribuan Instansiasi proses. Ini akan membanjiri log audit dengan begitu banyak kebisingan sehingga menjadi sangat sulit untuk menganalisisnya nanti.

Juliano
sumber
13

Instal acctpaket (nama paket bervariasi berdasarkan distro, juga dikenal sebagai proses akuntansi) dan gunakan lastcomm <username>:

[mithrandir]-[/home/sernin]-[1951] % lastcomm sernin
tr                     sernin   pts/2      0.00 secs Fri Nov 12 12:02
zsh               F    sernin   pts/2      0.00 secs Fri Nov 12 12:02
tr                     sernin   pts/2      0.02 secs Fri Nov 12 12:02
zsh               F    sernin   pts/2      0.00 secs Fri Nov 12 12:02
fortune                sernin   pts/2      0.00 secs Fri Nov 12 12:02
xmodmap                sernin   pts/2      0.00 secs Fri Nov 12 12:02
xrdb                   sernin   pts/2      0.00 secs Fri Nov 12 12:02
sh                     sernin   pts/2      0.00 secs Fri Nov 12 12:02
cpp                    sernin   pts/2      0.00 secs Fri Nov 12 12:02

Anda juga dapat mencari berdasarkan tty atau nama perintah. Seperti biasa, man lastcommuntuk info lebih lanjut.

Sam Halicke
sumber
11

Jika Anda bersedia melakukan sedikit pemrograman C, Anda dapat melakukan ini dengan menulis perpustakaan yang membungkus exec, log ke syslog, lalu dlopen perpustakaan yang berisi syscall execve nyata. Kemudian di / etc / environment, setel LD_PRELOAD ke path untuk pustaka yang telah Anda buat.

Anda harus berhati-hati memasukkan loop di sini, jadi Anda mungkin hanya perlu mencatat file binary tertentu, atau mengecualikan yang lain (seperti syslog) agar tidak dicatat.

menandai
sumber
Sebenarnya, ini cukup membantu. Pencarian pertama pada wrapper execve menampilkan snoopy ( sourceforge.net/projects/snoopylogger ). Sepertinya dekat dengan apa yang saya cari, meski sedikit bertele-tele. Setelah pengujian saya melihat bahwa saya akan memerlukan persetujuan manajemen untuk menempatkan ini dalam lingkungan produksi. (Peringatan untuk Anda semua tipe jahat)
Leo
@ Leo Karena versi 2.0.0 Snoopy mendukung spesifikasi format log kustom saat melakukan ./configure, jadi verbositas yang berlebihan seharusnya tidak menjadi masalah lagi. Pengungkapan: Snoopy maintainer di sini.
Bostjan Skufca
7

Bagi saya sepertinya Anda sedang mencari sesuatu seperti rootsh ( halaman manual ). Mengutip halaman manual:

Rootsh adalah pembungkus untuk shell yang mencatat semua penekanan tombol yang digaungkan dan output terminal ke file dan / atau ke syslog.

Terlepas dari namanya, ini dapat digunakan untuk semua pengguna.

Andrew M.
sumber
2

Anda mungkin lebih baik meminta pengguna menggunakan sudo (atau yang serupa) untuk menjalankan perintah yang Anda pedulikan, dan mempercayai pengguna pada tingkat tertentu. Ketika Anda semakin dekat dengan "sepenuhnya mengendalikan" hal-hal, semakin sulit untuk melacak apa yang mereka lakukan. Saya baru-baru ini melihat alat seperti ini, misalnya. Kebanyakan mereka hanya membuat log yang sulit untuk dikelola jika Anda memiliki cukup pengguna dan mesin untuk membuat hal seperti itu bermanfaat. :)

Pertimbangkan semua informasi yang akan Anda hasilkan. Berapa banyak yang Anda pedulikan? Mungkin sangat sedikit - jadi Anda menghasilkan log yang sebagian besar tidak berharga. Mengaudit hal-hal yang benar-benar Anda pedulikan, seperti yang disarankan orang lain, mungkin membuat Anda mencapai kondisi akhir yang lebih baik.

dannysauer
sumber
1

Bash dapat dikompilasi dengan dukungan syslog sejak 4.1.

Ini tidak mudah (proses akuntansi mungkin lebih baik untuk itu), tetapi sebagian besar interaksi pengguna; volume harus lebih mudah dikelola dan Anda akan dapat beralih ke sesuatu yang lebih rinci jika mencurigai sesuatu yang abnormal.

Yang mengatakan, ini sangat mengganggu dan sebagai pengguna saya akan mengharapkan peringatan privasi yang sangat spesifik sebelum Anda mulai melakukan itu.

Tobu
sumber
0

Ada juga sudosh ( http://sudosh.sourceforge.net ) yang akan melakukan sesi logging. Anda memiliki opsi untuk menjalankannya sebagai shell yang ditentukan untuk pengguna atau melalui sudo. Ini melacak timing untuk setiap sesi juga sehingga Anda dapat memutar ulang sesi dan menontonnya (termasuk sesi edit dan yang lainnya).

Tongkat
sumber