如何在“sudo su -”中记录命令?

new*_*999 12 sudo

如果我:

[user@notebook ~] sudo echo 123456uu
123456uu
[user@notebook ~] 
Run Code Online (Sandbox Code Playgroud)

然后我可以在日志中看到:

[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] 
Run Code Online (Sandbox Code Playgroud)

但如果我:

[user@notebook ~] sudo su -
[root@notebook ~] echo 1234567zz
1234567zz
[root@notebook ~] 
Run Code Online (Sandbox Code Playgroud)

我在日志中看不到它:

[root@notebook /var/log] grep 1234567zz *
[root@notebook /var/log] echo $?
1
[root@notebook /var/log] 
Run Code Online (Sandbox Code Playgroud)

我的问题:如何为“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]
Run Code Online (Sandbox Code Playgroud)

小智 18

由于您使用的是 Ubuntu 12.04,请查看通过log_inputlog_output选项激活的 I/O 日志记录功能。

log_input

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

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

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

log_output

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

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

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

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

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

例子:

%admins         ALL=(ALL) NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL
Run Code Online (Sandbox Code Playgroud)

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

Defaults iolog_dir=/var/log/sudo-io/%{user}
Run Code Online (Sandbox Code Playgroud)


phe*_*mer 13

grep做的时候sudo su -失败了,因为你没有运行echo 1234567zz,你正在运行su -,这会启动一个shell。然后 shell 运行你的echo.

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

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


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

  • 命令 (`sudo -`) * 已记录,更新后的输出显示了这一点。**这就是我们在这里讨论的全部内容。** *其他命令,*例如使用 `sudo -` 切换用户后的 `echo`,** 不是 sudo 命令,** 因此(根据我的回答) 未登录到 `auth.log`。只会记录明确以 `sudo` 开头的单个命令。所以 `sudo echo` 会被记录,但只是简单的 `echo` 不会被记录,不管你已经切换到超级用户。 (4认同)

R P*_*rin 13

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

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

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

1) Bash 命令历史

您可能希望配置历史记录工具以确保保留足够的行、不覆盖来自不同会话、不忽略命令和适当的时间戳。(请参阅bash 手册中的 HIST* 变量)。通过编辑历史文件、操纵环境或运行另一个 shell 来轻松颠覆。

2) execve 包装器

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

虽然难度更大,但LD_PRELOAD仍然可以通过操纵执行环境来破坏上述环境变量版本,从而使snoopy代码不再运行。

Syslog 应该被发送到盒子外,以便内容值得信赖。

3) 审核

配置比 execve 包装器更直接,但更难从中提取信息。这就是您可能真正要问的问题的答案:“有没有办法记录用户在发出问题后对系统产生的影响sudo su -”。Syslog 应该被发送到盒子外,以便内容值得信赖。

Serverfault 答案似乎是与 auditd 一起使用的相当全面的配置。

关于 serverfault类似问题还有其他一些建议。


gol*_*cks 10

为什么?

因为它sudo正在做日志记录;它记录 sudo 命令。在第一种情况下,sudo echo被记录。在第二种情况下,sudo su被记录(在 中查找/var/log/auth.log)。

su是“切换用户”,默认为root。之后你做的任何事情都不会通过sudo 这与您以 root 身份登录的情况大致相同;登录本身会被记录,但不会记录每个命令。


Jen*_*y D 7

正如其他人所说,sudo不能这样做。

相反,使用auditd. 如果你想记录root 完成的所有事情(包括例如由 crontab 完成的事情),请使用:

sudo auditctl -a exit,always -F euid=0
Run Code Online (Sandbox Code Playgroud)

ETA:请注意,记录所有内容都会影响性能,因此您可能希望对其进行一些限制。参见man auditctl示例。

如果您只想记录原始登录 uid 不是 root 的系统调用,请改用:

sudo auditctl -a exit,always -F euid=0 -F auid!=0
Run Code Online (Sandbox Code Playgroud)

日志通常会在 /var/log/audit/audit.log 中结束。您可以使用 搜索它们ausearch

auditctl,audit.rules和的手册页中有更多信息ausearch

  • 哦,为了让审计日志可信,应该将它们发送到单独的服务器。任何驻留在不受信任的用户拥有 root 的机器上的日志都不能被信任。 (2认同)
  • 在 op 的情况下,从技术上讲,一旦他们运行了 `sudo su -`,你就回到了第一个地方 (2认同)