Bagaimana cara mencatat perintah dalam "sudo su -"?

12

Jika saya:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 

Maka saya bisa melihatnya di log:

[root@notebook /var/log] grep 123456uu *
auth.log:Jan  9 17:01:51 notebook sudo: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 123456uu
[root@notebook /var/log] 

tetapi jika saya:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 

Saya tidak bisa melihatnya di log:

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 

Pertanyaan saya: Bagaimana saya bisa menyalakan logging untuk perintah dalam "sudo su -"?

OS adalah Ubuntu 12,04 tetapi pertanyaannya adalah secara umum.

PEMBARUAN # 1:

[user@notebook ~] sudo su -
[sudo] password for user: 
[root@notebook ~] echo zizizi
zizizi
[root@notebook ~] cd /var/log
[root@notebook /var/log] grep -iIR 'zizizi' *
[root@notebook /var/log] grep 'COMMAND=/bin/su -' *
auth.log:Jan 10 15:42:42 notebook sudo: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/su -
[root@notebook /var/log]
pengguna baru999
sumber
Jika seseorang yang jahat (atau bahkan tidak dapat dipercaya) memiliki akses sudo su -, mereka juga memiliki kemampuan untuk menghapus semua entri log yang dapat Anda buat dari tindakan mereka. Jika Anda ingin kepastian 100% dalam pencatatan Anda, Anda harus membatasi sudodan melarang sudo susepenuhnya.
Wildcard

Jawaban:

16

Karena Anda menggunakan Ubuntu 12.04, lihat kemampuan logging I / O yang diaktifkan melalui opsi log_inputdan log_output.

log_input

    Jika diatur, sudoakan menjalankan perintah dalam pseudo tty dan mencatat semua input pengguna. Jika input standar tidak terhubung ke tty pengguna, karena pengalihan I / O atau karena perintah adalah bagian dari pipa, input itu juga ditangkap dan disimpan dalam file log yang terpisah.

    Input dicatat ke direktori yang ditentukan oleh iolog_diropsi ( /var/log/sudo-iosecara default) menggunakan ID sesi unik yang termasuk dalam garis sudo log normal, diawali dengan TSID=. The iolog_filepilihan dapat digunakan untuk mengontrol format ID sesi.

    Perhatikan bahwa input pengguna dapat berisi informasi sensitif seperti kata sandi (bahkan jika itu tidak digaungkan ke layar), yang akan disimpan dalam file log yang tidak dienkripsi. Dalam kebanyakan kasus, hanya perlu mencatat hasil perintah melalui log_output.

log_output

    Jika diatur, sudoakan menjalankan perintah dalam pseudo tty dan mencatat semua output yang dikirim ke layar, mirip dengan perintah skrip (1). Jika output standar atau kesalahan standar tidak terhubung ke tty pengguna, karena pengalihan I / O atau karena perintah adalah bagian dari pipa, output itu juga ditangkap dan disimpan dalam file log yang terpisah.

    Output dicatat ke direktori yang ditentukan oleh iolog_diropsi ( /var/log/sudo-iosecara default) menggunakan ID sesi unik yang termasuk dalam garis sudo log normal, diawali dengan TSID=. The iolog_filepilihan dapat digunakan untuk mengontrol format ID sesi.

    Log keluaran dapat dilihat dengan utilitas sudoreplay (8), yang juga dapat digunakan untuk membuat daftar atau mencari log yang tersedia.

IMPLEMENTASI: Versi Sudo setidaknya: 1.7.4p4 dibutuhkan.

/etc/sudoersmodifikasi: Yang perlu Anda lakukan adalah menambahkan dua tag ke semua entri sudo yang diperlukan (di mana "su" ditentukan, baik dengan perintah atau alias). LOG_INPUT dan LOG_OUTPUT.

Contoh:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL

Tambahkan struktur dir log default berikut ke sudoers:

Defaults iolog_dir=/var/log/sudo-io/%{user}
Mark Wagner
sumber
itu hebat, tetapi tidak bekerja pada sistem yang lebih lama ..: \
newuser999
Ya mungkin membuat paket versi sudo saat ini atau memutakhirkan sistem?
Serverhorror
13

Anda grepketika melakukan sudo su -gagal karena Anda tidak menjalankan echo 1234567zz, Anda menjalankan su -, yang meluncurkan shell. Shell kemudian menjalankan echo.

Ini disengaja, dan mencatat setiap perintah tunggal akan membanjiri syslog Anda dengan info yang tidak berguna (biasanya ada banyak program yang dijalankan di belakang layar yang biasanya tidak Anda lihat).

Jika Anda mengubah grep grep 'COMMAND=/bin/su -' *Anda, Anda akan melihatnya.


sudo su -juga merupakan penggunaan yang tidak berguna su. sudo -imelakukan hal yang sama.

Patrick
sumber
tetapi bagaimana saya bisa mencatat "sudo su -"?
newuser999
1
Itu dicatat. Apakah Anda mencoba grep 'COMMAND=/bin/su -' *(atau tanpa wildcard:) grep 'COMMAND=/bin/su -' /var/log/auth.log?
Patrick
Saya memperbarui pertanyaan. apa lagi yang harus saya buktikan bahwa ketika menggunakan "sudo su -" perintah tidak masuk ??
newuser999
4
Perintah ( sudo -) adalah login, dan output Anda diperbarui menunjukkan ini. Itu saja yang kita bicarakan di sini. The perintah lain, seperti echosetelah Anda beralih pengguna dengan sudo -, tidak sudo perintah, dan karenanya (sesuai jawaban saya) belum login auth.log. Hanya perintah individual yang secara eksplisit diawali dengan yang sudoakan dicatat. Begitu sudo echojuga yang dicatat, tetapi yang jelas echotidak, terlepas dari fakta bahwa Anda telah beralih ke superuser.
goldilocks
12

Dalam meningkatkan kompleksitas, berikut adalah tiga cara mencatat perintah yang dikeluarkan dalam "sudo su -":

  1. Andalkan sejarah perintah bash
  2. Instal pembungkus logging execve
  3. Gunakan audit SELinux

Mengenai mana yang cocok, itu benar-benar tergantung pada apa yang ingin Anda capai dengan pencatatan.

1) Sejarah Perintah Bash

Anda ingin mengkonfigurasi facitlity sejarah untuk memastikan menjaga garis yang cukup, tidak menimpa dari sesi yang berbeda, tidak mengabaikan perintah, dan cap waktu yang sesuai. (Lihat variabel HIST * dalam manual bash ). Mudah ditumbangkan dengan mengedit file histori, memanipulasi lingkungan atau menjalankan shell lain.

2) mengeksekusi pembungkus

snoopylogger adalah satu. Tambahkan tanda centang /etc/profilebahwa perpustakaan logger ada di peta memori proses ( /proc/<pid>/maps), dan jika tidak, setel LD_PRELOADdan mulai ulang (dengan exec $SHELL --login "$@"). Bergantian Anda dapat menambahkan entri ke /etc/ld.so.preload dengan $LIB/snoopy.soatau jalur yang setara versi 32/64-bit Anda.

Meskipun lebih sulit, LD_PRELOADversi variabel lingkungan di atas masih bisa ditumbangkan dengan memanipulasi lingkungan eksekusi sehingga kode snoopy tidak lagi berjalan.

Syslog harus dikirim di luar kotak agar isinya dapat dipercaya.

3) auditd

Sedikit lebih mudah dikonfigurasikan daripada wrapper execve, tetapi lebih sulit untuk mengekstrak informasinya. Ini adalah jawaban pertanyaan yang kemungkinan besar Anda tanyakan: "Apakah ada cara untuk mencatat efek apa yang dimiliki pengguna pada sistem setelah mereka mengeluarkansudo su - ". Syslog harus dikirim di luar kotak agar isinya dapat dipercaya.

Jawaban Serverfault ini tampaknya merupakan konfigurasi yang cukup komprehensif untuk digunakan dengan auditd.

Ada beberapa saran lain untuk pertanyaan serupa di serverfault .

R Perrin
sumber
9

Mengapa?

Karena itulah sudoyang melakukan penebangan; itu mencatat perintah sudo. Dalam kasus pertama, sudo echodicatat. Dalam kasus kedua, sudo sudicatat (lihat /var/log/auth.log).

suadalah "beralih pengguna", secara default ke root. Apa pun yang Anda lakukan setelah itu tidak melewati sudo. Sama seperti jika Anda login sebagai root; login itu sendiri dicatat, tetapi tidak setiap perintah.

goldilocks
sumber
5

Seperti yang orang lain katakan, sudotidak bisa melakukan ini.

Sebaliknya, gunakan auditd. Jika Anda ingin mencatat semua yang dilakukan oleh root (termasuk misalnya hal-hal yang dilakukan oleh crontab), gunakan ini:

sudo auditctl -a exit,always -F euid=0

ETA: Perhatikan bahwa mencatat segala sesuatu akan memengaruhi kinerja, jadi Anda mungkin ingin membatasinya sedikit. Lihat man auditctlcontohnya.

Jika Anda hanya ingin login syscalls di mana login asli tidak root, gunakan ini sebagai gantinya:

sudo auditctl -a exit,always -F euid=0 -F auid!=0

Log biasanya akan berakhir di /var/log/audit/audit.log. Anda dapat mencarinya dengan ausearch.

Ada informasi lebih lanjut di halaman manual untuk auditctl, audit.rulesdan ausearch.

Jenny D
sumber
2
Oh, agar log audit dipercaya, mereka harus dikirim ke server terpisah. Log apa pun yang berada di mesin di mana pengguna yang tidak dipercaya memiliki root tidak dapat dipercaya.
Jenny D
bahkan saat itu Anda tidak dapat mempercayai apa yang keluar atau tidak dari server yang dikompromikan.
Matt
Tetapi Anda akan memiliki jejak sampai waktu itu dikompromikan.
Jenny D
2
Yang dalam kasus op secara teknis segera setelah mereka berjalan sudo su -sehingga Anda kembali pada titik awal
Matt
Tidak dipercaya tidak sama dengan dikompromikan. Itu tidak akan dikompromikan sampai mereka benar-benar melakukan sesuatu yang jahat, di mana log audit pada server jauh akan menunjukkan kepada Anda apa yang telah dilakukan dan oleh siapa - termasuk siapa itu yang dinonaktifkan auditd. Dan terlepas dari itu, log jarak jauh akan membantu ketika seseorang menghapus log lokal secara tidak sengaja atau untuk melindungi diri mereka dari kesalahan atas kesalahan.
Jenny D
2

sudo su -akan masuk ~/.bash_historyjika shell Anda bash.

echo 1234567zz akan masuk /root/.bash_history jika shell root bash.

Penjelasan tentang ini sudah diposting oleh goldilocks.

YoMismo
sumber
2

Apakah Anda ingin su login karena Anda merasa itu adalah kelemahan keamanan? Sudahkah Anda memikirkan perintah ini? sudo bashimho sama buruknya.

Jika Anda khawatir tentang apa yang dapat dilakukan orang dengan sudo, maka Anda harus membatasi penggunaannya. Anda dapat membatasi perintah yang dapat mereka jalankan juga. Batasi akses ke / bin / su jika itu membuat Anda khawatir.

X Tian
sumber
1

Bagaimana dengan ini:

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log'
sudo -E su
unset PROMPT_COMMAND

atau

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' 
sudo -E su --preserve-environment -
unset PROMPT_COMMAND

atau panjang satu liner:

HISTTIMEFORMAT="%d/%m/%y %T " PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' sudo -E su

sudo -E menjaga lingkungan PROMPT_COMMAND dijalankan sebelum setiap prompt

Costa
sumber
yang pertama tidak memberi saya konsol DAN jika saya meletakkan yang kedua di /root/.bashrc maka saya harus menekan CTRL + C jika saya ingin mendapatkan konsol root setelah "sudo su -": D kemungkinan apa pun untuk memperbaiki ini (atau untuk menambahkan fungsi "tanggal" ke dalamnya?). Terimakasih banyak!
newuser999
Saya khawatir Anda menyalahgunakannya. Diedit untuk membuatnya lebih eksplisit.
Costa
1

Jika ini membantu, Anda dapat menggunakan opsi "NOEXEC" dari sudoers.

Anda harus mendefinisikannya sebagai

USER_NAME         ALL=(ALL) NOEXEC : ALL

Ini akan mencegah shell lolos dan pengguna tidak akan dapat menggunakan sudo -i atau sudo -s atau sudo su -

Ini memiliki kelemahan, bagaimanapun, shell escape akan dinonaktifkan. untuk mengeksekusi skrip dari dalam skrip juga akan ditolak.

ankidaemon
sumber
0

Jangan membuat ini rumit: Setiap kali sudodipanggil, ia melaporkan fakta ini di beberapa file di /var/log(pada sistem Anda auth.log, pada kotak OS X saya itu system.log). sudomelaporkan argumen commandline-nya, tetapi tidak memiliki pengetahuan tentang apa yang mungkin terjadi di dalam perintah interaktif seperti su.

Ini tidak berarti tidak ada catatan tentang apa yang terjadi dalam subkulit root: Perintah Shell disimpan dalam riwayat shell. Di sistem saya, penyimpanan riwayat root diaktifkan secara default, jadi yang harus saya lakukan adalah mencari ~root/.sh_historycatatan tentang apa yang telah dilakukan (kecuali jika seseorang merusaknya, tentu saja, tetapi mereka juga bisa merusaknya /var/log).

Saya pikir ini adalah solusi terbaik untuk Anda. Jika tidak, pergilah ke kota bersama auditd, seperti yang disarankan @Jenny.

PS. Jika riwayat root belum diaktifkan, mengaktifkannya tergantung pada shell yang digunakannya. Untuk bash, atur HISTORYdan HISTFILESIZEke angka yang cukup besar (standarnya adalah 500, kata manual saya). Jika mau, Anda dapat menentukan di mana riwayat disimpan dengan mengatur HISTFILEke jalur (default $HOME/.sh_history)

Alexis
sumber
0

Anda mungkin ingin membuat skrip sesi Anda menggunakan script(1):

$ sudo su -
# script -t /tmp/my_typescript 2> /tmp/my_typescript.timing
Script started, file is /tmp/my_typescript
# echo foobar
foobar
# echo hello world
hello world
# exit
exit
Script done, file is /tmp/my_typescript

Sekarang Anda dapat grep(perhatikan bahwa #konfirmasi sebenarnya direkam dalam /tmp/my_typescript):

$ grep echo /tmp/my_typescript
# echo foobar
# echo hello world

Atau, Anda bahkan dapat menonton seluruh sesi lagi dengan scriptreplay(1):

$ scriptreplay -t /tmp/my_typescript.timing /tmp/my_typescript

File /tmp/my_typescript.timingberisi informasi ketika setiap perintah telah dipanggil. Ada alat lebih lanjut seperti ttyrecatau shelryang memiliki lebih banyak lonceng dan peluit.

tkrennwa
sumber