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


12

如果我:

[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,但总的来说是个问题。

UPDATE#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]

如果恶意(甚至是不可信任)的人可以访问sudo su -,那么他们也可以删除您可以对其操作进行的所有日志条目。如果您希望日志记录具有100%的确定性,则需要严格限制sudosudo su完全禁止。
通配符

Answers:


17

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

log_input

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

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

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

log_output

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

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

    可以使用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}

很好,但是在旧系统上不起作用。:\
newuser999 2014年

是的,也许创建一个当前sudo版本的软件包或升级系统?
Martin M.

13

grep这样做的时候sudo su -失败了,因为你没有运行echo 1234567zz,你正在运行su -,这将启动一个外壳。Shell然后运行您的echo

这是有意为之的,并且记录每一个命令的运行都会使您的syslog充满无用的信息(通常有很多程序在您通常看不见的后台运行)。

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


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


但是我该如何登录“ sudo su-”?
newuser999 2014年

1
它已记录。您是否尝试过grep 'COMMAND=/bin/su -' *(或没有通配符:)grep 'COMMAND=/bin/su -' /var/log/auth.log
帕特里克

我更新了问题。还有什么我需要证明的是,使用“ sudo su-”时未记录命令?
newuser999 2014年

4
命令(sudo -记录下来,并更新后的输出显示这一点。 这就是我们在这里谈论的全部。其他命令,echo后您切换用户sudo -都没有命令执行sudo,因此(按我的答案)还没有登录auth.log。仅sudo记录以明确开头的单个命令。sudo echo记录为是如此,但echo不是普通记录,无论您是否切换到超级用户。
goldilocks 2014年

12

越来越复杂,这是记录在“ sudo su-”中发出的命令的三种方式:

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

至于哪种方法合适,则实际上取决于您要通过日志记录完成什么。

1)Bash命令历史

您可能想要配置历史记录便利性,以确保保持足够的行数,不会被其他会话覆盖,不会忽略命令以及适当的时间戳。(请参阅bash手册中的HIST *变量)。通过编辑历史文件,操作环境或运行其他Shell可以轻松颠覆。

2)execve包装器

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

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

Syslog应该开箱发送,以确保内容可信。

3)经过审核

与execve包装器相比,配置稍微简单一些,但更难于从中提取信息。这就是您可能会真正问到的问题的答案:“有没有一种方法可以记录用户发出问题后对系统产生的影响sudo su -”。Syslog应该开箱发送,以确保内容可信。

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

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


9

为什么?

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

su是“切换用户”,默认情况下为root。之后的任何操作都不会通过sudo 这与以root用户身份登录几乎相同。登录本身会被记录,但不是每个命令。


5

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

而是使用auditd。如果要记录由root完成的所有事情(包括例如由crontab完成的事情),请使用以下命令:

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

ETA:请注意,记录所有内容都会影响性能,因此您可能需要限制一点。请参阅man auditctl示例。

如果只想在原始登录用户名不是root的地方记录系统调用,请改用以下命令:

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

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

有没有在手册页的详细信息auditctlaudit.rules以及ausearch


2
哦,为了使审核日志受信任,应该将它们发送到单独的服务器。驻留在不受信任用户具有root用户权限的计算机上的任何日志都不会被信任。
珍妮·D

即使这样,您也无法相信受感染服务器产生或没有的结果。
马特

但是您会一直追踪到它被破坏之前。
珍妮·D

2
这在运的情况下,尽快为他们已经运行在技术上是sudo su -这样你在广场一回
马特

不信任与被妥协是不同的。除非他们实际上做了一些邪恶的事情,否则它不会受到损害,在这种情况下,远程服务器上的cse审核日志将向您显示已完成的操作以及由谁进行的操作-包括禁用审核的人员。甚至除此之外,当某人误删除了本地日志或防止自己因错误而受到指责时,远程日志也将提供帮助。
珍妮·D

2

sudo su -~/.bash_history如果您的外壳是bash,它将进入。

echo 1234567zz/root/.bash_history如果root的shell是bash,则将在其中。

关于这一点的解释已经由goldilocks发布。


2

您是否想让su登录,因为您认为它是安全缺陷?您是否考虑过此命令?sudo bash就像糟糕的恕我直言。

如果您担心人们如何使用sudo,那么您将需要限制它的使用。您可以限制它们也可以执行的命令。如果您担心,请限制对/ bin / su的访问。


1

那这个呢:

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log'
sudo -E su
unset PROMPT_COMMAND

要么

export HISTTIMEFORMAT="%d/%m/%y %T "
export PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' 
sudo -E su --preserve-environment -
unset PROMPT_COMMAND

或长单线:

HISTTIMEFORMAT="%d/%m/%y %T " PROMPT_COMMAND='builtin history 1 >> /var/log/sudo.log' sudo -E su

sudo -E保留环境PROMPT_COMMAND在每次提示前执行


第一个没有给我控制台,如果我把第二个放在/root/.bashrc中,那么如果我想在“ sudo su-”之后得到根控制台,我必须按CTRL + C:D解决此问题(或向其中添加“日期”功能?)。非常感谢!
newuser999

恐怕您滥用了它。编辑它以使其更加明确。
哥斯达黎加

1

如果有帮助,可以使用sudoers的“ NOEXEC”选项。

您需要将其定义为

USER_NAME         ALL=(ALL) NOEXEC : ALL

这将防止外壳转义,并且用户将无法使用sudo -i或sudo -s或sudo su-

这样做有一个缺点,但是,将禁用任何外壳转义。从脚本中执行脚本的脚本也将被拒绝。


0

让我们不要这么复杂:每当sudo被调用时,它都会在以下文件中报告此事实/var/log(在您的系统上为auth.log,在我的OS X框中为system.log)。sudo报告其命令行参数,但不了解诸如的交互式命令中可能发生的情况su

这并不意味着在根子Shell中没有发生任何记录:Shell命令保存在Shell的历史记录中。在我的系统上,默认情况下启用了root的历史记录保存功能,因此,我要做的就是查找~root/.sh_history所做操作的记录(当然,除非有人对其进行了篡改,但他们同样可以篡改/var/log)。

认为这是最适合您的解决方案。如果不是,请auditd按照@Jenny的建议,带着镇去。

PS。如果尚未启用root的历史记录,则启用root的历史记录取决于它使用的shell。对于bash,请将HISTORY和设置HISTFILESIZE为足够大的数字(我的手册说,默认值为500)。如果您愿意,可以通过设置HISTFILE路径来指定保存历史记录的位置(默认$HOME/.sh_history


0

您可能要使用以下命令创建会话的打字稿script(1)

$ sudo su -
# script -t /tmp/my_typescript 2> /tmp/my_typescript.timing
Script started, file is /tmp/my_typescript
# echo foobar
foobar
# echo hello world
hello world
# exit
exit
Script done, file is /tmp/my_typescript

现在您可以grep(请注意,#提示实际上记录在中/tmp/my_typescript):

$ grep echo /tmp/my_typescript
# echo foobar
# echo hello world

另外,您甚至可以通过scriptreplay(1)以下方式再次观看整个会话:

$ scriptreplay -t /tmp/my_typescript.timing /tmp/my_typescript

该文件/tmp/my_typescript.timing包含每个命令被调用时的信息。还有其他工具,例如ttyrecshelr具有更多风铃声的工具。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.