以下三题任选一题完成(当然能够完成或者部分完成多于一道题目我们也非常欢迎),其中必须完成第 1 小问。
每一大题的各小问大体上是递进关系,不过在完成第 1 小问的基础上其他跳着完成也是可以的。
请完成尽量多的要求。截止时不管完成多少都请向我们提交,推荐的提交方式是 git 仓库,但其他方式也可以。
镜像站的工作之一就是将镜像同步到镜像站本地
该题需要在 GNU/Linux 环境下运行.
-
周期性同步(周期在 8 小时以内)crates.io-index 到本地(以 git 仓库的形式),并且需要可以在未同步的机器上进行第一次同步;(注意 crates.io-index 仓库时常会进行 rebase)
-
可以处理不同的同步结果(成功、各种原因的失败),如:
- 同步失败后可以以更高的频率重试同步,以尽量保证时效性(不旧于原仓库 4 小时)
- 硬盘空间不足时可以通知镜像站维护者(如邮件,方式自定)
但你能想到的其他情况也可以考虑;
注:依笔者经验,国内直接通过 https 访问 GitHub 会间歇性发生连接超时等问题
-
能将同步结果反映到本地的一个网页中,并可以通过 http 服务呈献给用户(方式自定,当然如果同时完成题目二我们也是非常欢迎的);
-
将你的作品用 docker 容器化并将 http 端口开放。
除了同步镜像,镜像站的另一工作就是向用户提供下载服务
-
用 nginx 在 80 端口提供 http 服务,反向代理一个开源软件镜像(由你选择)并托管一个存储在本地的 crates.io-index 仓库,使得用户可以通过你的服务可以:访问你反代的镜像、用 git 下载 crates.io-index;
注:从 https://github.com/rust-lang/crates.io-index 或 https://mirrorz.org/list/crates.io-index.git 中列出的镜像同步一次到本地即可作为“存储于本地的 crates.io-index 仓库”
-
已知镜像站的防火墙会将(因滥用镜像站服务而)不受欢迎的 ip 转发到 8080 端口,请在第 1 问的基础上让 nginx 同时也在 8080 端口提供 http 服务,固定返回 503 状态码并通过页面提示用户已被封禁;
-
用 Smart HTTP 协议提供 crates.io-index 的镜像服务,使得用户的 cargo(rust 的包管理器)可以使用你的 crates.io-index 镜像;
注:cargo 无法通过静态 http 协议同步 crates.io-index 仓库,只能通过有后端的 Smart HTTP 协议来同步 crates.io-index 仓库
-
将你的作品用 docker 容器化并将相应的 http 端口开放。
防止滥用者影响正常用户使用镜像站的服务,也是镜像站的重要工作之一
我们会对涉嫌滥用镜像站服务的 ip 进行封禁,做法是将其连接转发到某个 http 服务端口(8080 为例)上,其中我们固定返回 503 状态码以及提示用户被封禁的页面。但被封禁的用户与我们联系时可能出现这种情况:通过对方提供的 ip 我们无法在镜像站上查询到相关日志,从而也无法进行解封等操作。因此我们尝试在提示页面上带上相关的信息:
- 实现一个 FastCGI 程序,返回 html 格式的提示页面,除了提示用户被封禁的信息外,还加上用户的 ip、完整的 url 等信息,同时 注意你写出的程序的安全性。
- 考虑到用户有可能通过公开平台和我们联系,为了保护用户隐私,在 1 的基础上再加上加密的 ip(其他信息可选)(以下简称密文),并满足以下要求:
- 镜像站维护者们能够解密该密文,并且可以验证密文一定是由镜像站进行加密的
- 其他人无法解密该密文
- 不需要额外在镜像站上留存相关 http 请求的信息
- 同一明文每次加密会得到不同密文
除了上面三道题目外,如果你有其他想法,也欢迎和我们联系!
- 2022 年红岩网校工作站运维安全部运维方向寒假考核 给了我们关于出题的形式的思路
- @cyyself 给了我们第三题的想法