9

Существует сервер, к которому обращаются многие пользователи, использующие ssh. Я пытаюсь выяснить, какой пользователь выполнил определенную команду.

Я могу знать список пользователей, которые в настоящее время обращаются к серверу, используя who Также я буду знать список команд, выполненных с использованием history .

Но как узнать, какой пользователь выполнил команду типа cp file1.sh file2.sh на сервере? Пользователь уже выполнил команду и вышел из системы

4 ответа4

3

Каждый новый подключающийся пользователь порождает новый сеанс sshd с определенным PID. Вы можете использовать pstree для вывода, какие команды унаследованы от какого сеанса sshd , а затем перепроверить этот PID в /var/log/auth.log .

Пример (анонимный): я вошел на удаленный сервер с 3 одновременными сеансами с тем же удаленным пользователем. Теперь я хочу выяснить, с какого IP-адреса пришел клиент, запустивший watch date команд.

$ pstree -p | grep watch
        |           |-sshd(15243)---sshd(15342)---bash(15343)---watch(15450)
$ sudo grep 15243 /var/log/auth.log
Mar  7 15:37:29 XXXXXXXXXX sshd[15243]: Accepted publickey for XXXXXXXXXX from 12.34.56.78 port 48218 ssh2
Mar  7 15:37:29 XXXXXXXXXX sshd[15243]: pam_unix(sshd:session): session opened for user XXXXXXXXXX by (uid=0)
Mar  7 15:37:44 XXXXXXXXXX sudo: XXXXXXXXXX : TTY=pts/7 ; PWD=/home/XXXXXXXXXX ; USER=root ; COMMAND=/bin/grep 15243 /var/log/auth.log

pstree -p показывает , что команда watch унаследовали от sshd с PID 15243. grep ИНГ для этого PID в /var/auth/auth.log показывает , что это IP 12.34.56.78 , который начал эту сессию. Поэтому это также пользователь, который начал watch .

Что касается поиска history конкретно для этого пользователя, это не может быть сделано из того, что я вижу, когда все удаленные пользователи используют одного и того же локального пользователя SSH. Кроме того, он может быть легко подделан / деактивирован и т.д., Поэтому он не очень надежен. Если он сохранен в файле истории, вы можете просто найти команду cp и заглянуть в файл назад, но если ее там нет, то делать особо нечего.

1

Вы можете добавить эти две строки в /etc /profile или /etc /bashrc для регистрации всех команд, выполняемых bash:

whoami="$(whoami)@$(echo $SSH_CONNECTION | awk '{print $1}')"                                                                                                  
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local3.debug "$whoami [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'

Это будет использовать системный журнал для записи каждой выполненной команды вместе с пользователем, который сделал, и его IP-адрес в формате, подобном этому:

Jan  8 08:43:49 xpto local3.debug root: root@192.168.x.y [29385]: ls -al [0]

Кроме того, вы можете добавить строку ниже в вашу конфигурацию системного журнала (/etc/syslog.conf), чтобы перенаправить сообщения local3 в определенный файл.

local3.*                                                /var/log/prompt.log
0

Предполагая , что вы используете Баш, history только покажет вам вашу историю командной строки. По умолчанию он читает ~/.bash_history для истории. Обратите внимание, что это можно изменить (хотя и маловероятно), выполнив что-то вроде HISTFILE=/home/userFoo/.my_alt_history .

Предполагая, что вы являетесь пользователем root, вы можете просмотреть все каталоги пользователя и прочитать их историю, чтобы увидеть, кто выполняет эту команду.

0

Вы могли бы использовать Snoopy для этого.

Вы должны будете настроить его для регистрации пользовательских переменных среды (SSH_CLIENT), указав IP =% {env:SSH_CLIENT} в определении формата сообщения журнала (./configure flag или настраиваемый в snoopy.ini начиная с версии 2.x).

Раскрытие: сопровождающий Snoopy здесь.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .