我管理的这台服务器会定期(每分钟几次)尝试通过 tcp 端口 22 连接另一台机器。(ssh)
我的问题:我如何才能找到产生此连接的过程?
我已经检查了什么:
以太网接口上的 tcpdump 捕获 + 馈送到 wireshark => 结果并不那么有趣,除了它似乎是一个标准加密的 SSH 连接,流的重组并没有给我有用的信息,因为它(当然)是加密的。
lsof 脚本:我将 lsof 已知的所有文件访问转储到一个文件中,每次运行间隔 1 秒,共约 60 次。我可以在日志文件中看到连接设置,但在它周围,我没有发现任何有用的信息:
... ssh 8478 root 3u IPv4 945966 TCP servername:randomport->destinationserver:ssh (ESTABLISHED) ...
它看起来属于 root 用户。重复了几次该过程,但没有识别出任何有趣的东西。
netstat 显示:(netstat -ntap)
tcp 0 0 servername:randomport destinationserver:22 TIME_WAIT - tcp 0 0 servername:randomport destinationserver:22 TIME_WAIT -
当我记录足够多的迭代次数时,我发现它每分钟下降到一次 time_wait cnx 然后又回到 2 次。
- crontabs:
对于启动某些 ssh cnx 的任何用户,均找不到 crontab,/etc/cron* 文件和目录中没有任何关于 ssh 的信息
- 启动 auditd
添加了此规则:
auditctl -a exit,always -F arch=b64 -S connect -k MYCONNECT
除了它看起来确实像具有相同源和目标 IP 等的 ssh 连接之外,什么也没学到。
- 目标服务器不在我的控制之下,但管理它的人向我展示了一个日志,它看起来像一个 ssh cnx,它无法通过公钥身份验证,目标机器上根本没有放置任何密钥。这个目标服务器是一个类似于 Linux 的存储设备(但实际上不是)。
我不知道这个是从哪里来的。
如果我找不到这些无用连接的来源,我至少可以使用 iptables 来阻止它们,但这当然不是那么好。
谢谢任何提示。
答案1
我很想使用 auditd 来(简要地)收集有关任务创建的信息,看看我是否可以从中恢复过来
auditctl -D
auditctl -a task,always
然后仔细查看结果
ausearch -i -sc execve
此外 lsof 还提供了 PID,因此你可以尝试
ps -p <PID> -o ppid=
答案2
可以尝试的一件事是将包装器脚本放在标准 ssh 二进制文件周围,并让该包装器脚本记录 ID 和时间。这只是我脑海中的想法,所以可能需要一些工作。
mv /usr/bin/ssh /usr/bin/ssh.real
代替
在 /usr/bin/ssh 中
使用这个脚本:
#!/usr/bin/perl
use Sys::Syslog; # all except setlogsock()
use Sys::Syslog qw(:standard :macros); # standard functions & macros
openlog('ssh', "ndelay,pid", "auth"); # or whatever is appropriate other than auth
syslog('info',"started by $ENV{'USER'}");
exec '/usr/bin/ssh.real', @ARGV;