简介
在服务器安全中,「攻击面」是指未经授权的用户可以尝试进入系统或提取数据的所有入口点。管理网络端口是减少攻击面的重要措施。
每个开放端口都可能成为攻击者的入口。如果某项服务正在某个端口上监听,就表示它已准备好接收数据。如果该服务存在漏洞,或者不应该对外公开访问,系统就会面临风险。
监听端口并不自动意味着存在危险,但它确实表示系统存在暴露面。安全审计首先要确认哪些服务可以被访问,以及这种暴露是否符合预期。
因此,端口审计是基础加固工作的一部分。良好的安全措施不仅包括修补软件漏洞,还包括减少不必要的暴露。
在本实验中,你将执行一次基础安全审计,具体包括:
- 使用
ss命令列出所有监听中的 TCP 端口。 - 识别可疑或非标准端口。
- 调查负责打开端口的进程和用户。
列出监听中的 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。在实际场景中,如果你没有授权启动这项服务,就应该立即终止该进程。
最后这一步是确定责任归属:不仅要知道「哪个端口开放」,还要知道「哪个用户通过哪条命令启动了哪个进程,从而造成了这项网络暴露」。这正是端口审计能够用于事件响应和系统加固的原因。
总结
在本实验中,你已成功完成对系统监听端口的安全审计。
要点回顾:
- 获取可见性:使用
sudo ss -lntp,准确查看哪些服务正在等待连接。 - 识别端口:识别标准端口,并将非标准端口(例如 9999)标记出来进行调查。
- 确定责任归属:使用
ps -f -p <PID>,确定哪个用户和哪条命令负责创建可疑套接字。
定期执行审计可以帮助你发现未经授权的服务(例如后门或其他 Web 服务器),并在它们被利用前将其移除。



