Портом 53 является DNS; ничто для волнения о том, если Вы не заглядываете в с Wireshark и находите, что запросы для хостов, которые Вы не посещаете.
] У меня есть менее сложный ответ, и уж точно не кейлоггер. Я не понимаю, о чем вы говорите, будучи независимым от логов сервера (это означает, что все действия должны быть предприняты на сервере, а все логи являются логами серверной стороны), и поэтому я подумал, что хорошей идеей будет передача в системный bashrc такой команды, как подсказка: [
][
PROMPT_COMMAND='history -a >(tee -a ~/.bash_history | logger -t "$USER[$$] $SSH_CONNECTION")'
]
[] В debian вы должны отредактировать файл: /etc/bash.bashrc и в centos файл: /etc/bashrc[
] []Если вы хотите начать регистрацию сессии, в которой вы находитесь, вы должны исходный файл, который вы отредактировали, например, выполнить: [
][
source /etc/bash.bashrc
]
[]в системе debian или [
][
source /etc/bashrc
]
в системе центос.
[]Отныне каждая команда, каждая сессия ssh будет записываться в []/var/log/syslog[] в системе debian и в []/var/log/messages[] в системе centos.[
] []В случае, если вы хотите записать их в отдельный файл и не испортить другие файлы журналов, которые вы можете использовать: [
][
PROMPT_COMMAND='history -a >(tee -a ~/.bash_history | logger -p local6.info -t "$USER[$$] $SSH_CONNECTION")'
]
вместо предыдущего примера PROMPT_COMMAND, а затем сконфигурируйте rsyslogd по мере необходимости.
[] Например, в системе Debian отредактируйте файл []/etc/rsyslog.conf[]: изменить строку : [
][
.;auth,authpriv.none -/var/log/syslog
]
на
[
.;auth,authpriv.none,local6 -/var/log/syslog
]
и добавьте следующую строку в конец файла:
[
local6.info /var/log/history.log
]
[] затем выполнить: [
][touch /var/log/history.log && /etc/init.d/rsyslog restart
] Меня заинтриговал ваш вопрос. Изначально я не собирался давать ответ, но меня зацепило.
Это использует ожидание
и это действительно кейлоггер.
#!/usr/bin/expect -f
proc log {msg} {
puts $::fh "[timestamp -format {%Y-%m-%d %H:%M:%S}]: $msg"
}
set ssh_host [lindex $argv 0]
set ::fh [open "sshlog.$ssh_host" a]
log "{session starts}"
spawn ssh $ssh_host
interact {
-re "(.)" {
set char $interact_out(1,string)
if {$char eq "\r"} {
log $keystrokes
set keystrokes ""
} else {
append keystrokes $char
}
send -- $char
}
eof
}
log "{session ends}"
Примечания:
uptime
), то в лог-файле появится "upt\t", а не "uptime"^?
(обратные символы) в лог-файле.В настоящее время я использую бэш-скрипт, приведенный ниже. У него много проблем, но это единственное решение, которое я нашел, которое учитывает все требования, приоритеты и "приятно иметь" (по крайней мере, большую часть времени).
В этом ответе обсуждается, почему локально регистрировать ssh сессии так сложно.
Проблемы со скриптом, который я нашел на данный момент:
Многострочные команды вызывают проблемы:
Цепные сессии (с использованием команд ssh
или su
на удаленном конце) приводят к тому, что прокрутка истории записывает прокрученные команды вместо действительных команд, используемых
Регулярные выражения могут быть улучшены и могут потребовать изменения для определенных окружений:
cat -v
перед очисткой. В результате, действительное содержимое может быть удалено, если вы когда-либо используете в командах строки типа ^[[
.Нет команды ssh bash completion, например, для имени хоста. Вы можете получить завершение команды bash, если вы используете псевдоним этого скрипта на ssh
с псевдонимом ssh="sshlog"
Источник скрипта и его установка:
Для установки вставьте следующее в ~/bin/sshlog и сделайте его исполняемым. Вызов с помощью sshlog
. Опциональный псевдоним для 'ssh' в пользовательском .bashrc файле.
#!/bin/bash
# A wrapper for the ssh command that produces a timestamped log of all ssh commands
declare -r logfile=~/logs/ssh.log
declare -r description="sshlog-${$} ${@}"
declare -r TAB=$'\t'
logdir=`dirname ${logfile}`
[ -d ${logdir} ] || mkdir "${logdir}";
clean_control_chars() {
while IFS= read -r line; do
# remove KNOWN control characters. Leave the rest for now.
# line=$(echo "${line}" | sed 's/\^\[\[K//g') # unkown control character: ^[[K
# line=$(echo "${line}" | sed 's/\^\[\[[0-9]\+[P]//g') # these are generated by up/down completion - e.g. ^[[2P
line=$(echo "${line}" | sed 's/\^\[\[[0-9]*[A-Z]//g') # all other ^[[..
# replay character deletions (backspaces)
while [[ $(echo "${line}" | grep -E --color=never '.\^H') != "" ]]; do
line=$(echo "${line}" | sed 's/.\^H//')
done
# remove common control characters
line=$(echo "${line}" | sed 's/\^M$//') # remove end of line marker from end
line=$(echo "${line}" | sed 's/^\^G//g') # remove start marker from start
# remove ^G from other locations - possibly a good idea
# line=$(echo "${line}" | sed 's/\^G//g')
# remove all other control characters - not recommended (many like ^C and ^M indicate which section was processed/ ignored)
# line=$(echo "${line}" | sed 's/\^[A-Z]//g')
echo ${line};
done
}
filter_output() {
while IFS= read -r line; do
# convert nonprinting characters and filter out non-prompt (in Ubuntu 14.04 tests, ^G indicates prompt start)
line=$(echo "${line}" | cat -v | grep -Eo '[\^][G].*[\$#].*')
[[ ${line} != "" ]] && echo "${line}"
done
}
format_line() {
while IFS= read -r line; do
raw=${line};
line=$(echo "${line}" | clean_control_chars);
prompt=$(echo "${line}" | grep -Po '^.*?(\$|#)[\s]*')
command=${line:${#prompt}}
timestamp=`date +"%Y-%m-%d %H:%M:%S %z"`
echo -e "${timestamp}${TAB}${description}${TAB}${prompt}${TAB}${command}"
done
}
echo "Logging ssh session: ${description}"
echo "[START]" | format_line >> ${logfile}
/usr/bin/ssh "$@" | tee >(filter_output | format_line >> ${logfile})
echo "[END]" | format_line >> ${logfile}
Пример содержимого лога:
2014-06-29 23:04:06 -0700 sshlog-24176 remote [START]
2014-06-29 23:04:12 -0700 sshlog-24176 remote oleg@remote:~$ cd test
2014-06-29 23:04:13 -0700 sshlog-24176 remote oleg@remote:~/test$ ls
2014-06-29 23:04:14 -0700 sshlog-24176 remote oleg@remote:~/test$ exit
2014-06-29 23:04:14 -0700 sshlog-24176 remote [END]
Как насчет strace -o /tmp/ssh_log -ff -s8192 -T -ttt -fp $(pidof sshd)
? В этом журнале регистрируются все сеансы ssh. Вам может понадобиться инструмент для последующего разбора лога, или просто используйте grep
, awk
и т.п.
-f
: проследите за детьми-вилочками -ff
: запишите каждого ребенка отдельно в ssh_log. PID
-s8192
: увеличение предела протоколирования строк (если необходимо)-T -ttt
: микросекундная маркировка в секундах с момента Эпохи-p N
: прикрепление к пиду N