Gitlab升级至7.2

本次更新历时26分钟,服务共中断15分钟。

7.2 主要特性:

  • 增加项目加星功能
  • 优化标签样式和功能
  • 改进发起合并请求时收集diff的方式
  • 改进比较页面对大diff的处理
  • 修复项目重命名时返回错误码为500的情况
  • 增加从外部导入库时的时间限制(2min->4min)
  • 其他细节优化
  • 其他API增强

更新时遇到的问题:

迁移数据库时意外终止,提示:

Mysql2::Error: Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=': SELECT  `labels`.* FROM `labels`  WHERE `labels`.`project_id` = 112 AND `labels`.`title` = '特性' AND `labels`.`color` = '#428BCA' LIMIT 1

这是由于数据表字符集不统一造成的,解决方法:将字符集统一为utf8

alter table `labels` convert to character set utf8 collate utf8_general_ci;

由于历史遗留问题,配置文件过期很久了。为了与官方配置保持一致,此次更新对主配置文件gitlab.yml做了较大幅度的修改。如果您在使用过程中遇到任何问题,请联系 lug#ustc.edu.cn(# -> @)

近期 mirrors 的故障的时间表

一言以概:科大 mirrors 服务器被黑客入侵以及攻击了

下面将以 cuihao 同学的视角描述整个过程的经过。其中跳过了大量技术细节,以后有机会会陆续公布。


8月6日

mirrors 流量大增,IO负载也显著升高。rsync 日志显示同步 ubuntu 镜像的下游同步流量较平时显著升高。

8月8日

有人报告 http 出现零星的 404 错误,但没有引起重视。

晚上,为了降低负载和网络压力,限制了单 IP 的 rsync 并发连接数。

8月9日

中午,由于前一天的限制效果不理想,又对 http 并发连接施加了限制,并进一步压低了 rsync 的限制,网络/IO 压力得到控制。

晚上,有 mirrors 维护人员发现,从上游同步 ubuntu 镜像同步时出现奇怪的错误。检查后发现,ubuntu 镜像目录下的 /ubuntu 软链接(指向自身),被人替换为文件夹,并将自身 bind mount 到该文件夹上。

这就解释了 mirrors 流量激增的原因:mirrors 的下游源要多传输一整个 ubuntu 镜像。该问题于当日解决。

当日,有更多人反应 http 出现随机的 404 的错误。这引起了我们的注意。Nginx 日志和 strace 跟踪显示,Nginx 对特定文件执行 open 系统调用时有一定概率因 ENOENT 失败。但无法用其他程序重现,原因不明。

8月10日

LUG 多位技术人员都开始对 404 问题进行调试。boj 发现,Nginx 执行 open() 系统调用后,包含文件路径参数的字符串被篡改了。

下午,该 bug 突然出现反调试行为 —— Nginx 被 gdb 或 strace 跟踪之后,bug 消失,无法再次重现。调试陷入僵局。综合前面链接被替换的事件,有人指出 mirrors 可能被人入侵。但这也使得该 404 问题得到临时“解决”——我们把所有 Nginx 进程都 strace 上了……

晚上,测试了 Apache,发现 Apache 会出现随机的 403 错误。根本原因和 Nginx 错误一样,即 open() 调用失败。

当天还发现,root 的 bash 历史在近期被清除过(第一条记录为 rm ~/.bash_history)。

8月11日

boj 深入内核进行调试,最终发现了导致 404 问题的罪魁祸首。mirrors 上被人植入了一个内核模块,该模块会篡改 open() 函数的参数。根据 boj 反汇编结果,其行为大致如下:
if (process name is "nginx" and process is not traced) or
\(process name is "apache2" or "lighttpd"))
if (rand() % sample == 0)
if (path is not empty && file extension is "exe", "msi"...)
rewrite the path to empty string

自此,404 问题真相大白。

8月12日

我们对系统文件做了检查(使用 debsum),没有发现其他文件被篡改。但为了安全起见,决定于 14 日停机重装系统。

8月13日

下午将近6点,mirrors 上短时间内 fork() 出两万多个 vsftpd 进程,FTP 服务疑似遭 DoS 攻击。发现时为时已晚,服务彻底瘫痪。http 服务切换到备份机器。

晚间,cuihao、Guangyu Zhang、pudh、zsj 进入机房,决定提前开始重装系统作业。作业持续到晚上 11 点,大家先回去洗洗睡了。

8月14日

http、rsync 服务陆续恢复。不过因为路由配置错误(当时未发现),所以国内非教育网用户仍访问的是备份站点,也无法访问 rsync/ftp。

当日,我们对 vsftpd 进行了大量测试。认为 vsftpd 先 fork()(clone())再检查客户端数量限制的行为使得 DoS 成为可能。进行若干严格的限制后,ftp 服务也恢复了。

8月15日

晚上,cuihao 发现国内非教育网用户仍无法访问 mirrors 的问题。后经检查确认是路由没有配置好,现已修复。


此次事件显示,LUG 服务器安全方面存在不少漏洞。重装系统后,我们会在安全方面做更多努力,以后这些安全措施也会逐步应用于其他服务器。

同时 LUG 也对黑客入侵和攻击 mirrors 服务器的行为表示强烈愤慨 🙁

mirrors 服务器故障公告

8 月 13 日 17 时 35 分,mirrors.ustc.edu.cn 服务器负载过高导致宕机。DNS 自动切换到了另一台备份服务器上,备份服务器将 HTTP 302 重定向到国内其他开源软件镜像,rsync、ftp 等服务暂停。我们正在修复 mirrors 系统,对此带来的不便深表歉意,希望您能谅解。

Update: 8 月 14 日下午服务已经恢复。

mirrors 镜像服务变动

近期我们对 mirrors 上的所有镜像了清理(见《Mirrors 镜像整理通知》),下面列出了所有受到影响的镜像。


新增源

  • Ubuntu CD 镜像(ubuntu-cdimage):这个镜像包含 Ubuntu 所有官方支持的衍生版的镜像,包括 K/L/Ubuntu、Ubuntu Kylin 等。为了节省流量,mirrors 只同步已发布版本的镜像,不包含每日镜像。
  • Trisquel 镜像(trisquel-images):虽然不知道是个啥发行版,不过以前一直提供了软件源的镜像,索性把 iso 镜像之类的也同步上了。

内容过期的源,重新进行了同步

  • Bioconductor(bioc):同步了最新测试版本(3.0)。对同步配置进行了调整,原来硬编码了要同步的版本号,现在应该能自动同步新的版本了。
  • PyPI(pypi):原来的同步脚本有点问题,同步似乎一直没有成功。更新同步脚本后,同步成功了。
  • Ubuntu 旧版本软件源(ubuntu-old-releases):原来没有同步,现在同步上了。
  • Python(x,y)(pythonxy):他们的域名过期了,现已改从别的地方更新。

内容过期的源,停止了所有服务

  • Linux From Scratch(lfs)
  • Progress Linux(progress、progress-images)
  • Tizen(tizen)
  • MySQL(mysql)

其他服务调整

  • 树莓派系统镜像归档(raspberrypi):上游已不再更新(现在树莓派系统镜像通过 CDN/P2P 提供下载)。为了提醒用户,在目录中添加了 README 文件和 index.html。此外,还停止了 rsync 服务。
  • Linux 内核源代码(linux-kernel):经查和 kernel.org 镜像重复。删除了该镜像。但为了保持兼容,做了指向 kernel.org 中相关文件夹的链接,保留了 http/rsync 访问。其中 rsync 模块过滤掉了一些文件夹,以保证和原来的镜像“看起来一样”。
  • sourceware.org 镜像(sourceware.org):嗯,其实我们压根儿没这个源,只是从 sourceware.org 同步了 Cygwin、Cygwin Ports 镜像。去掉了这个 rsync 模块,但为避免 http 死链接,做了软链接。
  • 此外,一些从来没有被访问过的 rsync 模块被移除(HTTP不受影响):backtrack、backtrack-iso、loongson2f、monitoring-plugins、pythonxy、startos、trisquel、vim、Xorg