gogs 被攻击,数据库 CPU 占用 100%
背景
gogs 类似 github / gitlab,我用它作为Nas中私人 git 代码服务器。
因开放用户注册,遭遇恶意注册 + 创建仓库,恶意投放广告,累计被注册20w+用户、仓库。
由于遭受多轮攻击,几轮攻击境外IP 主要来自欧洲、菲律宾、新加坡、美国、韩国,多次执行恢复,现记录恢复步骤希望帮到读者。
现象
-
主页推送一些恶意广告、用户主页存在到境外灰黑色网站链接。
-
用户管理存在多个恶意用户

-
服务器有大量境外的IP访问超过国内访问量
这里仅以最近几个小时示例

损害
- 影响自身使用,检索效率变慢,gogs 网页存在大量垃圾内容;
- 数据库、磁盘大量脏数据;gogs 定时任务触发时会导致数据库 CPU 飙升至100% 温度过高报警;影响设备寿命、电费。
- 降低自己网站权重(如果公开部署)。
攻击特征
登录其中一台机器查看 nginx 访问日志,过滤我自己访问的特征后,仅近3个月,访问次数140w+

主要特征:
IP 来源:本轮攻击中,英国占80w、德国20w

其他访问特征:
- url :携带恶意注入的尝试、尝试 settings 等敏感路径、创建用户、仓库、wiki
- agent 模拟真实用户,但内容随机
清理步骤
1. 分析脏数据特征
1.1 磁盘文件特征
找到 data/git/gogs-repositories 目录,ls 发现确实存在大量恶意仓库

这个目录文件太多,我们先执行 ls -lhtr > ../repoList 根据最后修改时间排序分析,发现大部分仓库数据分布在最近3个月

1.2 数据库脏数据特征
登录数据库依次查看,发现主要分布在这几个表
- user
- repository
- action
- watch
由于我们重要数据量远远小于脏数据量,仅查看重要数据特征,不满足这个特征的一定是脏数据
select concat('YOUR_PATH/gogs/data/git/gogs-repositories/', name) as n from user where id < 20
2. 清理数据
2.1 清理磁盘中脏数据
根据分析结论,我们需要清理的仓库名文件肯定不是上面提到的路径
- 用 mv 将这些文件夹挪走
- 执行 rm -rf * 删除所有文件
- 用 mv 命令诺回来
2.2 清理 DB 中脏数据
带来的大量脏数据主要集中在以下表
-- 仅保留自己的账户数据
delete from watch where user_id > 20;
delete from user where id > 20;
delete from action where user_id > 20;
-- 最后再删 repo
delete from repository where owner_id > 20;
-
若脏数据太多,则建议先将需要保留的数据导出,然后执行 TRUNCATE 命令替代 DELETE,以节省 CPU 资源,避免数据库卡死。
-
若数据库有其他线上业务在跑,请考虑分批删除
最后
gogs 备份建议
因我已遭受多轮攻击,结合自身的数据不大,当前我的 gogs 是通过定期备份实现快速恢复的。
以上教程适用于未定期做 gogs 备份的读者。
网络安全
关注github gogs 更新记录,当前安全版本为 0.13.3,建议升到这个版本。
