ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

网络安全:给你的云主机做一次体检

网络安全:给你的云主机做一次体检 把一台服务器放上公网的那一刻起它就不再是你一个人的电脑了。只要有一个公网 IP全网的扫描器就会轮番敲门探测 SSH 弱口令的、扫 WordPress 后台的、找 Tomcat 管理页的、尝试注入和路径穿越的……一台普通的个人服务器HTTP 请求里 40% 以上是恶意流量属于常态——这不是危言耸听是任何一台公网主机的日常背景噪音。噪音本身不可怕可怕的是分不清“背景噪音”和“已经出事”。这篇文章带你做一次系统性的安全体检五个视角、十项检查每一项都回答三个问题——为什么要查、看什么数据、看到什么该拉响警报。体检的总纲只有一句话拿“现在的状态”对比“应有的基线”找差异。你不需要记住几千种攻击手法只需要知道自己的服务器“正常时长什么样”凡是偏离基线的都值得多看一眼。下面所有检查命令都是只读的不会改变系统状态可以放心执行。## 一、账号与登录进没进来攻击链的第一环几乎总是这里——SSH 是公网主机暴露面最大的服务。### 检查项 1SSH 登录审计为什么查SSH 是攻击者的头号目标。22 端口或你改过的任何端口每天都在被人尝试爆破。你要区分三种状态正在被爆破常态噪音、爆破失败99.99% 的情况、以及爆破成功或陌生登录真正的灾难。**看什么数据**CentOS/RHEL 系日志在 /var/log/secureUbuntu/Debian 在 /var/log/auth.logbash# 谁成功登录过、何时登录、在线多久读 /var/log/wtmplast -20# 失败登录有多少读 /var/log/btmp——爆破噪音的直观体现lastb | head -20lastb | wc -l# 所有成功的登录记录逐条核对来源 IPgrep Accepted /var/log/secure***危险信号**危险信号Accepted password ... from 陌生IP——最高危。如果你早已改用密钥登录任何Accepted password都不该出现Accepted记录的来源 IP 不属于你公司、家里、常用 VPN 出口或登录时间在你的作息之外比如凌晨 3 点成功登录之后紧跟crontab、systemctl、useradd类操作——不是你干的就是别人在装后门lastb | wc -l一天数万条——说明被爆破是事实虽不等于失守但你必须尽快关掉密码登录见文末加固清单。**防误报提示**如果你用云厂商控制台的一键登录 / Workbench会话里会出现厂商注入的**临时密钥**登录记录来源是云控制台网段。特征是指纹首次出现和最后出现都在同一天。这类记录不是入侵——**判断登录是否异常永远核对来源 IP 和时间而不是看到陌生记录就恐慌**。### 检查项 2特权账户**为什么查**攻击者拿到 shell 后的第一件事往往就是给自己建一个方便的门——新增一个 UID 为 0 的账户Linux 里 UID 0 就是 root可以不止一个或把自己加进 sudoers。这是最经典的账号后门。**看什么数据**bash# UID 为 0 的账户——正常情况下只有 root 一行awk -F: ($3 0) {print} /etc/passwd# 最近新增的、带可登录 shell 的账户正常服务器很少加人tail -10 /etc/passwdawk -F: ($7 !~ /nologin|false/) {print $1} /etc/passwd# sudo 提权配置里有没有陌生的授权cat /etc/sudoersls -la /etc/sudoers.d/ cat /etc/sudoers.d/***危险信号**- UID 0 的账户多于一个- /etc/passwd 末尾出现你不认识的账户尤其 shell 是 /bin/bash、用户名还伪装成系统账户的如 sys、postgres1- sudoers 里出现 ALL(ALL) NOPASSWD: ALL 的陌生条目- /etc/shadow 的修改时间很新但你最近没改过任何密码。### 检查项 3authorized_keys**为什么查**比加账户更隐蔽的后门是加公钥——一行 base64谁能想到呢。很多自动化蠕虫如 Outlaw、kworkds 家族入侵后的标准动作就是往 root 的 authorized_keys 里追加自己的密钥即使你改了密码它照样能进。**看什么数据**bash# 每个可登录用户的公钥文件逐行核对for u in root $(awk -F: ($7 !~ /nologin|false/) {print $1} /etc/passwd); dof$(eval echo ~$u)/.ssh/authorized_keys[ -f $f ] echo $u: $f cat $fdone# 看每把 key 的指纹和类型陌生指纹一目了然ssh-keygen -lf /root/.ssh/authorized_keys**危险信号**- 公钥行数比你印象中多应该等于你自己维护的密钥数量一行为一把- 出现陌生的 key 类型 注释行尾的 userhost——比如你全用 ED25519却混进来一把 RSA注释是乱码或陌生主机名- 文件修改时间在你上次部署之后。## 二、持久化机制留没留后门聪明的攻击者不依赖下次还能爆破成功他会让服务器**自己定时把他请回来**。### 检查项 4cron 与 systemd 定时任务**为什么查**定时任务和 systemd 服务是 Linux 上最常用的两大持久化手段。挖矿木马靠 cron 保活DDoS 木马靠 systemd timer 定期拉起。这里也是看数据最需要细心的地方——因为恶意任务总是伪装成正常任务。**看什么数据**bash# root 与所有用户的 crontabcrontab -lfor u in $(cut -d: -f1 /etc/passwd); do crontab -u $u -l 2/dev/null | grep -v ^# | sed s/^/$u: /; done# 系统级 cron 落点ls -la /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/ /var/spool/cron/# systemd 定时器与陌生服务systemctl list-timers --allls -la /etc/systemd/system/ | grep -vE wants|\.target**危险信号**- 任务命令里出现 wget http://... | bash、curl -s ...|sh——从外部地址拉脚本执行几乎没有正当理由- 命令是长串 base64echo xxx... | base64 -d | bash——典型的免杀混淆- 执行体落在 /tmp、/dev/shm、/root/.开头的隐藏目录- 一个你没部署过的 .service / .timer描述写着 system update 之类的话术- 每 1–5 分钟跑一次的高频任务——正常运维任务极少这个频率保活型后门却很常见。### 检查项 5/etc 近期改动**为什么查**/etc 是系统配置的心脏。攻击者会改 SSH 配置给自己留门、改 rc.local 实现开机启动高级一点的会利用 ld.so.preload 劫持动态链接库rootkit 的经典手法让你 ls、ps 都看不到它。**看什么数据**bash# 最近 7 天 /etc 下被改动的文件逐个回忆是不是自己改的find /etc -type f -mtime -7 | sort# 重点文件的当前状态ls -la /etc/ld.so.preload /etc/rc.local 2/dev/nullgrep -E PermitRootLogin|PasswordAuthentication|AuthorizedKeysFile|Port /etc/ssh/sshd_config**危险信号**- /etc/ld.so.preload **存在**——绝大多数干净系统上没有这个文件存在即高度可疑除非你自己配过性能探针- sshd_config 被改回 PermitRootLogin yes / PasswordAuthentication yes或多了陌生的 AuthorizedKeysFile 指向奇怪路径- rc.local、rc.d/ 里出现下载、解压、执行三连- find 结果里有文件你完全对不上号的结合下一条的文件篡改检查一起看。## 三、进程与运行时正在干什么前两组检查看的是门这一组看的是屋里有没有人。### 检查项 6可疑进程与资源占用**为什么查**服务器被入侵后最常见的目的不是搞破坏而是**借你的电费赚钱**——挖矿。挖矿进程的第一个特征就是 CPU 拉满。另外CPU 持续 100% 也可能是业务自己出了问题两种情况都值得查但处理方式完全不同。**看什么数据**bash# 按 CPU 排序看进程树-f 可以看到父子关系谁拉起了谁top -bn1 | head -25ps auxf --sort-%cpu | head -30# 对可疑进程可执行文件到底在哪正文里看到的进程名是可以伪造的ls -l /proc/PID/execat /proc/PID/cmdline | tr \0 **危险信号**- CPU 长期接近 100%进程名是 kdevtmpfsi、kinsing、kworkerds——知名挖矿家族伪装成内核线程 [kworker/0:1] 但**带方括号的才是内核线程不带的是伪装**- /proc/PID/exe 指向 /tmp、/dev/shm、/root/.xxx 隐藏目录——正经业务二进制不会住在这种地方- 进程树里出现 bash -c、python -c 长命令拉起的孤儿进程- top 看到高 CPU 但 ps 里找不到——可能在用 rootkit 隐藏直接对照 /proc 目录排查。### 检查项 7监听端口与对外连接**为什么查**网络连接是双向的。**监听端口**回答谁可以进来**对外连接**回答我的服务器正在跟谁通信。反弹 Shell、C2 回连、矿池连接都会体现在不该外连的服务器在疯狂外连上。**看什么数据**bash# 所有监听端口 归属进程这是你的端口基线ss -tlnp# 当前已建立的连接重点看出网方向ss -tnp | grep -v 127.0.0.1\|::1**危险信号**- 监听端口里出现业务之外的东西——典型高危6379Redis、27017MongoDB、3306MySQL绑在 0.0.0.0 而不是 127.0.0.1陌生高位端口3333、5555、4444在监听- 一台 Web 服务器主动外连陌生 IP 的高位端口——Web 服务器正常只该被别人连很少主动出击出网方向通常只有软件源、DNS、证书续期、你调用的第三方 API- 外连目标是 :3333、:4444、:6666、:8888——矿池和反弹 Shell 的常用端口- 同一个外部 IP 与你保持大量长连接。### 检查项 8/tmp 下的可执行文件**为什么查**/tmp、/var/tmp、/dev/shm 是全世界用户都可写的目录也是攻击者的落点首选——爆破脚本、挖矿程序、提权 exploit 都习惯先放这里再执行。**一台正常的服务器这三个目录里几乎不应该有任何可执行文件**所以这个检查项简单粗暴有就看。**看什么数据**bashfind /tmp /var/tmp /dev/shm -type f -executable -ls 2/dev/null# 顺带看下最近 3 天新增的所有文件不只是可执行的find /tmp /var/tmp /dev/shm -type f -mtime -3 -ls 2/dev/null**危险信号**- 任何可执行文件正常极少- 文件名伪装成系统的/tmp/.ICE-unix/...、点开头的隐藏文件、.sh 二进制成对出现- /dev/shm 下有东西——这是一个纯内存目录重启即消失正常业务根本不用它但攻击者爱用它躲避磁盘扫描。## 四、暴露面收敛还有哪些门前三组检查在找已经发生的事这一组在数还开着的门——每一扇没必要的门都是未来的事故。### 检查项 9防火墙与端口暴露**为什么查**服务装多了、测试完忘了关是个人服务器最常见的问题。**最小暴露面原则**公网只开业务必需的端口一般就是 80/443 SSH其余一律拒绝。检查方法是对比正在监听的和真的对外开放的两个清单。**看什么数据**bash# 本机防火墙规则三者看你有哪种iptables -L -n -vnft list rulesetfirewall-cmd --list-all# 再对照云厂商控制台的「安全组」规则——这是云主机真正的第一道门# 以及检查项 7 的 ss -tlnp 输出做三方对比**危险信号**- 监听在 0.0.0.0 的管理类服务数据库、Redis、Supervisor、Docker API2375、服务器管理面板- 安全组里有 0.0.0.0/0 高位端口的放行规则还是你几个月前测试时加的- 防火墙整表为空iptables -L 只有默认三条链无规则且安全组全放行——等于裸奔只是暂时没人撞门。### 检查项 10数据库账户**为什么查**就算端口没暴露公网数据库内部也可能藏着问题弱密码账户、% 通配 host 的远程授权、前任员工/前一个项目留下的账户。Web 应用一旦被注入或 RCE这些账户就是攻击者的第二跳。**看什么数据**bashmysql -e SELECT user, host, plugin FROM mysql.user;mysql -e SELECT user, host, authentication_string AS empty_pwd FROM mysql.user;**危险信号**- host 为 % 的账户——允许从任意地址连接业务服务器和数据库同机时127.0.0.1 就够了- 空密码或 plugin 为空/老旧的账户- 你不认识的账户名或 test 库还开着远程访问。## 五、HTTP 层Web 攻击面前面十项看的是系统层。但个人服务器上流量最大的攻击面其实是 HTTP——nginx 的 access.log 就是一部连续剧把扫描器、爬虫、攻击脚本的行为全记了下来。### 检查项 11附赠从 access.log 识别攻击**为什么查**Web 日志能告诉你三件事**谁在攻击你、用什么手法、有没有成功**。前两个是常态第三个才是关键——同样是 SQL 注入探测404 和 200 是完全不同的两个故事。**看什么数据**bash# 高频扫描路径后台/敏感文件探测grep -E wp-login|\.env|phpmyadmin|manager/html /var/log/nginx/access.log | awk {print $1} | sort | uniq -c | sort -rn | head# 已知扫描器 UAgrep -iE sqlmap|masscan|nmap|python-requests|Go-http-client /var/log/nginx/access.log | wc -l# 最值得盯的攻击特征 成功状态码的组合grep -E (\.\./||%27|select|union|\.php) /var/log/nginx/access.log | grep -E 200 | head -20# POST 到脚本文件的请求webshell 落地的第一步grep -E POST.*\.(php|jsp|asp) /var/log/nginx/access.log | head**危险信号**- 攻击特征 URI 返回了 **200**——探测成功了需要立刻确认对应资源是不是你自己的正常页面- POST 脚本文件后同目录出现 200 的 GET——**webshell 可能已经落地**马上 find /var/www -mtime -3 -name *.php 检查新文件- 某个 IP 短时间内请求几百上千个不同路径——目录爆破fuzz正常的用户和搜索引擎都不会这么逛网站- 流量突然暴涨数倍——要么你火了要么你正在被 CC/暴力破解结合后端响应时间分辨。**噪音判断心法**恶意请求占比 40%、每天都有 wp-login.php 探测这些是**背景噪音不用逐条响应**。真正要盯的是**两件事****新增**这个攻击类型/路径昨天没有今天有了和**成功**攻击请求拿到 200/403 之外的好结果。把精力花在趋势变化上而不是跟每条噪音较劲。## 危险信号速查表把上面的判断浓缩成一张表体检时对照着看## 体检发现问题怎么办**先说最重要的原则如果确认或高度怀疑已被入侵第一动作不是删文件是取证。** 删掉挖矿进程只会让攻击者下次换个方式进来而证据没了你就永远不知道他从哪进来的、偷了什么。**疑似失守的处置顺序**1. **云盘快照**保留证据 保存现场2. **断网隔离**安全组只留你自己的管理 IP或直接关停3. **换凭据**SSH 密钥对、root 密码、数据库密码、面板密码一台一台来别用旧的4. **按十项清单逆向排查**后门账户、公钥、cron、systemd、preload全部清理5. **评估重装**个人服务器数据不多时重装系统 重新部署往往比清干净更可靠——你无法证明清干净了。**只是噪音、尚未失守的加固清单**按性价比排序1. **SSH 只允许密钥登录**PasswordAuthentication no一招废掉 99% 的爆破2. **部署 fail2ban**比如同 IP 一小时内 40 个 403/404 就封 2 小时扫描器自己就退散了3. **暴露面最小化**安全组只放行 80/443/SSH数据库只听 127.0.0.14. **脚本类请求一律拒绝**纯静态站或 Go/Java 后端.php .jsp 全部 403——Webshell 探测直接失去意义5. **把体检变成例行公事**上面所有检查命令都是只读的攒成一个脚本每月跑一次diff 上月结果新增项就是你的风险清单。## 写在最后安全不是一个状态而是一种节奏。没有修好一次就永远安全的服务器只有定期体检、持续收敛暴露面的运维者。十项检查听起来很多但攒成脚本后每次不过几分钟——而它回答的问题值千金**我的服务器现在到底是谁在用**下一篇我们接着聊 HTTP 层的攻防细节怎么用 fail2ban 和 nginx 规则把这些扫描器挡在门外。---*本系列是我的「建站安全」笔记所有命令都基于 CentOS/RHEL 系发行版验证Ubuntu/Debian 的差异主要在日志路径/var/log/auth.log与防火墙工具ufw。文中 IP 均为示例。*
返回列表