Чтобы узнать, какой IP выполнил определенную команду в Linux с помощью SSH
Существует сервер, к которому обращаются многие пользователи, использующие ssh. Я пытаюсь выяснить, какой пользователь выполнил определенную команду.
Я могу знать список пользователей, которые в настоящее время обращаются к серверу, используя who
Также я буду знать список команд, выполненных с использованием history
,
Но как узнать, какой пользователь выполнил команду вроде cp file1.sh file2.sh
на сервере? Пользователь уже выполнил команду и вышел из системы
4 ответа
Каждый новый подключающийся пользователь порождает нового 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
с ПИД 15243. grep
для этого PID в /var/auth/auth.log
показывает, что именно IP 12.34.56.78 начал этот сеанс. Поэтому это также пользователь, который начал watch
,
Что касается нахождения history
для этого пользователя это невозможно сделать из того, что я вижу, когда все удаленные пользователи используют одного и того же локального пользователя SSH. Кроме того, он может быть легко подделан / деактивирован и т. Д., Поэтому он не очень надежен. Если он сохранен в файле истории, то вы можете просто посмотреть на cp
Командуйте и смотрите назад в файл, но если его там нет, то делать особо нечего.
Вы можете использовать Snoopy для этого.
Вам необходимо настроить его для регистрации настраиваемой переменной среды (SSH_CLIENT), указав IP=%{env:SSH_CLIENT} в определении формата сообщения журнала (./configure flag или настраивается в snoopy.ini начиная с версии 2.x).
Раскрытие: сопровождающий Snoopy здесь.
Вы можете добавить эти две строки в /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
Предполагая, что вы используете Bash, history
покажет вам только вашу историю командной строки. По умолчанию это читает ~/.bash_history
для истории. Обратите внимание, что это можно изменить (хотя и маловероятно), выполнив что-то вроде HISTFILE=/home/userFoo/.my_alt_history
,
Предполагая, что вы являетесь пользователем root, вы можете просмотреть все каталоги пользователя и прочитать их историю, чтобы увидеть, кто выполняет эту команду.