十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

code-server 多用户部署:用 Unix 账户给每个人一个独立沙盒

code-server 多用户部署:用 Unix 账户给每个人一个独立沙盒 code-server 多用户部署用 Unix 账户给每个人一个独立沙盒【免费下载链接】code-serverVS Code in the browser项目地址: https://gitcode.com/GitHub_Trending/co/code-server上次演示环境出了事两个人共用一台 code-server改动的.bashrc把对方的终端搞坏了顺手删掉的临时目录其实是第三个人的项目而登录页上所有人的密码都生效。code-server 天生单用户——一个进程、一份配置、一个密码多人共用时隔离全靠自觉。本文给出一套基于 Unix 账户的 code-server 多用户隔离方案一人一个系统账户、一人一个实例、一人一份数据目录隔离交给内核文件权限完成。全部操作都有验证命令照抄可落地。先想清楚隔离边界画在哪选方案前先比较三条路线路线隔离边界开销复杂度适合场景容器隔离独立 namespace每容器约 50~200MB高需要编排、镜像管理用户多、环境需要版本化进程级隔离本文OS 账户 文件权限每实例约 300~400MB中systemd Nginx单人服务器上给 5~20 人纯端口隔离只有端口号低低无安全边界不推荐纯端口隔离只是把端口号分给人一个用户照样能cat掉另一个用户家目录里的东西等于没隔离。本文取进程级隔离用 Unix 用户隔离文件系统用 systemd 隔离进程用 Nginx 做路由。不引入 Docker 和镜像仓库多出来的只有每人一个 OS 账户。隔离边界画在账户这一层后面所有配置只是把三件事串起来三条设计原则每个用户一个 OS 账户和一个进程实例只监听 127.0.0.1Nginx 是唯一入口文件隔离靠 Unix 默认权限不做额外 ACL。搭起来最小可用环境分步走1. 装一份大家共用的 code-servercode-server 只装一次所有实例共用同一份二进制后续升级也只需动一处。仓库根目录的install.sh会自动探测系统包管理器cd /path/to/code-server ./install.sh脚本以独立二进制方式完成安装见 README产物是code-server命令和对应的 systemd 支持不会往系统里塞一堆运行时依赖。2. 创建隔离用户给每个要使用的人建一个系统账户。这一步的意义文件隔离从此由内核权限兜底不依赖任何应用层约定。useradd -m -d /var/lib/code-server/alice -s /bin/bash alice usermod -p ! alice # 禁用密码登录 usermod -aG codesrv alice # 加入共享组访问共享项目目录用 mkdir -p /var/lib/code-server/share chgrp codesrv /var/lib/code-server/share关键参数-m -d把家目录统一放到/var/lib/code-server/下便于集中管理-p !锁死密码登录这条账户只能从网页进。验证一下sudo -u bob ls /var/lib/code-server/alice/projects # 预期Permission denied id alice # 预期uid1001(alice) ...3. 生成 per-user 配置每个实例一份config.yaml绑到 127.0.0.1 的一个固定端口同时维护一份用户→端口注册表后面 Nginx 要读它PORT8081 for USER in alice bob; do PW$(openssl rand -hex 12) sudo -u $USER bash -c cat /var/lib/code-server/$USER/.config/code-server/config.yaml EOF bind-addr: 127.0.0.1:$PORT auth: password password: $PW cert: false user-data-dir: /var/lib/code-server/$USER/.local/share/code-server EOF chmod 600 /var/lib/code-server/$USER/.config/code-server/config.yaml echo user $USER: $PORT | sudo tee -a /etc/code-server/ports.conf PORT$((PORT 1)) done配置字段和 CLI 参数一一对应user-data-dir决定会话 socket、扩展目录和全部用户数据落在哪这是隔离的核心。密码先存明文并锁600权限只有属主可读需要更严格时可在 code-server 里换hashed-passwordargon2升级路径不变。4. 起专属实例一个 systemd 模板服务管所有实例每个实例以属主账户运行崩溃自动拉起cat EOF | sudo tee /etc/systemd/system/code-server.service [Unit] Descriptioncode-server instance for %i Afternetwork.target [Service] User%i EnvironmentFile/etc/code-server/env.%i.conf ExecStart/usr/local/bin/code-server --config /var/lib/code-server/%i/.config/code-server/config.yaml Restartalways RestartSec5 EOF sudo tee /etc/systemd/system/code-server.service.d/limits.conf EOF [Service] CPUQuota30% MemoryMax1G TasksMax512 EOF for USER in alice bob; do sudo sed s/^user $USER: /PORT/; s/ / / /etc/code-server/ports.conf \ | grep -qF $USER sudo tee /etc/code-server/env.$USER.conf \ (grep ^user $USER: /etc/code-server/ports.conf | sed s/user $USER: /PORT/) sudo systemctl daemon-reload sudo systemctl enable --now code-server$USER.service done端口只出现在config.yaml里模板服务不重复写 bind 参数避免两处配置打架。limits.conf保证任何人烧不起超过 1GB 内存。验证systemctl status code-serveralice.service # 预期active (running) ss -ltnp | grep 8081 # 预期127.0.0.1:8081 在听 curl -s -o /dev/null -w %{http_code}\n http://127.0.0.1:8081/ # 预期3025. 让 Nginx 按人路由多个实例共用一个域名按路径分人。关键在proxy_pass末尾的$uri——它保留/alice前缀静态资源才能从/alice/_static/...正确加载会话 Cookie 的作用域也落在各自子路径下两个实例的登录态互不覆盖。每个 location 块是静态的从注册表生成不用 Lua 动态解析端口sudo tee /etc/nginx/sites-available/code-server EOF server { listen 443 ssl http2; server_name code.example.com; ssl_certificate /etc/letsencrypt/live/code.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.example.com/privkey.pem; include /etc/nginx/conf.d/code-server-users.conf; } EOF { echo # generated from /etc/code-server/ports.conf while read -r _ USER PORT; do printf location /%s/ {\n proxy_pass http://127.0.0.1:%s$uri;\n proxy_http_version 1.1;\n proxy_set_header Upgrade $http_upgrade;\n proxy_set_header Connection upgrade;\n proxy_set_header Host $host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_read_timeout 7200s;\n}\n $USER $PORT done (sed s/^user // /etc/code-server/ports.conf) } | sudo tee /etc/nginx/conf.d/code-server-users.conf sudo nginx -t sudo systemctl reload nginxproxy_read_timeout 7200s保证编辑器空闲时 WebSocket 长连接不被 60 秒默认值掐断。验证与预期curl -sI https://code.example.com/alice/ | head -3 # 预期HTTP/2 302 且 Location 指向 /alice/login浏览器打开https://code.example.com/alice/输密码进入编辑器看到的就是每个用户各自独立的沙盒。别只跑通把门关上 三件容易漏的事各一行命令禁 SSH 登录。这些账户的存在意义是跑服务不是登机器sudo bash -c echo Match Group codesrv /etc/ssh/sshd_config.d/codesrv.conf; echo PasswordAuthentication no /etc/ssh/sshd_config.d/codesrv.conf; echo PermitRootLogin no /etc/ssh/sshd_config.d/codesrv.conf sudo systemctl reload sshd权限收紧。/var/lib/code-server默认是 root 的755顺手改成属组可读sudo chgrp -R codesrv /var/lib/code-server sudo find /var/lib/code-server -type d -exec chmod 750 {} 审计可选。合规要求留痕时加一条 auditd 规则事后用auditctl -k对应 key 查询sudo auditctl -w /var/lib/code-server -p wa -k codeserver-access这三条不改业务行为但决定了浏览器被攻破之后攻击者还能拿到什么。跑一段时间后你会遇到的问题端口冲突服务起不来。现象是systemctl报address already in use。原因注册表和config.yaml里的端口不一致两个实例抢了同一端口。修复以/etc/code-server/ports.conf为唯一事实来源改完重新生成配置文件和服务再systemctl restart code-serveralice.service。编辑器加载几秒后白屏。现象页面和静态资源都正常WebSocket 一断就卡死。原因Nginx 没给 Upgrade 头code-server 与服务端的长连接没升级成 WebSocket。修复确认每个 location 里有proxy_http_version 1.1和Upgrade头。登录页提示限流。现象连续输错几次后怎么输都对。原因code-server 内置登录限流2 次/分钟、12 次/小时见src/node/routes/login.ts。修复等一小时或systemctl restart code-serveralice.service重置令牌桶。一个用户登录后进了另一个用户的编辑器。现象Bob 访问/bob/登录后界面却是 Alice 的工程。原因proxy_pass丢了路径Cookie 作用域变成/会话令牌跨子路径串号。修复proxy_pass带上$uri让 Cookie 落到各自子路径。收尾这套 code-server 多用户方案的隔离由内核兜底配置只负责路由和拉起每个实例是一个普通 Node 进程占 300~400MB 内存一台 16GB 的机器稳定跑 5~6 人没有压力。账户、权限、systemd、Nginx 全是系统原生组件没有引入任何需要单独运维的中间层。下一步两个方向用户超过 20 人、或需要给不同用户固定扩展版本时把模板服务换成容器编排登录体验上把密码认证换成 SSO 或 OIDC密码这件事就可以从运维清单里删掉。场景命令查看某用户实例状态systemctl status code-serveralice.service实时跟踪日志journalctl -u code-serveralice.service -f重新生成 Nginx 用户路由重跑生成 code-server-users.conf脚本再nginx -t systemctl reload nginx新增用户useradd 生成配置 systemctl enable --now code-serveruser.service查审计事件ausearch -k codeserver-access【免费下载链接】code-serverVS Code in the browser项目地址: https://gitcode.com/GitHub_Trending/co/code-server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表