Как автоматически записать все Ваши терминальные сеансы с утилитой сценария

2048 (стартовый сектор) времена 512 (размер сектора) 1048576. Таким образом, необходимо работать

sudo mount -o loop,offset=1048576 centos6.img /mnt/centos6

Причина сообщения об ошибке, которое Вы получили, состоит в том, что Вы сказали ядру искать файловую систему в некоторой случайной незанятой точке на диске. Таким образом, это сказало Вам, что не распознало файловую систему там.

Посмотрите Чтение файловой системы от целого образа диска для фона.

Вы могли бы попробовать libguestfs, который может смонтировать много образов дисков VM автоволшебно.

30
30.11.2011, 09:45
3 ответа

Если кто-то хочет записать их терминальные сеансы автоматически - включая сессии (!) SSH - использование script утилита, вот то, как.

Добавьте следующую строку в конце .bashrc в Вашем корневом каталоге, или иначе /etc/bash.bashrc если Вы только хотите записать сессии всех пользователей. Мы тестируем на родительский процесс оболочки, не являющийся script и затем выполненный script.

Для Linux:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -f $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

Для BSD и macOS, изменения script -f кому: script -F:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -F $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

Это все!

Теперь при открытии нового терминала, Вы будете видеть:

Script started, file is /home/username/file_name.log

script запишет Ваши сессии в файл в Вашем корневом каталоге, называющем их что-то как 30-Nov-11_00-11-12_shell.log в результате.

Больше настройки:

  • Можно добавить сессии в один большой файл вместо того, чтобы создать новый для каждой сессии с script -a /path/to/single_log_file
  • Можно корректироваться, где файлы записаны в путем изменения пути после script -f (Linux) или script -F (BSD и macOS)

Этот ответ предполагает, что Вы имеете script установленный, конечно. На находящихся в Debian дистрибутивах, script часть bsdutils пакет.

26
27.01.2020, 19:38
  • 1
    Можно отредактировать вопрос и его заголовок сами. Просто нажмите edit кнопка, которая кажется правильной ниже его. –  Mat 30.11.2011, 08:51
  • 2
    Вы могли бы хотеть рассмотреть добавление a ${RANDOM} и/или $$ к имени файла начиная с запуска двух оболочек в течение секунды друг после друга вызовет конфликт имени файла. Лично, я часто использую script.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.log для обеспечения файлов автоматически отсортированы по дате/времени, и они последовательны через TZ, я знаю хост, который инициировал его, я знаю процесс владения, и нет никаких коллизий имени. Я редко использую ${USER} потому что это обычно - что-то для только меня. –  nicerobot 02.12.2011, 18:33
  • 3
    "удостоверяется, что Вы на самом деле создали/var/log/script и сделали его перезаписываемым другими", Вы записали. Я задавался вопросом, желательно ли с точки зрения безопасности использовать "sudo chmod 777/var/log/script" в этом случае. –  Teo 01.07.2017, 19:07

Хотя этот вопрос был задан человеком, желающим записывать свои собственные сессии, альтернативным вариантом может быть использование системным администратором, который хочет отслеживать, что делают различные пользователи.

Боюсь, что запуск script внутри общесистемного bashrc может не подойти в случае, когда пользователи машины не хотят, чтобы записи их сессий велись.

Пользователи, желающие остаться инкогнито, могут обойти протоколирование, попросив sshd открыть другую оболочку (например, zsh) или выполнить bash --rcfile ___, чтобы предотвратить загрузку /etc/bash.bashrc.

Альтернативный подход

Это руководство от 2008 года (архивировано) использует другой метод, чтобы заставить скрипт запускаться, когда пользователь входит в систему с помощью ssh, который требует от пользователей входа с открытым/закрытым ключом.

Это делается путем добавления скрипта в файл .ssh/authorized_keys пользователя, перед ключом:

command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....

Скрипт log-session (archived) затем решает, запускать или нет /usr/bin/script для регистрации сессии этого пользователя.

exec script -a -f -q -c "$SSH_ORIGINAL_COMMAND" $LOGFILE

Чтобы пользователь не смог удалить добавленную команду, администратор должен будет принять право собственности на файл authorized_keys пользователя.

chown root:root ~user/.ssh/authorized_keys

К сожалению, это означает, что пользователь не сможет самостоятельно добавить дополнительные ключи или, что более важно, отозвать существующий ключ, если он скомпрометирован, что далеко не идеально.

Предостережения

Обычно стандартная конфигурация sshd позволяет пользователям выполнять SFTP через их логин ssh. Это дает пользователям возможность редактировать файлы без записи изменений в журнал. Если администратор не хочет, чтобы пользователи могли это делать, то он должен либо включить протоколирование для SFTP, либо отключить эту службу. Хотя даже в этом случае пользователи все равно могли бы вносить невидимые изменения в файлы, выполнив в терминале что-то вроде этого:

curl "http://users.own.server/server/new_data" > existing_file

Можно было бы отслеживать подобные изменения, используя файловую систему с функцией копирования при записи, которая записывает всю историю файлов.

Но аналогичный трюк позволит пользователю выполнять команды без записи в журнал:

curl "http://users.own.server/server/secret_commands_824" | sh

Я не знаю простых решений для этого. Возможными вариантами могут быть:

  • запись в журнал всех сетевых данных (и последующее их распутывание).
  • Протоколирование всех системных вызовов.

Такие вещи могут быть возможны с auditd.

Но в любом случае...

Маловероятно, что протоколирование пользовательских сессий обеспечивает какую-либо реальную безопасность для администраторов. По умолчанию пользователь может манипулировать только своими собственными файлами и не может нанести вред системе. Если злоумышленнику все же удастся повысить привилегии, он сможет отключить ведение журнала и удалить журналы (если только администратор не настроил хранение журналов на отдельной машине, только в виде приложений).

Администраторы, которые автоматически регистрируют сеансы пользователей, вероятно, должны информировать пользователей о том, что это делается. В некоторых юрисдикциях такая форма сбора данных может нарушать законы о данных или конфиденциальности. И, по крайней мере, было бы уважительно по отношению к пользователям поставить их в известность.

Более вероятно, что администратор будет заинтересован в регистрации сессий пользователей sudo. Возможно, это можно рассмотреть в другом ответе или даже в другом вопросе.

10
27.01.2020, 19:38

Вместо:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' ||

я бы использовал:

grep -qx "$PPID" <(pgrep -x "script") ||

Двойные кавычки в этом случае не нужны, но я все равно использую их как стандартную практику. Я определенно рекомендую использовать переключатель «x» как для grep, так и для pgrep, чтобы избежать редких, но проблемных совпадений с подстроками.

2
27.01.2020, 19:38

Теги

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