菜单

认证系统

相关源文件

本文档详细介绍了 code-server 的认证系统,解释了用户如何通过身份验证以及授权访问应用程序。有关代理架构及其与身份验证交互的信息,请参阅 代理架构

概述

Code-server 提供了一个可配置的认证系统,用于保护在服务器上运行的 VS Code 实例的访问。该认证系统支持多种配置方法和两种认证模式:

  • 基于密码的认证
  • 无认证(开放访问)

该系统使用 HTTP Cookie 来维护已认证的会话,并提供速率限制等安全机制以防止暴力破解攻击。

来源: src/node/cli.ts13-16 src/node/http.ts100-139

认证类型和配置

Code-server 的认证行为通过 auth 参数控制,该参数接受 AuthType 枚举中定义的两个值。

使用密码认证时,您可以通过三种不同的方式提供密码:

  1. 通过 password 参数或 PASSWORD 环境变量提供明文密码。
  2. 通过 hashed-password 参数或 HASHED_PASSWORD 环境变量提供 Argon2 哈希密码。
  3. 遗留的 SHA256 哈希密码(为向后兼容而支持)。

默认情况下,如果未指定认证类型,code-server 将使用密码认证。

来源: src/node/cli.ts139-150 src/node/cli.ts557-559

配置方法

认证可以通过多种来源进行配置,优先级如下(从高到低):

方法示例
命令行标志--auth=password --password=mypassword
环境变量PASSWORD=mypassword
配置文件YAML 中的 auth: passwordpassword: mypassword
默认值默认使用带自动生成密码的密码认证。

如果未提供密码但启用了密码认证,code-server 将在首次运行时生成一个随机密码并将其存储在配置文件中。

来源: src/node/cli.ts498-631 src/node/cli.ts636-654

密码安全

Code-server 在密码处理方面实施了多项安全实践。

密码哈希

该系统支持多种密码哈希方法:

  1. Argon2 哈希(当前标准):安全、现代的哈希算法,内置加盐。
  2. SHA256 哈希(遗留):较旧的方法,为向后兼容而保留。
  3. 明文:在直接与提供的密码进行比较时使用。

当用户成功登录后,哈希后的密码会存储在 Cookie 中以维持会话。

来源: src/node/util.ts143-201 src/node/routes/login.ts86-97

环境变量安全

密码相关的环境变量(PASSWORDHASHED_PASSWORDGITHUB_TOKEN)在读取后会被从进程环境变量中删除,以防止泄露给子进程。

来源: src/node/cli.ts600-603

登录流程

当用户尝试使用启用了密码认证的 code-server 时,他们将被重定向到登录页面。

速率限制

登录路由实现速率限制以防止暴力破解攻击。它允许:

  • 每分钟 2 次登录尝试
  • 每小时 12 次登录尝试

在超出这些限制后,后续的登录尝试将被阻止,直到速率限制重置。

来源: src/node/routes/login.ts11-27 src/node/routes/login.ts71-121

会话管理

Code-server 使用 HTTP Cookie 来维护已认证的会话。

系统创建 Cookie 时考虑了以下安全因素:

  1. 域范围:Cookie 可以限定到特定域或子域,允许跨子域的单点登录。
  2. 路径设置:Cookie 被限定到 code-server 实例的特定路径,以防止多个实例之间的冲突。
  3. SameSite 策略:Cookie 使用“lax”SameSite 策略来防止 CSRF 攻击,同时允许常见的导航模式。

创建 Cookie 时,其值包含哈希后的密码,然后在后续请求中进行验证。

来源: src/node/http.ts306-330 src/node/http.ts118-139

请求认证流程

对 code-server 中受保护路由的每次请求都会经过认证验证过程。

authenticated 函数处理检查请求是否已认证的逻辑。

  1. 对于 AuthType.None:始终返回 true。
  2. 对于 AuthType.Password:将会话 Cookie 与配置的密码进行验证。

ensureAuthenticated 中间件使用此函数来保护路由,如果认证失败则抛出 HTTP 401 错误。

来源: src/node/http.ts100-139 src/node/util.ts272-291

来源验证

除了用户认证之外,code-server 还实现了来源检查,以防止跨站请求伪造 (CSRF) 攻击。

  1. 服务器验证 Origin 标头是否与主机匹配。
  2. 没有来源标头的请求(通常是非浏览器请求)被允许。
  3. 可以配置受信任的来源来绕过此检查。

这确保了请求只能来自与服务器相同的来源,除非被明确允许。

来源: src/node/http.ts346-395

与其他组件的集成

认证系统集成了 code-server 的其他几个组件。

组件集成
HTTP 服务器认证中间件保护路由。
代理系统认证扩展到代理服务。
CLI从参数解析认证配置。
VS Code认证成功后,即可访问 VS Code 会话。

当启用代理系统时,它会利用相同的认证机制,允许用户访问代理服务而无需再次进行身份验证。

来源: src/node/http.ts80-95 src/node/cli.ts65-95

安全考量

Code-server 的认证系统实施了多项安全最佳实践:

  1. 现代加密技术:使用 Argon2 进行密码哈希,能够抵御暴力破解攻击。
  2. 速率限制:防止密码猜测攻击。
  3. 安全 Cookie:使用适当的 Cookie 设置来防止各种攻击。
  4. 环境变量清理:从环境变量中移除敏感数据。
  5. 安全比较:使用时间安全比较函数来防止时序攻击。

这些措施有助于确保 code-server 安装的安全性,即使暴露在公共互联网上。

来源: src/node/routes/login.ts11-27 src/node/util.ts143-201 src/node/cli.ts600-603