Отслеживание того, какие команды были выполнены после sudo другому пользователю

8

Я предоставил sudoдесять пользователей, чтобы стать другим пользователем, как nsup.

Я хочу отслеживать, какой пользователь выполняет какую команду после того, как он стал nsup. Если есть способ сохранить файлы журнала в общем файле, это было бы здорово.

Я попытался посмотреть /var/log/secure, но оттуда я не могу различить, какой пользователь выполнил какую команду после того, как они стали nsup. Он показывает только, какой пользователь выполнил команду, чтобы стать nsup , и ничего кроме этого.

злоба
источник
2
Правильно, если кто-то использует sudo для открытия новой оболочки, действия, выполняемые в этой оболочке, не регистрируются. Если есть способ зарегистрировать их, я не ожидаю, что это будет через sudo. И я никогда не слышал ни о каком способе ведения такой регистрации, которая не является «добровольной» (то есть, что пользователь не может переопределить). Для «добровольного» ведения журнала вы можете написать сценарий, который берет последнюю строку из / var / log / secure при запуске оболочки и объединяет ее с обычной историей оболочки. Или см. Unix.stackexchange.com/questions/6554/…
dubiousjim
Там тоже может быть недостаток. Рассмотрим 2 пользователя, вошедших в одно и то же время, и они становятся пользователем nzsup и начинают выполнять какую-то команду. Как определить, какой пользователь выполнил какую команду после передачи nzsup.all команда будет находиться только в файле истории nzsup.
Venom
Я предполагал, что сессия оболочки просто определит в начале, кем был первоначальный пользователь. Но да, было бы состояние гонки, если два пользователя одновременно подали новую оболочку. Нить, на которую я ссылался, обсуждает другой способ определения того, кем был первоначальный пользователь.
dubiousjim

Ответы:

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
1
это работает независимо от того, что пользователь устанавливает HISTFILE. в этом весь смысл написания. прочитайте скрипт, history -a "$HISTLOG"добавьте историю в $ HISTLOG. не использует и не заботится о $ HISTFILE.
Cas
1
альтернативно, гораздо более простая версия может быть помещена в пользователя nsup's~/.bash_logout
cas
4
Следует отметить, что это явно не безопасный журнал. Используйте инструменты аудита, если вы хотите безопасную регистрацию.
Крис Даун
Re "HISTTIMEFORMAT, кажется, глючит" - формат для презентации, а не для хранения. Он используется, когда вы выдаете, например history 10. Для хранения HISTTIMEFORMAT только говорит, сохранять ли временные метки (если установлено что-либо) или не сохранять вообще (если не установлен). Записи хранятся только как% s.
kubanczyk
0

Я реализовал таким образом.

В файле rsylog.conf я добавил следующие строки для отслеживания

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

В файле /etc/skel/.bashrc я добавил строки ниже.

введите описание изображения здесь

Надеюсь, это может быть полезно

Sankar
источник