Bagaimana cara mencatat semua perintah Bash oleh semua pengguna di server?

21

Perusahaan kecil kami menjalankan Ubuntu Server 11.10, di mana beberapa orang memiliki akses SSH. Terminal yang sebenarnya kadang-kadang digunakan juga. Bagaimana kita bisa secara lokal mencatat semua perintah Bash berjalan, bersama dengan pengguna dan cap waktu?

Kami dapat berasumsi bahwa tidak ada yang jahat dan secara aktif berusaha menghindari pencatatan, tetapi kami masih lebih memilih pengguna untuk tidak memiliki akses tulis langsung ke file log mereka. Sesi simultan harus ditangani dengan benar.

Timah
sumber

Jawaban:

32

Untuk shell BASH, edit file konfigurasi runtime BASH seluruh sistem:

sudo -e /etc/bash.bashrc

Tambahkan ke akhir file itu:

export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Menyiapkan pencatatan untuk "local6" dengan file baru:

sudo -e /etc/rsyslog.d/bash.conf

Dan isinya ...

local6.*    /var/log/commands.log

Mulai ulang rsyslog:

sudo service rsyslog restart

Keluar. Masuk. Voila!

Tapi saya lupa tentang rotasi log:

sudo -e /etc/logrotate.d/rsyslog

Ada daftar file log untuk memutar dengan cara yang sama ...

/var/log/mail.warn
/var/log/mail.err
[...]
/var/log/message

Jadi tambahkan file log bash-commands baru dalam daftar itu:

/var/log/commands.log

Menyimpan.


sumber
Lupa tentang rotasi log yang saya tambahkan ke jawabannya.
1
Cara ini berfungsi, tetapi saya dapat menemukan metode di sekitarnya (dengan csh, .bash_logout mungkin). Saya akan pergi dengan solusi acct Sabacon. Ini adalah bacaan yang sangat baik: linuxjournal.com/article/6144 dan beginlinux.com/blog/2010/01/…
2
Saya percaya ini dapat dengan mudah dinonaktifkan oleh pengguna hanya dengan mengatur ulang atau tidak mengatur atau mengeksekusi PROMPT_COMMANDke shell non-bash.
Stefan Lasiewski
1
@Benubird sepertinya ada beberapa level fasilitas standar, 8 di antaranya adalah local0-local7: en.wikipedia.org/wiki/Syslog . 0 berarti darurat, 7 berarti debug, dan 6 hanya sedikit dari 7, "pesan operasional normal."
munchybunch
1
@yukashima karena log dapat menjadi file besar jika tidak dihapus, memutar berarti memutar file log dan menghapus yang lebih lama untuk menjaga log lebih kecil ...
Badr Elmers
4

Suatu sistem akuntansi proses dapat membantu dalam hal ini, khususnya paket acct yang menyediakan perintahcomm dan ac terakhir.

Perintah ac mencetak statistik tentang waktu koneksi pengguna, dalam jam. Ini adalah jumlah waktu yang pengguna telah terhubung ke sistem, baik jarak jauh melalui SSH atau terminal serial, atau saat berada di konsol.

Perintah lastcomm menampilkan informasi tentang perintah yang dieksekusi sebelumnya. Entri terbaru diberikan di bagian atas daftar. Juga ditampilkan jumlah total waktu CPU yang digunakan setiap proses.

Tutorial lama yang mungkin bermanfaat ada di sini:

http://www.linuxjournal.com/article/6144?page=0,1

Perintah akuntansi lain seperti yang terakhir dan seterusnya dapat ditemukan di tutorial ini:

http://www.techrepublic.com/article/system-accounting-in-linux/1053377

Sabacon
sumber
lastcomm cukup tidak berguna sebagai logger perintah. Itu hanya mencatat executable yang dijalankan. Tidak ada argumen, sakelar, atau jalur yang dicatat.
Phil_1984_
3

Anda bisa menggunakan snoopy .

Logger Snoopy mungkin sesuai dengan tujuan Anda dengan baik. Ini tidak dimaksudkan sebagai solusi penebangan yang tidak terhindarkan, tetapi lebih merupakan alat yang berguna untuk admin yang rajin yang lebih suka melacak tindakan mereka sendiri.

Pengungkapan: Saya pengelola snoopy.

Bostjan Skufca
sumber
Harap berikan instruksi untuk menginstal dan menggunakannya dalam jawabannya.
muru
1
Petunjuk instalasi terperinci tersedia di halaman snoopy github, yang merupakan sumber snoopy utama sekarang: github.com/a2o/snoopy . Saya lagi-lagi memberikan instruksi pemasangan di tempat lain karena lokasi utama dikelola oleh desain dan yang lainnya tidak. BTW Readme baru saja diperbarui agar lebih terstruktur.
Bostjan Skufca
1
Mungkin begitu. Tetapi bahkan tanpa ringkasan langkah-langkah yang diperlukan untuk menggunakan ini, ini adalah jawaban hanya tautan dan kemungkinan akan dihapus.
muru
1
Yah, saya memberikan pointer ke solusi alternatif dan layak. Jika bukan itu yang dimaksud dengan situs ini, maka tentu saja harus dihapus, bersama dengan akun saya.
Bostjan Skufca
2
@BostjanSkufca tidak perlu tersinggung. Ini hanya masalah Stack Exchange untuk memiliki setidaknya jawaban yang cukup mandiri. Jika Anda sangat menentang menambahkan langkah, itu keinginan Anda. Downvote saya tetap ada. Seseorang mungkin akan membatalkannya.
muru
3

Anda dapat menemukan di sini script untuk log semua pesta perintah / built-in ke dalam teks-file atau syslog server yang tanpa menggunakan patch atau alat executable khusus.

Sangat mudah digunakan, karena ini adalah skrip shell sederhana yang perlu dipanggil sekali saat inisialisasi bash .

Ini gratis dan saya harap ini sesuai dengan kebutuhan Anda.

Francois Scheurer
sumber
1
Ini adalah jawaban yang baik tetapi lebih baik untuk memasukkan langkah-langkah dan skrip di badan jawaban, daripada menautkan ke blog Anda. Bisakah Anda mengedit jawaban Anda untuk memasukkan ini?
Tom Brossman
2
Situs sekarang tidak tersedia
Gaia
0

Untuk menangani beberapa sesi, jangan terlalu menulis file histori, Anda harus memasukkan "shopt -s histappend" di file startup Bash. Lihat, juga pertanyaan ini tentang masalah yang sama.

pdp
sumber
0

coba ini (solusi di atas tidak akan bekerja 100% dengan bash 4.3):

export HISTTIMEFORMAT="%Y-%m-%d %T "
export PROMPT_COMMAND='trap "" 1 2 15; history -a >(tee -a ~/.bash_history | while read line; do if [[ $line =~ ^#[0-9]*$ ]]; then continue; fi; logger -p user.info -t "bash[$$]" "($USER) $line"; done); trap 1 2 15;'

ini melakukan pencatatan DAN mencegah pencatatan cap waktu yang digunakan untuk file riwayat bash. perangkap diperlukan, karena bash akan mengirim sinyal ke "subjob" setelah menekan strg + c beberapa kali (diuji dengan bash 4.3). ini akan memaksa keluar dari pengguna saat ini (mis. login dengan sudo)

Hans-Joachim Kliemeck
sumber
0

Anda juga dapat mencoba menginstal ACCT. Acct menyimpan jejak audit terperinci tentang apa yang dilakukan pada sistem Linux Anda.

sudo apt-get install acct
edwinksl
sumber