本文档详细介绍了 code-server 的认证系统,解释了用户如何通过身份验证以及授权访问应用程序。有关代理架构及其与身份验证交互的信息,请参阅 代理架构。
Code-server 提供了一个可配置的认证系统,用于保护在服务器上运行的 VS Code 实例的访问。该认证系统支持多种配置方法和两种认证模式:
该系统使用 HTTP Cookie 来维护已认证的会话,并提供速率限制等安全机制以防止暴力破解攻击。
来源: src/node/cli.ts13-16 src/node/http.ts100-139
Code-server 的认证行为通过 auth 参数控制,该参数接受 AuthType 枚举中定义的两个值。
使用密码认证时,您可以通过三种不同的方式提供密码:
password 参数或 PASSWORD 环境变量提供明文密码。hashed-password 参数或 HASHED_PASSWORD 环境变量提供 Argon2 哈希密码。默认情况下,如果未指定认证类型,code-server 将使用密码认证。
来源: src/node/cli.ts139-150 src/node/cli.ts557-559
认证可以通过多种来源进行配置,优先级如下(从高到低):
| 方法 | 示例 |
|---|---|
| 命令行标志 | --auth=password --password=mypassword |
| 环境变量 | PASSWORD=mypassword |
| 配置文件 | YAML 中的 auth: password 和 password: mypassword |
| 默认值 | 默认使用带自动生成密码的密码认证。 |
如果未提供密码但启用了密码认证,code-server 将在首次运行时生成一个随机密码并将其存储在配置文件中。
来源: src/node/cli.ts498-631 src/node/cli.ts636-654
Code-server 在密码处理方面实施了多项安全实践。
该系统支持多种密码哈希方法:
当用户成功登录后,哈希后的密码会存储在 Cookie 中以维持会话。
来源: src/node/util.ts143-201 src/node/routes/login.ts86-97
密码相关的环境变量(PASSWORD、HASHED_PASSWORD 和 GITHUB_TOKEN)在读取后会被从进程环境变量中删除,以防止泄露给子进程。
当用户尝试使用启用了密码认证的 code-server 时,他们将被重定向到登录页面。
登录路由实现速率限制以防止暴力破解攻击。它允许:
在超出这些限制后,后续的登录尝试将被阻止,直到速率限制重置。
来源: src/node/routes/login.ts11-27 src/node/routes/login.ts71-121
Code-server 使用 HTTP Cookie 来维护已认证的会话。
系统创建 Cookie 时考虑了以下安全因素:
创建 Cookie 时,其值包含哈希后的密码,然后在后续请求中进行验证。
来源: src/node/http.ts306-330 src/node/http.ts118-139
对 code-server 中受保护路由的每次请求都会经过认证验证过程。
authenticated 函数处理检查请求是否已认证的逻辑。
AuthType.None:始终返回 true。AuthType.Password:将会话 Cookie 与配置的密码进行验证。ensureAuthenticated 中间件使用此函数来保护路由,如果认证失败则抛出 HTTP 401 错误。
来源: src/node/http.ts100-139 src/node/util.ts272-291
除了用户认证之外,code-server 还实现了来源检查,以防止跨站请求伪造 (CSRF) 攻击。
Origin 标头是否与主机匹配。这确保了请求只能来自与服务器相同的来源,除非被明确允许。
认证系统集成了 code-server 的其他几个组件。
| 组件 | 集成 |
|---|---|
| HTTP 服务器 | 认证中间件保护路由。 |
| 代理系统 | 认证扩展到代理服务。 |
| CLI | 从参数解析认证配置。 |
| VS Code | 认证成功后,即可访问 VS Code 会话。 |
当启用代理系统时,它会利用相同的认证机制,允许用户访问代理服务而无需再次进行身份验证。
来源: src/node/http.ts80-95 src/node/cli.ts65-95
Code-server 的认证系统实施了多项安全最佳实践:
这些措施有助于确保 code-server 安装的安全性,即使暴露在公共互联网上。
来源: src/node/routes/login.ts11-27 src/node/util.ts143-201 src/node/cli.ts600-603