Linux服务器暴露面盘点该从哪几个命令入手
Linux 安全基线检查为什么别追求一次做完:先抓高价值项
说起盘点linux服务器暴露面,很多人第一反应是装个扫描器跑一圈,结果扫出来一堆端口和服务,却说不清哪些是业务刚需、哪些是历史欠账。其实真正高效的盘点,靠的不是什么花哨工具,而是几个关键命令的组合——它们能帮你把一台主机的“底裤”翻个底朝天。
端口和服务:先看谁在门外站岗
暴露面最直观的就是端口。ss -tlnp 是首选,它比 netstat 更快、更准,直接列出所有处于 LISTEN 状态的 TCP 端口和对应的进程 PID。加上 -u 还能看 UDP。重点不是数端口数量,而是看每个端口绑定的 IP 是 0.0.0.0 还是具体内网地址——前者意味着任何网络接口都能访问,暴露面直接拉满。配合 lsof -i :端口号 能确认进程路径,比如发现一个 Java 进程开了 8080 端口,但业务负责人早就离职了,这端口就该标记成“无人认领”。
服务层面,systemctl list-units --type=service --state=running 能列出所有正在运行的服务单元。注意那些名字里带 @ 的模板服务,比如 sshd@.service,它们可能被多个实例复用。更隐蔽的是 chkconfig --list 或 systemctl list-unit-files 里状态为 enabled 但当前没运行的服务——它们虽然没跑,但下次重启就会自动启动,属于“潜伏暴露面”。
自启动和计划任务:那些没人记得的“自动档”
systemctl list-unit-files --type=service --state=enabled 能列出所有开机自启的服务。但别漏了 /etc/rc.local、/etc/init.d/ 下的旧脚本,还有 crontab -l 和 /var/spool/cron/ 下各用户的 crontab 文件。这里有个坑:很多团队习惯把定时任务写在 /etc/crontab 或 /etc/cron.d/ 里,但运维人员离职后这些文件就没人维护了。我曾见过一台跑了三年的 NFS 服务器,/etc/cron.daily/ 里还挂着一条向已废弃的 FTP 服务器同步数据的脚本,端口和防火墙规则早就变了,但脚本每天还在尝试连接——这就是典型的“僵尸任务”。
外联和网络路径:谁在偷偷往外跑
暴露面不光是进来的,还有出去的。ss -tunp | grep ESTAB 能看当前活跃的外联连接,重点检查目标 IP 是否属于已知的公网地址或云服务商。配合 tcpdump -i any host 目标IP 可以抓包确认流量特征。更系统的方法是看 /proc/net/tcp 和 /proc/net/udp,解析出所有连接状态,再和业务白名单比对。比如发现一台数据库服务器频繁连接一个非标准端口的外部 IP,大概率是被人植入了后门或者数据外泄。
ip route show 和 ip rule show 能暴露路由策略和策略路由,比如有没有指向公网的默认路由、有没有额外的路由表把流量引向异常网关。这些在容器化环境里尤其容易乱——Docker 或 Kubernetes 的网络插件可能会创建大量 iptables 规则和路由条目,如果不定期清理,很容易出现“本应隔离的容器网络却意外暴露到外网”的情况。
用户和认证:谁有钥匙
cat /etc/passwd | grep -E '/bin/bash|/bin/sh' 能列出所有可登录用户,但更关键的是看 /etc/sudoers 和 /etc/sudoers.d/ 下的规则。sudo -l -U 用户名 可以检查某个用户实际能执行哪些命令。注意那些 NOPASSWD 标记的规则——它们意味着用户不需要密码就能提权,一旦账号被攻破,攻击者可以直接 root。还有 /home/*/.ssh/authorized_keys 里的公钥,很多团队习惯把运维机器的公钥散落在各台服务器上,离职后也不回收,这些公钥就是潜在的“万能钥匙”。
日志和审计:暴露面的“监控摄像头”
最后别忘了 journalctl 和 /var/log/secure。journalctl -u sshd --since "1 month ago" | grep "Failed password" 能看出暴力破解的频率,如果某个 IP 在短时间内尝试了几千次,说明它已经被扫描器盯上了。ausearch -m USER_LOGIN -ts recent 能审计所有用户登录事件,包括失败的。这些日志虽然不直接算暴露面,但它们能告诉你哪些暴露面正在被利用。
说到底,盘点暴露面不是一次性工作,而是建立“主机身份档案”的过程。每次用命令查到的结果,都应该记录到端口清单、服务台账、任务白名单里。下次再有人问“这台服务器到底开了什么”,你不需要再重新跑一遍命令,直接翻台账就行。这才是真正能落地的治理。

参与讨论
ss -tlnp 这个命令确实好用,比netstat直观多了