如果我:
[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_input
和log_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 -
也是无用的su
。sudo -i
做同样的事情。
R P*_*rin 13
随着复杂性的增加,以下是记录“sudo su -”中发出的命令的三种方式:
至于哪个合适,这实际上取决于您要通过日志记录来完成什么。
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 身份登录的情况大致相同;登录本身会被记录,但不会记录每个命令。
正如其他人所说,sudo
不能这样做。
相反,使用auditd
. 如果你想记录root 完成的所有事情(包括例如由 crontab 完成的事情),请使用:
sudo auditctl -a exit,always -F euid=0
Run Code Online (Sandbox Code Playgroud)
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
。
归档时间: |
|
查看次数: |
85279 次 |
最近记录: |