Как регистрировать команды в «sudo su -»?

Как регистрировать команды в «sudo su -»?

Если я:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 

И вот что я вижу в логах:

[root@notebook /var/log] grep 123456uu *
auth.log:Jan  9 17:01:51 notebook sudo: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/bin/echo 123456uu
[root@notebook /var/log] 

но если я:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 

Я не вижу этого в журналах:

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 

Мой вопрос: как включить ведение журнала для команд внутри «sudo su -»?

ОС — Ubuntu 12.04, но вопрос общий.

ОБНОВЛЕНИЕ №1:

[user@notebook ~] sudo su -
[sudo] password for user: 
[root@notebook ~] echo zizizi
zizizi
[root@notebook ~] cd /var/log
[root@notebook /var/log] grep -iIR 'zizizi' *
[root@notebook /var/log] grep 'COMMAND=/bin/su -' *
auth.log:Jan 10 15:42:42 notebook sudo: user : TTY=pts/1 ; PWD=/home/user ; USER=root ; COMMAND=/bin/su -
[root@notebook /var/log]

решение1

Поскольку вы используете Ubuntu 12.04, ознакомьтесь с возможностями ведения журнала ввода-вывода, активируемыми с помощью параметров log_inputи log_output.

log_input

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

    Ввод регистрируется в каталоге, указанном опцией iolog_dir( /var/log/sudo-ioпо умолчанию), с использованием уникального идентификатора сеанса, который включен в обычную строку журнала sudo, с префиксом TSID=. iolog_fileОпция может использоваться для управления форматом идентификатора сеанса.

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

log_output

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

    Вывод регистрируется в каталоге, указанном опцией iolog_dir( /var/log/sudo-ioпо умолчанию), с использованием уникального идентификатора сеанса, который включен в обычную строку журнала sudo, с префиксом TSID=. iolog_fileОпция может использоваться для управления форматом идентификатора сеанса.

    Выходные журналы можно просматривать с помощью утилиты sudoreplay(8), которую также можно использовать для просмотра списка доступных журналов или поиска по ним.

РЕАЛИЗАЦИЯ: Требуется версия Sudo не ниже 1.7.4p4.

/etc/sudoersмодификация: Все, что вам нужно сделать, это добавить два тега ко всем требуемым записям sudoers (где указано «su», либо с командой, либо с псевдонимом). LOG_INPUT и LOG_OUTPUT.

Пример:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL

Добавьте следующую структуру каталога журнала по умолчанию sudoers:

Defaults iolog_dir=/var/log/sudo-io/%{user}

решение2

Ваш grepкогда делает sudo su -не получается, потому что вы не работаете echo 1234567zz, вы работаете su -, что запускает оболочку. Оболочка затем запускает ваш echo.

Это сделано намеренно, и регистрация каждого запуска команды переполнит ваш системный журнал бесполезной информацией (обычно существует множество программ, которые запускаются «за кулисами», и вы их обычно не видите).

Если вы измените grep на , grep 'COMMAND=/bin/su -' *вы это увидите.


sudo su -также является бесполезным использованием su. sudo -iделает то же самое.

решение3

В порядке возрастания сложности вот три способа регистрации команд, введенных в «sudo su -»:

  1. Полагайтесь на историю команд bash
  2. Установить оболочку ведения журнала execve
  3. Используйте SELinux's auditd

Что касается того, какой вариант подходит, все зависит от того, чего вы пытаетесь добиться с помощью регистрации.

1) История команд Bash

Вам необходимо настроить функцию истории, чтобы обеспечить сохранение достаточного количества строк, отсутствие перезаписи из разных сеансов, отсутствие игнорирования команд и соответствующие временные метки. (См. переменные HIST* вруководство по bash). Легко обмануть, отредактировав файл истории, изменив окружение или запустив другую оболочку.

2) execve-обертка

Снупи Логгеродин. Добавьте проверку того /etc/profile, что библиотека логгера находится в карте памяти процесса ( /proc/<pid>/maps), и если нет, установите LD_PRELOADи перезапустите (с exec $SHELL --login "$@"). В качестве альтернативы вы можете добавить запись в /etc/ld.so.preload с $LIB/snoopy.soилиэквивалентный путь(и)к вашим 32/64-битным версиям snoopy.so.

Хотя и более сложная LD_PRELOADверсия с переменными среды, описанная выше, все равно может быть нарушена путем манипулирования средой выполнения таким образом, чтобы шпионский код больше не запускался.

Чтобы содержимое было достоверным, системный журнал следует отправлять отдельно.

3) аудитд

Немного проще в настройке, чем execve wrapper, но сложнее извлечь информацию. Это ответ на вопрос, который вы, вероятно, действительно задаете: "Есть ли способ регистрировать, какой эффект пользователь оказал на систему после того, как он выдал sudo su -". Syslog должен отправляться из коробки, чтобы содержимое было достоверным.

ЭтотОтвет на ошибку серверапо-видимому, это довольно полная конфигурация для использования с auditd.

Есть и другие предложенияаналогичный вопрос на serverfault.

решение4

Как уже говорили другие, sudoтак делать нельзя.

Вместо этого используйте auditd. Если вы хотите войтивсевыполняется пользователем root (включая, например, действия, выполняемые с помощью crontab), используйте это:

sudo auditctl -a exit,always -F euid=0

ETA: Обратите внимание, что регистрация всего повлияет на производительность, поэтому вам, вероятно, захочется ее немного ограничить. man auditctlПримеры см.

Если вы хотите регистрировать только системные вызовы, где исходный UID входа не является root, используйте это:

sudo auditctl -a exit,always -F euid=0 -F auid!=0

Логи обычно попадают в /var/log/audit/audit.log. Вы можете искать их с помощью ausearch.

Более подробную информацию можно найти на страницах руководства для auditctl, audit.rulesи ausearch.

Связанный контент