Локальное, журналирование, к которому добавляют метку времени, всех команд ssh?

Портом 53 является DNS; ничто для волнения о том, если Вы не заглядываете в с Wireshark и находите, что запросы для хостов, которые Вы не посещаете.

11
13.04.2017, 15:36
4 ответа
[

] У меня есть менее сложный ответ, и уж точно не кейлоггер. Я не понимаю, о чем вы говорите, будучи независимым от логов сервера (это означает, что все действия должны быть предприняты на сервере, а все логи являются логами серверной стороны), и поэтому я подумал, что хорошей идеей будет передача в системный 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
]
0
27.01.2020, 19:59

Меня заинтриговал ваш вопрос. Изначально я не собирался давать ответ, но меня зацепило.

Это использует ожидание и это действительно кейлоггер.

#!/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}"

Примечания:

  • он добавляется к файлу с адресом назначения ssh в имени
  • это кейлоггер: если вы не настроили ключи ssh, вы получаете пароль пользователя в лог-файле
  • он сбрасывается по завершению табуляции: если пользователь набрал uptTab (для команды uptime), то в лог-файле появится "upt\t", а не "uptime"
  • it хватает символов в "raw" режиме: если пользователь плохо печатает, то вы получите много ^? (обратные символы) в лог-файле.
4
27.01.2020, 19:59

В настоящее время я использую бэш-скрипт, приведенный ниже. У него много проблем, но это единственное решение, которое я нашел, которое учитывает все требования, приоритеты и "приятно иметь" (по крайней мере, большую часть времени).

В этом ответе обсуждается, почему локально регистрировать ssh сессии так сложно.

Проблемы со скриптом, который я нашел на данный момент:

  1. Многострочные команды вызывают проблемы:

    • Если вы просматриваете многострочный элемент истории (с помощью клавиш вверх/вниз), он будет регистрировать элемент истории вместо последней команды. Этого можно избежать, удалив из bash истории любые многострочные команды сразу после их использования.
    • Регистрируются только первые строки многострочных команд.
  2. Цепные сессии (с использованием команд ssh или su на удаленном конце) приводят к тому, что прокрутка истории записывает прокрученные команды вместо действительных команд, используемых

  3. Регулярные выражения могут быть улучшены и могут потребовать изменения для определенных окружений:

    • Я обманываю, конвертируя непечатающиеся символы с помощью cat -v перед очисткой. В результате, действительное содержимое может быть удалено, если вы когда-либо используете в командах строки типа ^[[.
    • Иногда вы получаете дополнительный лог-файл перед командой, например, если вы очень быстро просматриваете историю. Обычно за этим следует "^M" перед командой и при желании может быть удален.
    • Иногда встречаются и другие управляющие символы. Я оставляю их все до тех пор, пока не узнаю, какие из них безопасно удалить. ^M, как я только что упомянул, полезен для обнаружения неправильного входа в лог, и ^C скажет вам, если команда была прервана.
    • Регулятор запроса может потребоваться изменить для определенных подсказок, и я могу представить, что различные удаленные среды могут иметь различные шаблоны символов управления.
  4. Нет команды 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]
2
27.01.2020, 19:59

Как насчет 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
0
27.01.2020, 19:59

Теги

Похожие вопросы