Seguimiento de qué comandos se ejecutaron después de sudo a otro usuario

8

He proporcionado sudoa diez usuarios para convertirse en otro usuario como nsup.

Quiero rastrear qué usuario ejecuta qué comando después de convertirse nsup. Si hay una manera de almacenar los archivos de registro en un archivo común, sería genial.

He intentado mirar /var/log/secure, pero a partir de ahí no puedo distinguir qué usuario ejecutó qué comando después de convertirse nsup. Solo muestra qué usuario ejecutó el comando para convertirse nsup , y nada más que eso.

Veneno
fuente
2
Así es, si uno usa sudo para abrir un nuevo shell, las acciones realizadas en el shell no se registran. Si hay una manera de registrarlos, no espero que sea a través de sudo. Y nunca he oído hablar de ninguna forma de hacer ese registro que no sea "voluntario" (es decir, que el usuario no pueda anular). Para el registro "voluntario", puede escribir una secuencia de comandos que tome la última línea de / var / log / secure cuando se inicia un shell, y combina eso con el historial normal del shell. O visite unix.stackexchange.com/questions/6554/…
dubiousjim el
Podría haber un defecto también. Considere 2 usuarios conectados al mismo tiempo y se convierten en usuarios nzsup y comienzan a ejecutar algún comando. Cómo encontrar qué usuario ejecutó qué comando después de sudoed a nzsup. Todos los comandos ejecutados estarán en el archivo de historial de nzsup solamente.
Veneno
Me imaginaba que una sesión de shell solo determinaría al principio quién era el usuario original. Pero sí, habría una condición de carrera si dos usuarios reemplazaran un nuevo shell al mismo tiempo. El hilo al que enlacé discute otra forma de determinar quién era el usuario original.
dubiousjim

Respuestas:

5

Si sus usuarios usan bash, puede usar un script /etc/bash.bash_logout para guardar una copia adicional del historial en formato con sello de tiempo.

Por ejemplo, escribí lo siguiente para proporcionar una pista de auditoría de quién hizo qué y cuándo (en un servidor con múltiples usuarios de sudo), y también para preservar el historial en caso de que la máquina se rompiera en:

#! /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
fuente
1
Que funciona a menos que configure el usuario HISTFILE=/dev/null...
bahamat
1
funciona independientemente de lo que el usuario establezca HISTFILE. ese fue el punto de escribirlo. lee el guión, history -a "$HISTLOG"agrega el historial a $ HISTLOG. no usa ni se preocupa por $ HISTFILE.
cas
1
alternativamente, se podría poner una versión mucho más simple en el usuario nsup's~/.bash_logout
cas
44
Cabe mencionar que esto obviamente no es un registro seguro. Use herramientas de auditoría si desea un registro seguro.
Chris Down
Re "HISTTIMEFORMAT parece tener errores": el formato es para presentación, no para almacenamiento. Se utiliza cuando emite, por ejemplo history 10. Para el almacenamiento, HISTTIMEFORMAT solo dice si almacenar las marcas de tiempo (si está configurado en algo) o no almacenar en absoluto (si no está configurado). Las entradas solo se almacenan como% s.
kubanczyk
0

Lo implementé de esta manera.

en el archivo rsylog.conf he agregado las líneas a continuación para rastrear

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

En el archivo /etc/skel/.bashrc he agregado las siguientes líneas.

ingrese la descripción de la imagen aquí

Espero que esto pueda ser útil

Sankar
fuente