如果我:
[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
选项激活的 I/O 日志记录功能。
log_input
如果设置,
sudo
将在伪 tty 中运行命令并记录所有用户输入。如果由于 I/O 重定向或命令是管道的一部分,标准输入未连接到用户的 tty,则该输入也会被捕获并存储在单独的日志文件中。使用包含在正常 sudo 日志行中的唯一会话 ID(以 .sudo 为前缀)将输入记录到该
iolog_dir
选项指定的目录(默认情况下) 。该选项可用于控制会话ID的格式。/var/log/sudo-io
TSID=
iolog_file
请注意,用户输入可能包含敏感信息,例如密码(即使它们没有回显到屏幕),这些信息将以未加密的方式存储在日志文件中。在大多数情况下,只需通过 log_output 记录命令输出即可。
log_output
如果设置,
sudo
将在伪 tty 中运行该命令并记录发送到屏幕的所有输出,类似于 script(1) 命令。如果由于 I/O 重定向或命令是管道的一部分,标准输出或标准错误未连接到用户的 tty,则也会捕获该输出并将其存储在单独的日志文件中。输出使用包含在正常 sudo 日志行中的唯一会话 ID
iolog_dir
(默认情况下)记录到该选项指定的目录,前缀为.该选项可用于控制会话ID的格式。/var/log/sudo-io
TSID=
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
你的grep
while 操作sudo su -
失败了,因为你没有运行echo 1234567zz
,你正在运行su -
,这会启动一个 shell。然后 shell 就会运行你的echo
.
这是故意的,记录每个运行的命令会让你的系统日志充满无用的信息(通常有大量的程序在幕后运行,你通常看不到)。
如果你将 grep 更改为grep 'COMMAND=/bin/su -' *
你就会看到它。
sudo su -
也是无用之用su
。sudo -i
做同样的事情。
答案3
随着复杂性的增加,以下是记录“sudo su -”中发出的命令的三种方法:
- 依赖 bash 命令历史记录
- 安装 execve 日志记录包装器
- 使用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
。
和的手册页中有更多信息auditctl
。audit.rules
ausearch