Verfolgen, welche Befehle nach sudo für einen anderen Benutzer ausgeführt wurden

8

Ich habe sudozehn Benutzern zur Verfügung gestellt, um ein anderer Benutzer wie zu werden nsup.

Ich möchte verfolgen, welcher Benutzer welchen Befehl ausführt, nachdem er geworden ist nsup. Wenn es eine Möglichkeit gibt, die Protokolldateien in einer gemeinsamen Datei zu speichern, wäre das großartig.

Ich habe versucht zu schauen /var/log/secure, aber von dort kann ich nicht unterscheiden, welcher Benutzer welchen Befehl ausgeführt hat, nachdem sie geworden sind nsup. Es zeigt nur , welche Benutzer den Befehl ausgeführt werden nsup , und nichts darüber hinaus.

Gift
quelle
2
Das ist richtig, wenn man sudo verwendet, um eine neue Shell zu öffnen, werden die in der Shell ausgeführten Aktionen nicht protokolliert. Wenn es eine Möglichkeit gibt, sie zu protokollieren, erwarte ich nicht, dass dies über sudo geschieht. Und ich habe noch nie von einer Möglichkeit gehört, eine solche Protokollierung durchzuführen, die nicht "freiwillig" ist (dh, der Benutzer konnte sie nicht überschreiben). Für die "freiwillige" Protokollierung können Sie ein Skript schreiben, das beim Starten einer Shell die neueste Zeile aus / var / log / Secure abruft und diese mit dem normalen Shell-Verlauf kombiniert. Oder sehen Sie unix.stackexchange.com/questions/6554/…
dubiousjim
Es könnte auch einen Fehler geben. Betrachten Sie 2 Benutzer, die zur gleichen Zeit angemeldet sind und zu nzsup-Benutzern werden, und führen Sie einen Befehl aus. So finden Sie heraus, welcher Benutzer welchen Befehl ausgeführt hat, nachdem er an nzsup gesendet wurde. Alle ausgeführten Befehle befinden sich nur in der Verlaufsdatei von nzsup.
Gift
Ich stellte mir vor, eine Shell-Sitzung würde am Anfang nur bestimmen, wer der ursprüngliche Benutzer war. Aber ja, es würde eine Rennbedingung geben, wenn zwei Benutzer gleichzeitig eine neue Shell sudoten. Der Thread, auf den ich verlinkt habe, beschreibt eine andere Möglichkeit, um festzustellen, wer der ursprüngliche Benutzer war.
Dubiousjim

Antworten:

5

Wenn Ihre Benutzer bash verwenden, können Sie ein Skript /etc/bash.bash_logout verwenden, um eine zusätzliche Kopie des Verlaufs im Zeitstempelformat zu speichern.

Zum Beispiel habe ich Folgendes geschrieben, um einen Audit-Trail darüber zu erstellen, wer was wann getan hat (auf einem Server mit mehreren Sudo-Benutzern) und um den Verlauf für den Fall zu speichern, dass in den Computer eingebrochen wurde:

#! /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
quelle
1
Was funktioniert, wenn der Benutzer nicht einstellt HISTFILE=/dev/null...
Bahamat
1
Es funktioniert unabhängig davon, auf was der Benutzer HISTFILE setzt. das war der springende Punkt beim Schreiben. Lesen Sie das Skript und history -a "$HISTLOG"hängen Sie den Verlauf an $ HISTLOG an. verwendet oder kümmert sich nicht um $ HISTFILE.
Cas
1
alternativ könnte eine viel einfachere Version in Benutzer nsup's eingefügt werden~/.bash_logout
cas
4
Es sollte erwähnt werden, dass dies offensichtlich kein sicheres Protokoll ist. Verwenden Sie Überwachungstools, wenn Sie eine sichere Protokollierung wünschen.
Chris Down
Zu "HISTTIMEFORMAT scheint fehlerhaft zu sein" - das Format dient der Präsentation, nicht der Speicherung. Es wird verwendet, wenn Sie zum Beispiel ausgeben history 10. Für die Speicherung gibt HISTTIMEFORMAT nur an, ob Zeitstempel gespeichert werden sollen (falls auf etwas gesetzt) ​​oder überhaupt nicht gespeichert werden sollen (falls nicht gesetzt). Die Einträge werden nur als% s gespeichert.
Kubanczyk
0

Ich habe auf diese Weise implementiert.

In der Datei rsylog.conf habe ich die folgenden Zeilen hinzugefügt, um sie zu verfolgen

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

In der Datei /etc/skel/.bashrc habe ich folgende Zeilen hinzugefügt.

Geben Sie hier die Bildbeschreibung ein

Hoffe das könnte hilfreich sein

Sankar
quelle