我的一位同事不久前指派我对企业安全服务器进行根本原因分析。我们知道问题出在 root 运行的进程之一,但不知道是哪一个。
我首先通过发出命令开始我的研究:
ps -aux | grep -v grep | grep root
这返回了包含几十个进程的列表。然后,我的同事帮助我使用以下命令优化搜索:
ps -aux | grep -v grep | grep root | grep -Ev '[[]'| grep -v tty
这个新命令显着减少了返回的进程列表,我们很快就发现了问题。命令的后两部分被过滤掉
1) 由 [ ] 包围的进程,例如 [ksoftirqd/0] 2) 通过电传终端运行的进程
ps(1) 告诉我,带有无法定位的参数的进程被放置在方括号中(不确定这意味着什么),而 tty 只是现代 bash 终端的前身。然而,我仍然不明白它们的重要性(或者我应该说微不足道),为什么我们可以将它们从更“富有成效的”根进程中消除。
有人能在这里澄清一下吗?
谢谢
答案1
“无法定位的参数”通常意味着该过程有没有命令行参数,因为它不是普通的用户进程,而是由内核直接启动的进程。当您正在寻找执行错误的进程时,它通常不是这些内核进程之一,因此您的同事建议将其过滤掉。
蒂是不是“只是现代 bash 终端的前身”。它与 bash 或 shell 完全无关,也不是任何东西的前身。列出的 ttyps
是进程的控制终端(如果有的话)。具有控制 tty 的进程很可能是由某些用户作为交互式会话的一部分启动的(无论是在本地控制台、本地串行端口、SSH 会话、屏幕还是其他内容上启动的会话,都无关紧要:它们都是终端)。没有控制 tty 的进程通常是守护进程和系统服务。您的同事建议问题更有可能出现在守护程序或系统服务中。
至于命令行的其余部分:
ps -aux | grep root
我不知道你正在使用什么操作系统,但ps
with aux
-style 参数的版本通常是 BSD 遗产。我不熟悉 BSD ps
,但我怀疑有一个选项可以仅列出属于特定用户的进程,而不是列出每个进程,然后过滤掉所有不属于 root 的进程。例如,如果您使用 Linux,则为:
ps -fu root
答案2
坦白说,这听起来有点傻。
grep -Ev "[[]"
排除命令中带有左方括号的进程。虽然这些通常是内核进程,但即使是常规用户空间程序也可以在命令行上显示该字符。
grep -Ev "tty"
淡蓝色也是一样。它排除在 的输出行中某处具有字符串“tty”的进程ps
。这包括打开终端设备的进程(但不包括打开伪终端的进程(!)),因此听起来像是将输出限制为守护进程任务。
但是,与上述情况一样,它还将排除出现在ps
as 的输出中的进程:
pid ? R+ 310:03 /home/pwned_user/bin/rootkit_tty[_rofl crack root-password
也就是说,你很幸运找到了任何东西,但你不能真正确定你已经找到了所有东西。考虑到您的问题一开始就有“企业安全服务器”,这使它又上升了一个级别(或者下降了,如果您愿意的话)。
答案3
一般来说,你永远不想做ps aux | grep -v grep
,这就是目的pgrep
:
pgrep -u root
上面的命令将列出由 启动的所有进程root
。ps
如果您想要 1) 排除名称包含在 中的用户[]
,以及 2) 限制那些未在 ttys 中列出的运行用户,那么您确实需要。您可以通过指定每个字符串不应该匹配的确切位置来避免其他答案中提到的一些问题(而不是使用grep -v
which 将丢弃匹配的行任何地方):
ps aux | awk '$1=="root" && $7 !~/^tty[0-9]$/ && $NF!~/^\[.*\]$/'
---------- ---------------- ---------------
| | |
| | |-> If the last field
| | is within [ ]
| |---------------> If the 7th field starts
| with tty and ends in a digit
|----------------------------> If the 1st field is 'root'