检查监听端口以进行安全审计

LinuxBeginner
立即练习

简介

在服务器安全中,「攻击面」是指未经授权的用户可以尝试进入系统或提取数据的所有入口点。管理网络端口是减少攻击面的重要措施。

每个开放端口都可能成为攻击者的入口。如果某项服务正在某个端口上监听,就表示它已准备好接收数据。如果该服务存在漏洞,或者不应该对外公开访问,系统就会面临风险。

监听端口并不自动意味着存在危险,但它确实表示系统存在暴露面。安全审计首先要确认哪些服务可以被访问,以及这种暴露是否符合预期。

因此,端口审计是基础加固工作的一部分。良好的安全措施不仅包括修补软件漏洞,还包括减少不必要的暴露。

在本实验中,你将执行一次基础安全审计,具体包括:

  1. 使用 ss 命令列出所有监听中的 TCP 端口。
  2. 识别可疑或非标准端口。
  3. 调查负责打开端口的进程和用户。

列出监听中的 TCP 端口

第一步是全面了解当前网络状态。我们将使用 ss(Socket Statistics)命令。它是旧版 netstat 工具的现代化替代方案,速度更快。

为了执行审计,我们需要重点查看监听中的 TCP 端口以及打开这些端口的进程。

进程信息可以把原始的套接字列表转化为可处理的信息。单独查看端口号很难判断其用途,但将端口关联到具体进程和用户后,你就可以进一步评估和管理它。

运行以下命令:

sudo ss -lntp

选项说明:

  • -l(listening):只显示正在等待连接的套接字。
  • -n(numeric):显示 IP 地址和端口号,而不是主机名,速度更快且更清晰。
  • -t(tcp):只显示 TCP 套接字。
  • -p(processes):显示使用该套接字的进程名称和 PID(进程 ID)。
    • 注意:如果要查看属于其他用户的服务的进程信息,就必须使用 sudo。

你应该会看到类似下面的输出:

State    Recv-Q   Send-Q     Local Address:Port      Peer Address:Port   Process
LISTEN   0        4096       127.0.0.1:8080          0.0.0.0:*           users:(("node",pid=123,fd=18))
LISTEN   0        5          0.0.0.0:9999            0.0.0.0:*           users:(("python3",pid=456,fd=3))
LISTEN   0        128        0.0.0.0:22              0.0.0.0:*           users:(("sshd",pid=789,fd=3))

Local Address:Port 列显示服务在哪个地址和端口上监听。Process 列标识负责该监听端口的程序。

还要注意地址是 127.0.0.1 还是 0.0.0.0。仅限本地主机访问的服务只暴露在当前计算机上,而 0.0.0.0 通常表示服务正在所有网络接口上监听。

识别可疑端口

现在,分析命令输出,找出任何异常情况。

标准服务通常使用「知名端口」(0-1023)。例如:

  • 端口 22:SSH(Secure Shell)
  • 端口 80:HTTP(Web 服务器)
  • 端口 443:HTTPS(安全 Web 服务器)

执行安全审计时,要重点关注非标准端口或你不认识的服务。

目标不是看到每个陌生端口都惊慌,而是确认它的用途。某项服务可能是合法的、临时的,也可能是误启动的;审计就是将未知的暴露面确认成已知的暴露面。

查看步骤 1 中的输出。你应该会看到一个正在端口 9999上监听的服务。这个端口不是标准系统端口,需要进一步调查。

使用 grep 筛选出该条目:

sudo ss -lntp | grep 9999

示例输出:

LISTEN 0      5            0.0.0.0:9999       0.0.0.0:*    users:(("python3",pid=289,fd=3))

这表示端口 9999 上确实有一个进程正在运行。接下来,我们将准确确认它是什么进程。

调查进程所有权

知道某个端口已开放还不够。你必须确认是谁在运行这项服务。以 root 身份运行的可疑进程属于严重紧急情况,而以受限用户身份运行的进程风险可能较低(但仍然危险)。

查找 PID:查看上一个命令的输出。在 users: 部分找到 pid=... 值。

  • 示例:users:(("python3",pid=289,fd=3)) -> PID 是 289。
  • 注意:你的 PID 可能不同。

检查进程:使用 ps 命令列出这个 PID 对应的详细信息。将 <PID> 替换为你找到的实际数字。

ps -f -p <PID>

例如,如果 PID 是 289:

ps -f -p 289

分析输出:

UID          PID    PPID  C STIME TTY          TIME CMD
labex        289    189   0 10:00 pts/0    00:00:00 python3 -m http.server 9999
  • UID:运行该进程的用户,例如 labex。
  • CMD:启动该进程的完整命令,例如 python3 -m http.server 9999。

这表示用户 labex 启动了一个 Python HTTP 服务器,并且该服务器明确设置为监听端口 9999。在实际场景中,如果你没有授权启动这项服务,就应该立即终止该进程。

最后这一步是确定责任归属:不仅要知道「哪个端口开放」,还要知道「哪个用户通过哪条命令启动了哪个进程,从而造成了这项网络暴露」。这正是端口审计能够用于事件响应和系统加固的原因。

总结

在本实验中,你已成功完成对系统监听端口的安全审计。

要点回顾:

  1. 获取可见性:使用 sudo ss -lntp,准确查看哪些服务正在等待连接。
  2. 识别端口:识别标准端口,并将非标准端口(例如 9999)标记出来进行调查。
  3. 确定责任归属:使用 ps -f -p <PID>,确定哪个用户和哪条命令负责创建可疑套接字。

定期执行审计可以帮助你发现未经授权的服务(例如后门或其他 Web 服务器),并在它们被利用前将其移除。