跟踪sudo后另一个用户执行了哪些命令


8

我提供sudo给十个用户成为另一个用户nsup

我想跟踪成为的用户执行哪个命令nsup。如果有一种方法可以将日志文件存储在一个通用文件中,那就太好了。

我曾尝试查看过/var/log/secure,但是从那里我无法区分出哪个用户执行了哪个命令nsup。它仅显示执行该命令的用户,成为 nsup,没有其他内容。


2
没错,如果使用sudo打开新外壳,则不会记录在外壳中执行的操作。如果有办法将它们记录下来,我不希望它将通过sudo来记录。而且我从未听说过有什么方法可以进行这样的记录,这些记录不是“自愿的”(也就是说,用户无法覆盖)。对于“自愿”日志记录,您可以编写一个脚本,该脚本在外壳启动时从/ var / log / secure中获取最新行,并将其与常规外壳历史结合起来。还是看unix.stackexchange.com/questions/6554/...
dubiousjim

也可能有缺陷。考虑2个同时登录的用户,他们成为nzsup用户并开始执行某条命令。如何查找哪个用户在sused到nzsup之后执行了哪个命令。所有执行的命令将仅在nzsup的历史文件中。
毒液2012年

我在想象一个shell会话将在一开始就确定原始用户是谁。但是,是的,如果两个用户同时冲洗了一个新的外壳,那将是一个竞争条件。我链接到的线程讨论了另一种确定原始用户身份的方法。
dubiousjim 2012年

Answers:


5

如果您的用户使用bash,则可以使用/etc/bash.bash_logout脚本以时间戳格式保存历史记录的额外副本。

例如,我编写了以下内容,以提供有关谁在何时何地(在具有多个sudo用户的服务器上)执行了什么操作以及何时执行的审计线索,并且还保留了历史记录以防机器被入侵:

#! /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
除非用户设置HISTFILE=/dev/null...,否则该方法有效...
bahamat 2012年

1
无论用户将HISTFILE设置为什么,它都可以工作。那就是编写它的全部重点。阅读脚本,history -a "$HISTLOG"将历史记录追加到$ HISTLOG。不使用或不在乎$ HISTFILE。
cas 2012年

1
或者,可以在用户nsup中放一个更简单的版本~/.bash_logout
cas

4
应该提到的是,这显然不是安全日志。如果要安全日志记录,请使用审核工具。
克里斯·

关于“ HISTTIMEFORMAT似乎有问题”-格式用于演示,而不用于存储。例如,在发行时使用history 10。对于存储,HISTTIMEFORMAT仅表示是存储时间戳(如果设置为任何值)还是根本不存储时间戳(如果未设置)。条目仅存储为%s。
kubanczyk

0

我以这种方式实施。

在rsylog.conf文件中,我添加了以下几行来进行跟踪

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

在/etc/skel/.bashrc文件中,我添加了以下几行。

在此处输入图片说明

希望这会有所帮助

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.