Melacak perintah apa yang dijalankan setelah sudo ke pengguna lain

8

Saya telah menyediakan sudokepada sepuluh pengguna untuk menjadi pengguna lain seperti nsup.

Saya ingin melacak pengguna yang mengeksekusi perintah mana setelah mereka menjadi nsup. Jika ada cara untuk menyimpan file log dalam file umum itu akan menjadi hebat.

Saya telah mencoba melihat /var/log/secure, tetapi dari sana saya tidak dapat membedakan pengguna mana yang menjalankan perintah setelah mereka menjadi nsup. Ini menunjukkan hanya pengguna yang menjalankan perintah untuk menjadi nsup , dan tidak ada yang lebih dari itu.

Bisa ular
sumber
2
Itu benar, jika seseorang menggunakan sudo untuk membuka shell baru, tindakan yang dilakukan di shell tidak dicatat. Jika ada cara untuk mencatatnya, saya tidak berharap itu akan melalui sudo. Dan saya belum pernah mendengar cara untuk melakukan logging seperti itu yang tidak "sukarela" (yaitu, bahwa pengguna tidak dapat menimpa). Untuk pencatatan "sukarela", Anda bisa menulis skrip yang mengambil baris terbaru dari / var / log / secure ketika sebuah shell dimulai, dan menggabungkannya dengan histori shell yang normal. Atau lihat unix.stackexchange.com/questions/6554/…
dubiousjim
Mungkin ada cacat juga. Pertimbangkan 2 pengguna yang login secara bersamaan dan mereka menjadi pengguna nzsup dan mulai menjalankan beberapa perintah. Bagaimana menemukan pengguna yang dieksekusi perintah mana setelah sudoed ke nzsup.
Racun
Saya membayangkan sesi shell hanya akan menentukan di awal siapa pengguna aslinya. Tapi ya, akan ada kondisi balapan jika dua pengguna langsung membuat shell baru pada saat yang bersamaan. Utas yang saya tautkan ke diskusi membahas cara lain untuk menentukan siapa pengguna aslinya.
dubiousjim

Jawaban:

5

Jika pengguna Anda menggunakan bash, Anda dapat menggunakan skrip /etc/bash.bash_logout untuk menyimpan salinan sejarah tambahan dalam format cap waktu.

Sebagai contoh, saya menulis yang berikut ini untuk memberikan jejak audit tentang siapa yang melakukan apa dan kapan (pada server dengan beberapa pengguna sudo), dan juga untuk melestarikan sejarah seandainya mesin tersebut dipecah menjadi:

#! /bin/bash

# /etc/bash.bash_logout
#
# Time-stamped bash history logging
# by Craig Sanders <[email protected]> 2008
#
# This script is public domain.  Do whatever you want with it.

exec >& /dev/null

# LOGDIR must already exist and must be mode 1777 (same as /tmp)
# put it somewhere easily overlooked by script-kiddies.  /var/log 
# is a bad location because slightly-brighter-than-average SK's will
# often 'rm -rf /var/log' to cover their tracks.
LOGDIR='/var/tmp/.history'

[ -d "$LOGDIR" ] || exit 0

# Get current user name and who they logged in as.
CNAME=$(id -u -n)
LNAME=$(who am i | awk '{print $1}')
NAME="$LNAME--$CNAME"

# Get the TTY
TTY=$(tty)

# get the hostname and ip they logged in from
# short (non-fqdn) hostname:
RHOST_NAME=$(who -m  | awk '{print $5}' | sed -r -e 's/[()]|\..*//g')
# or full hostname:
#RHOST_NAME=$(who -m  | awk '{print $5}' | sed -r -e 's/[()]//g')

# if no RHOST_NAME, then login was on the console.
echo "$RHOST_NAME" | grep -q '[:/]' && RHOST_NAME="console"

# get the IP address
RHOST_IP=$(who -m --ips | awk '{print $5}')
echo "$RHOST_IP" | grep -q '[:/]' && RHOST_IP="console"

RHOST=$(echo "$RHOST_NAME--$RHOST_IP")

WHERE="$RHOST--$TTY"
WHERE=$(echo "$WHERE" | sed -e 's/\//-/g' -e 's/^-//')

# Filenames will be of the form:
# $LOGDIR/cas--root--localhost--127.0.0.1---dev-pts-1
# Ugly, but useful/informative. This example shows I logged in as cas
# from localhost, sudo-ed to root, and my tty was /dev/pts/1
HISTLOG="$LOGDIR/$NAME--$WHERE"


# Optionally rotate HISTLOG on each logout, otherwise new history
# sessions just get appended.
#[ -e "$HISTLOG" ] && savelog -l -c 21 -q $HISTLOG > /dev/null 2>&1

# Log some easily parseable info as a prelude, including the current
# history settings (an unusual HISTFILE or zero HISTSIZE setting is
# suspicious and worthy of investigation)

cat <<__EOF__ >> "$HISTLOG"

### TIME ### $(date +'%a,%Y-%m-%d,%H:%M:%S')
### FROM ### $RHOST_NAME,$RHOST_IP,$TTY
### USER ### $LNAME,$CNAME
### WHOM ### $(who -m)
### HIST ### $HISTFILE,$HISTSIZE

__EOF__


# Setting HISTTIMEFORMAT seems to be buggy. bash man page says it uses
# strftime, but all it seems to care about is whether it's set or not -
# 'history -a' always uses seconds since epoch, regardless of what it is
# set to.

HISTTIMEFORMAT="%s"
history -a "$HISTLOG"


# Now write history as normal (this seems buggy too. bash used to always
# write $HISTFILE anyway, but now it won't do it if you've already run
# 'history -a')

unset HISTTIMEFORMAT
history -w
cas
sumber
1
Yang bekerja kecuali jika set pengguna HISTFILE=/dev/null...
bahamat
1
ini berfungsi terlepas dari apa yang ditetapkan pengguna HISTFILE. itulah inti dari penulisan itu. baca skrip, history -a "$HISTLOG"tambahkan riwayat ke $ HISTLOG. tidak menggunakan atau peduli dengan $ HISTFILE.
cas
1
sebagai alternatif, versi yang lebih sederhana dapat dimasukkan ke dalam nsup pengguna~/.bash_logout
cas
4
Harus disebutkan bahwa ini jelas bukan log yang aman. Gunakan alat audit jika Anda ingin log masuk yang aman.
Chris Down
Re "HISTTIMEFORMAT tampaknya buggy" - formatnya adalah untuk presentasi, bukan untuk penyimpanan. Ini digunakan ketika Anda mengeluarkan misalnya history 10. Untuk penyimpanan, HISTTIMEFORMAT hanya mengatakan apakah akan menyimpan stempel waktu (jika disetel ke sesuatu) atau tidak menyimpan sama sekali (jika tidak disetel). Entri hanya disimpan sebagai% s.
kubanczyk
0

Saya menerapkan cara ini.

dalam file rsylog.conf Saya telah menambahkan baris di bawah ini untuk melacak

$umask 0000                 
$FileCreateMode 0666         
local2.info /var/log/usercommands
$umask 0077                 

Dalam file /etc/skel/.bashrc saya telah menambahkan di bawah baris.

masukkan deskripsi gambar di sini

Semoga ini bisa membantu

Sankar
sumber