Theo dõi những lệnh nào đã được thực thi sau khi sudo cho người dùng khác


8

Tôi đã cung cấp sudocho mười người dùng để trở thành một người dùng khác như thế nào nsup.

Tôi muốn theo dõi người dùng nào thực thi lệnh nào sau khi họ trở thành nsup. Nếu có một cách để lưu trữ các tệp nhật ký trong một tệp chung sẽ rất tuyệt.

Tôi đã thử nhìn vào /var/log/secure, nhưng từ đó tôi không thể phân biệt được người dùng nào đã thực thi lệnh nào sau khi họ trở thành nsup. Nó chỉ hiển thị người dùng nào đã thực thi lệnh để trở thành nsup và không có gì ngoài điều đó.


2
Đúng vậy, nếu một người sử dụng sudo để mở một trình bao mới, các hành động được thực hiện trong trình bao không được ghi lại. Nếu có một cách để đăng nhập chúng, tôi không hy vọng nó sẽ thông qua sudo. Và tôi chưa bao giờ nghe thấy bất kỳ cách nào để thực hiện việc ghi nhật ký như vậy mà không phải là "tự nguyện" (nghĩa là người dùng không thể ghi đè). Để ghi nhật ký "tự nguyện", bạn có thể viết một tập lệnh lấy dòng mới nhất từ ​​/ var / log / safe khi trình bao khởi động và kết hợp tập lệnh đó với lịch sử trình bao thông thường. Hoặc xem unix.stackexchange.com/questions/6554/ từ
dubiousjim

Có thể có lỗ hổng quá. Hãy xem xét 2 người dùng đã đăng nhập vào sametime và họ trở thành người dùng nzsup và bắt đầu thực hiện một số lệnh.
Nọc độc

Tôi đã tưởng tượng một phiên shell sẽ chỉ xác định ngay từ đầu người dùng ban đầu là ai. Nhưng vâng, sẽ có một điều kiện cuộc đua nếu hai người dùng sudo một vỏ mới cùng một lúc. Chủ đề tôi liên kết để thảo luận về một cách khác để xác định người dùng ban đầu là ai.
dubiousjim

Câu trả lời:


5

Nếu người dùng của bạn sử dụng bash, bạn có thể sử dụng tập lệnh /etc/bash.bash_logout để lưu một bản sao bổ sung của lịch sử ở định dạng được đóng dấu thời gian.

Ví dụ, tôi đã viết như sau để cung cấp bản kiểm tra xem ai đã làm gì và khi nào (trên một máy chủ có nhiều người dùng sudo) và cũng để lưu lại lịch sử trong trường hợp máy bị đột nhập:

#! /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
Hoạt

1
nó hoạt động bất kể người dùng đặt HISTFILE là gì. đó là toàn bộ quan điểm của việc viết nó đọc kịch bản, history -a "$HISTLOG"nối lịch sử vào $ HISTLOG. không sử dụng hoặc quan tâm đến $ HISTFILE.
cas

1
cách khác, một phiên bản đơn giản hơn nhiều có thể được đưa vào người dùng nsup~/.bash_logout
cas

4
Cần phải đề cập rằng đây rõ ràng không phải là một bản ghi an toàn. Sử dụng các công cụ kiểm toán nếu bạn muốn đăng nhập an toàn.
Chris Xuống

Re "HISTTIMEFORMAT dường như có lỗi" - định dạng dành cho thuyết trình, không phải để lưu trữ. Nó được sử dụng khi bạn phát hành chẳng hạn history 10. Để lưu trữ, HISTTIMEFORMAT chỉ cho biết có nên lưu dấu thời gian (nếu được đặt thành bất cứ thứ gì) hay không lưu trữ (nếu không đặt). Các mục chỉ được lưu trữ dưới dạng% s.
kubanchot

0

Tôi thực hiện theo cách này.

trong tập tin rsylog.conf tôi đã thêm các dòng dưới đây để theo dõi

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

Trong tệp /etc/skel/.bashrc tôi đã thêm các dòng dưới đây.

nhập mô tả hình ảnh ở đây

Hy vọng điều này có thể hữu ích

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.