我有一台 LAMP Ubuntu 10.04 服务器。有许多(>140)用户和许多不同的 PHP 网站(自定义、不同的 PHP 框架、CMS 等)。
问题是:有时服务器会发送“垃圾邮件”。本地进出口银行不用于此目的。我发现了如下奇怪的活动:
/usr/bin/lsof -ni | grep smtp |grep -v ^exim4
perl 15177 www-data 510u IPv4 1101127040 0t0 TCP server_ip:46401->65.55.37.72:smtp (SYN_SENT)
perl 15178 www-data 510u IPv4 1101127059 0t0 TCP server_ip:51002->98.136.217.202:smtp (SYN_SENT)
perl 15179 www-data 510u IPv4 1101126982 0t0 TCP server_ip:39232->74.125.205.26:smtp (SYN_SENT)
perl 15180 www-data 510u IPv4 1101126975 0t0 TCP server_ip:53339->65.55.37.72:smtp (SYN_SENT)
perl 15181 www-data 510u IPv4 1101127014 0t0 TCP server_ip:45429->65.55.37.72:smtp (SYN_SENT)
perl 15182 www-data 510u IPv4 1101126984 0t0 TCP server_ip:49985->74.125.205.26:smtp (SYN_SENT)
perl 15183 www-data 510u IPv4 1101126971 0t0 TCP server_ip:42199->65.55.37.72:smtp (SYN_SENT)
..........
...........
perl 15184 www-data 510u IPv4 1101126968 0t0 TCP server_ip:36641->74.125.205.26:smtp (SYN_SENT)
perl 15186 www-data 510u IPv4 1101126979 0t0 TCP server_ip:57690->98.138.112.32:smtp (SYN_SENT)
...........
我无法发现谁运行这些 Perl 进程或它们是如何运行的。我尝试分析这些进程(例如 pid 15179): /proc/15179/cmdline - 为空
/proc/15179/status
Name: perl
State: S (sleeping)
Tgid: 15179
Pid: 15179
PPid: 15176
TracerPid: 0
Uid: 33 33 33 33
Gid: 33 33 33 33
FDSize: 1024
Groups: 33
VmPeak: 10400 kB
VmSize: 10372 kB
VmLck: 0 kB
VmHWM: 8140 kB
VmRSS: 8092 kB
VmData: 6980 kB
VmStk: 88 kB
VmExe: 1200 kB
VmLib: 1980 kB
VmPTE: 32 kB
Threads: 1
SigQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000080
SigCgt: 0000000180017427
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed: f
Cpus_allowed_list: 0-3
Mems_allowed: 1
Mems_allowed_list: 0
voluntary_ctxt_switches: 6431
nonvoluntary_ctxt_switches: 34
lsof -n -p 15179 - 这里 在此输入链接描述
我试图找到父进程:15179的父进程pid是15176:
/proc/15176/cmdline - 也为空
和
/proc/15176/status
Name: perl
State: S (sleeping)
Tgid: 15176
Pid: 15176
PPid: 1
TracerPid: 0
Uid: 33 33 33 33
Gid: 33 33 33 33
FDSize: 1024
Groups: 33
VmPeak: 11116 kB
VmSize: 11116 kB
VmLck: 0 kB
VmHWM: 8712 kB
VmRSS: 8692 kB
VmData: 7772 kB
VmStk: 88 kB
VmExe: 1200 kB
VmLib: 1940 kB
VmPTE: 32 kB
Threads: 1
SigQ: 0/16382
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000010080
SigCgt: 0000000180007427
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed: f
Cpus_allowed_list: 0-3
Mems_allowed: 1
Mems_allowed_list: 0
voluntary_ctxt_switches: 14467
这种情况很少发生(每两天一次)并且持续几分钟。因此很难获得更多信息。所有这些信息均使用监控 smtp 连接的 cron 作业记录。我不知道如何识别谁运行这些进程或它们是如何运行的。有什么策略可以找到他们吗?
答案1
您显示的数据已经包含很多信息:用户的UID是33,在我的系统上对应于www-数据,我认为这很可能同样适用于您的系统,因为您显示的套接字属于www-数据。
另外,我怀疑命令行会给你带来更多信息:perl程序的PPID是15176,但是15176的PPID是1(IE,在里面)。这中间没有 shell,也没有会话。
所联系的 IP 地址并不是特别令人担忧:它们属于微软和谷歌,而这些人知道如何保护自己。
那么,犯规行为的证据在哪里呢?我同意连接的 SYN_SENT 状态确实值得关注,因为这意味着您的连接尚未收到正确的 SYN/ACK,并且您处于挂起状态。
那么,您可以做什么来挖掘更多信息呢?您无法尝试直接识别用户:您的帖子已经表明该用户是www-数据,并且该进程不直接连接到终端或会话。
但你首先可以确定你的IP是否被列入黑名单,例如这里:如果是,那就是垃圾邮件的证据。
其次,您应该检查邮件程序的日志,是否有任何异常情况:站点拒绝连接,因为您位于黑名单中,来自同一站点的多个连接,被用作中继的证据,......
第三,您可以使用以下方式监控您的端口
ss -lntp
这会告诉您在任何给定时刻使用 (TCP) 端口的进程的 pid,并再次检查多个连接。您可以将上述命令编写为每秒重复一次,并存储其输出(也许与用户)和时间戳,以了解有关可疑连接时发生的情况的更多信息。这可以是互相关的尸检用户已登录或连接到您的站点。
有关更多信息,您可以简单地将所有数据包转储到经常出现的 Microsoft 站点,例如
nohup tcpdump -n -i eth0 host 65.52.0.0/14 -w outfile &
IP 地址范围是属于 Microsoft 的整个块,根据输出世界卫生组织 65.55.37.72;上面的命令可能会生成相当多的输出,因此准备好磨练您过滤表达式的技能线鲨。
如果所有这些都失败了,请准备好强制您的用户更改密码。
答案2
只是一个想法。 Grep 浏览您的 apache 日志。如果您有时间,当邮件发送后,很容易找到它们。特别寻找 perl 脚本。
答案3
获取用户
通常是uid字段显示uid启动该进程的用户的。
在你的情况下,这将是 iser 与uid 33
。
用于getent passwd 33
查看用户的名称。
追踪用户
您可以使用一个小的 C 守护进程轻松监视和记录用户的活动,
使用这/proc/pid/status
用于读取文件并在用户之后进行搜索的小库。
这可以帮助您避免服务器运行时出现问题。
(你也可以让守护进程处理kill
这些进程)