Traccia dei comandi eseguiti dopo sudo a un altro utente


8

Ho fornito sudoa dieci utenti di diventare un altro utente come nsup.

Voglio tracciare quale utente esegue quale comando dopo che sono diventati nsup. Se c'è un modo per archiviare i file di registro in un file comune sarebbe fantastico.

Ho provato a guardare /var/log/secure, ma da lì non riesco a distinguere quale utente ha eseguito quale comando dopo che sono diventati nsup. Mostra solo quale utente ha eseguito il comando per diventare nsup , e niente oltre a quello.


2
Esatto, se si usa sudo per aprire una nuova shell, le azioni eseguite nella shell non vengono registrate. Se c'è un modo per registrarli, non mi aspetto che sarà tramite sudo. E non ho mai sentito parlare di alcun modo per effettuare tali registrazioni che non sono "volontarie" (ovvero che l'utente non può ignorare). Per la registrazione "volontaria", è possibile scrivere uno script che preleva l'ultima riga da / var / log / secure all'avvio di una shell e che combini con la cronologia della shell normale. Oppure vedi unix.stackexchange.com/questions/6554/…
dubiousjim

Potrebbe esserci anche un difetto. Considera 2 utenti registrati in sametime e diventano utenti nzsup e iniziano a eseguire alcuni command.how per trovare quale utente ha eseguito quale comando dopo essere stato su nzsup.all il comando eseguito sarà solo nel file cronologico di nzsup.
Venom,

Immaginavo che una sessione di shell avrebbe determinato all'inizio chi fosse l'utente originale. Ma sì, ci sarebbe una condizione di competizione se due utenti avessero abbattuto una nuova shell nello stesso momento. Il thread a cui ho collegato discute un altro modo per determinare chi fosse l'utente originale.
dubiousjim,

Risposte:


5

Se i tuoi utenti usano bash, puoi usare uno script /etc/bash.bash_logout per salvare una copia aggiuntiva della cronologia in formato con data e ora.

Ad esempio, ho scritto quanto segue per fornire una traccia di controllo su chi ha fatto cosa e quando (su un server con più utenti sudo) e anche per preservare la cronologia nel caso in cui la macchina fosse rotta:

#! /bin/bash

# /etc/bash.bash_logout
#
# Time-stamped bash history logging
# by Craig Sanders <cas@taz.net.au> 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

1
Che funziona a meno che l'utente non abbia impostato HISTFILE=/dev/null...
bahamat,

1
funziona indipendentemente da ciò su cui l'utente imposta HISTFILE. quello era lo scopo di scriverlo. leggi lo script, history -a "$HISTLOG"accoda la cronologia a $ HISTLOG. non usa né si preoccupa di $ HISTFILE.
Cas

1
in alternativa, una versione molto più semplice potrebbe essere inserita nell'utente nsup~/.bash_logout
cas

4
Va detto che questo ovviamente non è un registro sicuro. Utilizzare gli strumenti di controllo se si desidera una registrazione sicura.
Chris Down,

Ri "HISTTIMEFORMAT sembra essere difettoso" - il formato è per la presentazione, non per la memorizzazione. Ad esempio, viene utilizzato per l'emissione history 10. Per l'archiviazione, HISTTIMEFORMAT dice solo se memorizzare i timestamp (se impostato su qualcosa) o non archiviarli affatto (se non impostato). Le voci sono memorizzate solo come% s.
Kubanczyk,

0

Ho implementato in questo modo.

nel file rsylog.conf ho aggiunto le seguenti righe da tracciare

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

Nel file /etc/skel/.bashrc ho aggiunto le righe seguenti.

inserisci qui la descrizione dell'immagine

Spero che questo possa essere utile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.