服务器公网部署的本质,是把一台计算设备直接暴露在充满扫描探测的公共网络空间。从你完成系统安装、配置好公网IP的那一刻起,这台机器就已经进入了每分钟承受数十次甚至上百次自动化扫描的环境。这些扫描并非都是定向攻击,更多是蠕虫式、批量化、全端口段的探测行为,它们寻找的是最常见、最容易利用的配置疏忽。安全排查不能停留在“我觉得没问题”的层面,必须逐项验证、逐层深入。
SSH服务暴露面与认证策略核查SSH是公网服务器管理的主要入口,也是暴力破解的首要目标。首先要检查的是SSH服务是否还运行在默认的22端口。修改为非标准高端口(如50022)能过滤掉90%以上的自动化扫描噪音,但这只是第一步。更关键的是禁用密码登录,强制使用密钥认证。在配置文件/etc/ssh/sshd_config中,必须确认PasswordAuthentication设置为no,ChallengeResponseAuthentication设置为no,同时PubkeyAuthentication设置为yes。修改后需要检查PermitRootLogin的状态,直接禁止root远程登录是最佳实践,设置PermitRootLogin no,日常管理通过普通用户sudo提权完成。还有一个常被忽略的细节是SSH协议版本,必须确保Protocol 2是唯一启用的协议,旧版本存在已知加密缺陷。空密码账户、系统默认存在的低权限测试账户,都要通过awk -F: '($2==""){print $1}' /etc/shadow命令排查一遍,确认没有任何账户可以无密码登录。
防火墙策略与端口暴露范围审查很多运维人员配置完防火墙后就不再复查,这很危险。公网服务器上运行着哪些服务,就应该只开放哪些端口,而且必须精确到来源IP范围。使用iptables或firewalld时,先执行iptables -L -n或firewall-cmd --list-all查看当前规则集,检查是否存在大段放行规则,比如源地址0.0.0.0/0的放行。对于数据库类的服务,如MySQL的3306、Redis的6379、MongoDB的27017,绝对不应该直接对公网开放。如果必须远程管理数据库,应该通过SSH隧道转发,或者配置白名单IP访问。排查时可以用netstat -tlnp或ss -tlnp列出所有监听中的TCP端口,逐一核对每个监听在0.0.0.0上的端口是否都有明确的业务必要性。监听在127.0.0.1上的服务是安全的,但监听在0.0.0.0上的服务会直接暴露给公网。对于UDP端口同样不能忽视,DNS、NTP等服务可能被利用进行放大攻击,需要用netstat -ulnp检查UDP监听情况。
系统用户与权限体系深度检查账户体系是权限漏洞的重灾区。首先要检查/etc/passwd中UID为0的用户,正常情况下只有root一个,执行awk -F: '($3==0){print $1}' /etc/passwd可以列出所有特权账户。接着检查/etc/sudoers文件,确认哪些用户拥有sudo权限,以及权限范围是否过大。特别要注意NOPASSWD选项,它允许无密码执行sudo命令,一旦普通账户被攻破,攻击者可以直接提权。还要检查SUID和SGID文件,这些文件执行时会以文件所有者的权限运行,是本地提权的常见利用点。使用find / -perm -4000 -type f 2>/dev/null查找所有SUID文件,逐一确认其必要性。对于不需要SUID位的程序,可以用chmod u-s去除。同样,全局可写目录和文件也是隐患,find / -perm -2 -type d 2>/dev/null可以找出这类目录,重点关注/tmp、/var/tmp等临时目录的粘滞位是否设置正确。
运行服务与进程完整性校验每台公网服务器都应该有一份明确的服务清单,任何不在清单内的进程都值得怀疑。执行ps aux或ps -ef获取完整进程列表,逐项核对每个进程的启动命令、所属用户和运行参数。重点关注那些以root身份运行但又没有明确业务用途的进程,以及监听网络端口的进程。对于Web服务,要检查其运行用户是否为低权限的www-data或nginx,而不是root。数据库进程同样应该以专用用户身份运行。还要检查进程的启动方式,是通过systemd管理的服务,还是通过crontab定时任务拉起,抑或是某个终端会话中的手动启动。crontab是持久化后门的常见藏身之处,需要检查/etc/crontab、/var/spool/cron/目录下所有用户级crontab,以及/etc/cron.*目录中的脚本,确认每一项定时任务的内容都是已知且必要的。
Web应用与中间件配置安全排查如果服务器运行着Web应用,这部分是攻击面最大的区域。首先检查Web服务器是否暴露了版本信息,Nginx中需要确认server_tokens off,Apache中需要设置ServerTokens Prod和ServerSignature Off。目录浏览功能必须关闭,Nginx中检查autoindex是否设置为off,Apache中检查Options指令是否包含Indexes。对于PHP应用,需要检查php.ini中的危险函数禁用情况,disable_functions列表中至少应该包含exec、system、passthru、shell_exec、popen、proc_open等命令执行函数。allow_url_fopen和allow_url_include应该设置为Off,防止远程文件包含漏洞。文件上传目录必须禁止脚本执行,可以在Nginx配置中对该目录单独设置location规则,去掉PHP解析权限。还要检查应用中是否存在遗留的调试文件、备份文件(如.bak、.swp、~结尾的文件)、phpinfo页面等敏感信息泄露点。数据库连接配置文件是否设置了适当的文件权限,避免被Web用户读取后泄露密码。
日志审计与入侵痕迹回溯安全排查不能只看当前状态,还要从日志中寻找已经发生的入侵迹象。首先确认审计框架auditd是否在运行,它可以记录系统级别的关键操作。然后重点分析/var/log/secure或/var/log/auth.log中的认证日志,查找是否存在大量失败的SSH登录尝试,以及是否有来自异常地理位置的IP成功登录的记录。last命令可以列出最近登录的用户和时间,lastb列出失败登录记录,lastlog显示所有用户的最后登录时间。如果发现有长期未使用的账户突然登录,或者登录时间与正常业务时间不符,需要立即深入调查。/var/log/messages或syslog中可能包含内核级别的异常信息,如OOM、segfault等。Web服务器的访问日志和错误日志也需要检查,关注是否存在大量404请求(可能是目录扫描)、POST请求到异常路径、以及User-Agent中包含扫描器特征字符串的请求。如果服务器上安装了fail2ban之类的入侵防御工具,检查其日志可以看到哪些IP被临时封禁,这些IP往往是攻击源。
软件供应链与依赖组件漏洞排查操作系统和第三方组件的已知漏洞是攻击者最常用的突破口。首先要确认系统的包管理器配置是否正确,软件源是否来自官方。执行一次完整的系统更新检查,确认当前运行的内核版本和关键系统库版本。对于使用apt的系统,可以运行apt list --upgradable查看可更新包列表;对于yum系统,使用yum check-update。重点关注那些标记为security的更新。Web应用所依赖的框架和库同样需要版本核查。如果使用的是PHP,可以通过composer的audit命令检查依赖漏洞;Node.js项目使用npm audit;Python项目使用pip audit或safety check。这些命令会列出已知的CVE漏洞及其严重程度。对于直接下载部署的二进制程序,需要手动确认版本号并查阅官方安全公告。一个常见的疏忽是,服务器上安装的某些辅助工具(如imagemagick、ffmpeg等媒体处理库)长期不更新,而这些组件历史上多次出现过远程代码执行漏洞。
内核参数与网络安全加固验证操作系统内核参数直接影响网络层面的抗攻击能力。检查/etc/sysctl.conf或/etc/sysctl.d/目录下的配置文件,确认是否启用了SYN Cookie防护(net.ipv4.tcp_syncookies=1),这可以防御SYN Flood攻击。确认是否禁用了ICMP重定向接受(net.ipv4.conf.all.accept_redirects=0),防止中间人路由欺骗。确认是否开启了IP源路由验证(net.ipv4.conf.all.rp_filter=1),这可以防止IP地址欺骗攻击。对于IPv6,如果服务器实际不使用,应该在sysctl中彻底禁用(net.ipv6.conf.all.disable_ipv6=1),避免通过IPv6绕过IPv4的防火墙规则。还要检查/etc/hosts.allow和/etc/hosts.deny文件是否存在,虽然现在多由防火墙替代,但某些系统服务仍然会参考这两个文件的TCP Wrapper规则,确保其中没有意外的放行规则。
数据备份与应急响应准备度评估安全排查的最后一步是确认出事后能否快速恢复。检查是否存在定期的自动备份机制,备份内容是否包含数据库、配置文件、用户数据等关键资产。备份文件的存储位置是否与生产服务器分离,如果备份也放在同一台机器上,勒索软件会一并加密。验证最近一次的备份是否真的可以恢复,而不是仅仅检查备份脚本是否运行过。很多团队在灾难发生时才发现备份文件损坏或者备份内容不完整。同时检查是否有应急响应预案,关键服务的启动脚本、配置文件是否纳入了版本控制,以便在服务器被入侵后能够快速重建环境。检查系统中是否安装了文件完整性监控工具,如aide或tripwire,它们可以在文件被篡改时发出告警,为入侵检测提供关键线索。
