From 4e9d22625a8495cc7dd488890bf830f8c35aa0fe Mon Sep 17 00:00:00 2001 From: iBug Date: Tue, 4 Jun 2024 22:53:35 +0800 Subject: [PATCH] ct101: Add some info about CAS-shield --- docs/servers/ct101.md | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/docs/servers/ct101.md b/docs/servers/ct101.md index b9f04f24..c6c2d385 100644 --- a/docs/servers/ct101.md +++ b/docs/servers/ct101.md @@ -135,19 +135,20 @@ location /vscode/ { 容器里有一个 webhook 服务器,从 GitHub 接收用户文档仓库 [USTC-vlab/docs][user-docs] 的更新通知并拉取更新。 -代码曾经是用 [Ruby Sinatra][sinatra] 写的,后来换成了 Go,参见 `/root/webhook/main.go`(或[这个 Gist](https://gist.github.com/iBug/34caff517617bfd0de2205d2466a3b78)) +代码曾经是用 [Ruby Sinatra][sinatra] 写的,后来换成了 Go,参见 [ustclug-dev/webhook-go](https://github.com/ustclug-dev/webhook-go) 和服务器上的 `/etc/webhook-go.yml`。 -由于该 webhook 过于简单,它自己甚至没有一个 Git 仓库做版本管理( + [sinatra]: https://sinatrarb.com/ + [user-docs]: https://github.com/USTC-vlab/docs !!! info "注意" - 这个 webhook 前面还是套了一层 Nginx 的,不是直连的 + 这个 webhook 前面还是套了一层 Nginx 的,不是直连的。 ## Grafana 与监控、统计 {#grafana} ### 安全维护 {#grafana-security} -根据相关要求,grafana 限制仅允许校园网访问。尽管如此,我们仍然需要保证 grafana 始终处在安全的最新版本。建议维护者使用 RSS 订阅 ,在有安全通知发布后检查版本并及时升级。 +根据相关要求,Grafana 限制仅允许校园网访问,但我们仍然需要保证 Grafana 始终处在安全的最新版本。建议维护者使用 RSS 订阅 ,在有安全通知发布后检查版本并及时升级。 升级步骤: @@ -157,5 +158,34 @@ location /vscode/ { 其他配置未完待续。 - [sinatra]: https://sinatrarb.com/ - [user-docs]: https://github.com/USTC-vlab/docs +### 限制校外访问 {#external-access} + +采用与 VS Code 反代相同的方案,这次是将 CAS 用户名和过期时间放在一起 HMAC-SHA1 签名,格式为 `username/timestamp+signature`。 + +校外用户访问 Grafana 时,会展示一个 403 页面并提示登录。Nginx 会将 `/ibug-auth` 转发给后端 Go 程序,后端程序会请求 `https://passport.ustc.edu.cn/serviceValidate` 验证 ticket,生成签名过的 cookie 并重定向回来。 + +对某个 location 启用校外 CAS 认证,只需要在当前 location 内 `include snippets/nginx-pass-location`,并在外层的 server 块中 `include snippets/nginx-pass` 即可。 + +```nginx title="/etc/nginx/snippets/nginx-pass" +location = /403-nginx-pass.html { + root /srv/www/html; + sub_filter "${dollar}host" "$http_host"; + sub_filter_last_modified on; + sub_filter_once off; +} + +location = /ibug-auth { + proxy_pass http://127.0.0.1:8002; + include snippets/proxy-common; +} +``` + +```nginx title="/etc/nginx/snippets/nginx-pass-location" +error_page 403 /403-nginx-pass.html; +set_by_lua_file $nginx_pass /etc/nginx/lua/nginx_pass.lua; +set $nginx_pass_status "$ustcnet:$nginx_pass"; +if ($nginx_pass_status = "0:missing") { return 403; } +if ($nginx_pass_status = "0:invalid") { return 403; } +if ($nginx_pass_status = "0:failed") { return 403; } +if ($nginx_pass_status = "0:expired") { return 403; } +```