校赛平台运维杂记
Swizzer

回顾一下我的一些铸币操作。

缘起

HITsz使用的是GZCTF平台,之前采用最简单的docker单机部署的方式,跑在一台极其老旧的server上(e5-2680 v4的CPU+128GB RAM+1T HDD)。这套配置对于校内赛来说其实多多少少够用,但是运行了一年之后,HDD的读写性能成为了显著的拖累——后台出题时build docker image的速度和选手做题时开启docker container的速度都非常慢,甚至一个简单的alpine linux container都需要5s才能开起来😮💨几个出题老登都表示受不了这种垃圾的体验,所以我决定着手迁移。

选机

苦于刚刚起步,我们社团实在是没有太多资源。i春秋很久之前赞助的一批服务器还不知道在哪里吃灰,而CTF课程也尚在进行中,迁移速度是第一要务。所以我选择先把校赛平台捣鼓到手头现有的机器上(我的homelab)——一台R5 5600+64GB RAM+2T SSD+4T HDD的机子。CPU核心数比起e5几乎砍了2/3,不过经过谨慎的压测,对于校内50人左右的比赛绰绰有余,CPU使用率最高不超过2%。就算未来结课赛时面向全校,规模扩大到200人左右,这个冗余也是相当富裕的。

迁移平台数据

这一步是最简单的,把docker-compose.yml里配置的data目录打包个tar传到新机器上就能无感迁移所有平台数据(用户、队伍、题面、题目本地附件等等)。平台上的题目并不多,所有数据加起来大概200MB左右,这一步没有什么困难。

迁移题目镜像

出于反作弊需求,平台上大部分Crypto,1/4的Misc和Re,所有Web和Pwn题目,都是动态容器类型的。而docker images迁移就比较麻烦了,迁移时我想过以下几种可能:

  • 自建docker registry,把images都push上去
  • 直接dd打磁盘镜像,把裸数据从老机器上拖到新机器上
  • docker image save保存images

第一种选择很快就被我pass掉了,因为旧机器上跑的各种东西都老得要死(Linux kernel停留在4.5版本,docker更是不知何年月的造物),走https的registry会在docker login时报错,不走https走http也会在某一步(我忘了)莫名其妙报错😆

随后我选择了第三种做法,而这是一个非常错误的决定——我们的images实在是太多太大,批量save半小时后,整个系统都被文件I/O阻塞了🥲

当我意识到这个问题时已经有两三位同学反馈校赛平台开不了题目容器了。果断Ctrl+C断掉,检查了一下磁盘占用,250G的磁盘已经用掉了98.4%。你可能会问,前面不是说1T吗?这就得不得不吐槽我校运维工程师的智慧——分区划了1T,逻辑卷只给了250G🤗

所以说运维之前永远记得亲自做一遍基线检查,不要相信其他人的任何说法

调整逻辑卷大小后重新docker image save,执行1h后仍未完成。同时,校赛平台也遇到了更严重的问题——不只是开不了题目容器,平台甚至都访问不了了。随后不久,我的ssh连接也断了,并且无法重连...

走到这一步只能说我实在是高估了古董CPU的算力,也算是重大运维事故了。冷静几分钟后,我决定先搭起来一个最小可用的环境,至少,先保证课上所用题目是可访问的。至于之前几次比赛的留档和常态化训练题目,都可以先放一放。

好在课上只有Crypto和Pwn合计二十多道题目用到了动态容器,得益于题目仓库结构,用bash脚本很容易自动化地从头构建所有docker images——只不过平台后端的题目信息都得重新手敲一遍了。

抢救大约20min,课上用的题目全部恢复。

手欠引起的惨案

虽然homelab足足有6T的空间,但我还是抱着葛朗台的心理能省则省。所以某天深夜当我看到Timeshift快照占用了100G+时,我鬼使神差地删了所有快照,然后去到了/run/timeshift下面来了个sudo rm -rf ./*

然后根目录下面的文件就遭殃了(

但是根目录文件为什么遭殃?我猜是因为Timeshift把根目录挂载到了这里

所以说大半夜真不能随便搞高危操作😇

总之15s后我意识到了不对劲,但为时已晚,Ctrl+C,kernel panic,之后homelab就彻彻底底地死了💀

不过好在半夜4点没人做题,所以进入LiveCD重装一下内核和受波及的几十个包就恢复了

林林总总

趁着迁移顺便也升级了GZCTF的版本,新版本界面还是好看不少的,还能自定义logo,好评~

迁移之后发现我校局域网内的所有有线设备其实都没有隔离,10.249.0.0/16中任意IP的任意端口都能访问到,比起西电需要WebSocket转发幸福不少🥰

所以为什么之前的校赛平台要去网络中心特地申请一个端口映射?

之前不少题目的Dockerfile写得非常烂污,迁移之后顺手做了些裁剪,单就Crypto方向而言,占用空间压缩到了原来的1/10。过几天压力一下其他方向也优化自己的Dockerfile,不能再随便把奇奇怪怪的东西塞进我的homelab了😡

结课赛如果面向全校的话,反作弊是重中之重。听说ret2shell(回归终端)的反作弊上限更高一些,也许会考虑问@Reverier-Xu要一份来部署试试看?

由 Hexo 驱动 & 主题 Keep
访客数 访问量