Linux审核可以提供帮助。它将至少定位建立数据报网络连接的用户和进程。UDP数据包是数据报。
首先,将auditd
框架安装在您的平台上,并确保auditctl -l
返回任何内容,即使它说未定义任何规则。
然后,添加一条规则以监视系统调用socket()
并对其进行标记,以方便日后查找(-k
)。我需要假设您使用的是64位体系结构,但如果不是b32
,b64
则可以代替。
auditctl -a exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET
您必须仔细阅读手册页和头文件来构建它,但是它捕获的实际上是这个系统调用:socket(PF_INET, SOCK_DGRAM|X, Y)
,其中第三个参数未指定,但通常为零。 PF_INET
是2和SOCK_DGRAM
2。TCP连接将使用SOCK_STREAM
set a1=1
。(SOCK_DGRAM
第二个参数可能与SOCK_NONBLOCK
或进行OR运算SOCK_CLOEXEC
,因此进行&=
比较。)这-k SOCKET
是我们稍后在搜索审计跟踪时要使用的关键字。可以是任何东西,但我想保持简单。
稍等片刻,查看审核记录。(可选)您可以通过对网络上的主机进行ping操作来强制发送几个数据包,这将导致发生使用UDP的DNS查找,这将使我们的审核警报失效。
ausearch -i -ts today -k SOCKET
并出现类似于以下部分的输出。我将其缩写以突出显示重要部分
type=SYSCALL ... arch=x86_64 syscall=socket success=yes exit=1 a0=2 a1=2 ... pid=14510 ... auid=zlagtime uid=zlagtime ... euid=zlagtime ... comm=ping exe=/usr/bin/ping key=SOCKET
在上面的输出中,我们可以看到该ping
命令导致套接字被打开。然后strace -p 14510
,如果该进程仍在运行,则可以对其进行运行。该ppid
(父进程ID)的情况下还列出这是一个脚本,产卵孩子问题很多。
现在,如果您有很多UDP流量,那么这将不够好,您将不得不使用OProfile或SystemTap,这两种方法目前都超出了我的专业知识。
在一般情况下,这应该有助于缩小范围。
当您完成后,删除使用您用来创建它的同一行的审核规则,只替换-a
用-d
。
auditctl -d exit,always -F arch=b64 -F a0=2 -F a1\&=2 -S socket -k SOCKET