如何在“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_inputlog_output选项激活的 I/O 日志记录功能。

log_input

    如果设置,sudo将在伪 tty 中运行命令并记录所有用户输入。如果由于 I/O 重定向或命令是管道的一部分,标准输入未连接到用户的 tty,则该输入也会被捕获并存储在单独的日志文件中。

    使用包含在正常 sudo 日志行中的唯一会话 ID(以 .sudo 为前缀)将输入记录到该iolog_dir选项指定的目录(默认情况下) 。该选项可用于控制会话ID的格式。/var/log/sudo-ioTSID=iolog_file

    请注意,用户输入可能包含敏感信息,例如密码(即使它们没有回显到屏幕),这些信息将以未加密的方式存储在日志文件中。在大多数情况下,只需通过 log_output 记录命令输出即可。

log_output

    如果设置,sudo将在伪 tty 中运行该命令并记录发送到屏幕的所有输出,类似于 script(1) 命令。如果由于 I/O 重定向或命令是管道的一部分,标准输出或标准错误未连接到用户的 tty,则也会捕获该输出并将其存储在单独的日志文件中。

    输出使用包含在正常 sudo 日志行中的唯一会话 ID iolog_dir(默认情况下)记录到该选项指定的目录,前缀为.该选项可用于控制会话ID的格式。/var/log/sudo-ioTSID=iolog_file

    可以使用 sudoreplay(8) 实用程序查看输出日志,该实用程序也可用于列出或搜索可用日志。

实现:Sudo 版本至少:需要 1.7.4p4。

/etc/sudoers修改:您需要做的就是向所有必需的 sudoers 条目添加两个标签(其中指定“su”,使用命令或别名)。日志输入和日志输出。

例子:

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

将以下默认日志目录结构添加到sudoers

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

答案2

你的grepwhile 操作sudo su -失败了,因为你没有运行echo 1234567zz,你正在运行su -,这会启动一个 shell。然后 shell 就会运行你的echo.

这是故意的,记录每个运行的命令会让你的系统日志充满无用的信息(通常有大量的程序在幕后运行,你通常看不到)。

如果你将 grep 更改为grep 'COMMAND=/bin/su -' *你就会看到它。


sudo su -也是无用之用susudo -i做同样的事情。

答案3

随着复杂性的增加,以下是记录“sudo su -”中发出的命令的三种方法:

  1. 依赖 bash 命令历史记录
  2. 安装 execve 日志记录包装器
  3. 使用SELinux的auditd

至于哪个合适,这实际上取决于您想要通过日志记录完成什么任务。

1) Bash 命令历史

您可能需要配置历史记录工具以确保保留足够的行,不会从不同的会话覆盖,不会忽略命令以及适当的时间戳。 (参见 HIST* 变量bash手册)。通过编辑历史文件、操纵环境或运行另一个 shell 可以轻松破坏。

2) 执行包装器

史努比记录器是一。添加检查/etc/profile记录器库是否在进程的内存映射中 ( /proc/<pid>/maps),如果没有,则设置LD_PRELOAD并重新启动(使用exec $SHELL --login "$@")。$LIB/snoopy.so或者,您可以使用或向 /etc/ld.so.preload 添加条目等效路径到您的 32/64 位版本的 snoopy.so。

尽管更加困难,但LD_PRELOAD仍然可以通过操纵执行环境来破坏上述环境变量版本,从而使窥探代码不再运行。

系统日志应开箱发送,以使内容可信。

3)审核

配置比 execve 包装器稍微简单一些,但从中提取信息更困难。这就是您可能真正问的问题的答案:“有没有办法记录用户发出命令后对系统产生的影响sudo su -”。系统日志应开箱发送,以使内容可信。

服务器故障答案似乎是与auditd一起使用的相当全面的配置。

还有一些其他建议关于服务器故障的类似问题

答案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

和的手册页中有更多信息auditctlaudit.rulesausearch

相关内容