Web 终端(已废弃)

  • 废弃于 14.5 版本。
  • 在私有化部署版上禁用于 15.0 版本。
caution此功能废弃于 14.5 版本。
在私有化部署版上,此功能默认不可用。要使其可用,管理员可以启用功能标志 certificate_based_clusters

随着 Kubernetes 集成的引入,极狐GitLab 可以存储和使用 Kubernetes 集群的凭据。极狐GitLab 使用这些凭据提供对环境的 web 终端的访问。

note只有至少具有项目的维护者角色的用户才能访问 Web 终端。

工作原理

可以在本文档中找到有关 Web 终端架构及其工作原理的详细概述。 简单来说:

  • 极狐GitLab 依赖用户提供他们自己的 Kubernetes 凭证,并在部署时适当地标记他们创建的 Pod。
  • 当用户导航到某个环境的终端页面时,会为他们提供一个 JavaScript 应用程序,该应用程序打开一个返回到极狐GitLab 的 WebSocket 连接。
  • WebSocket 在 Workhorse 中处理,而不是在 Rails 应用程序服务器中处理。
  • Workhorse 向 Rails 查询连接细节和用户权限。 Rails 使用 Sidekiq 在后台向 Kubernetes 查询它们。
  • Workhorse 充当用户浏览器和 Kubernetes API 之间的代理服务器,在两者之间传递 WebSocket 帧。
  • Workhorse 定期轮询 Rails,如果用户不再有权访问终端,或者连接详细信息已更改,则终止 WebSocket 连接。

安全

极狐GitLab 和极狐GitLab Runner 采取了一些预防措施,以保持它们之间的交互式 Web 终端数据加密,并且所有内容都受到授权保护。

  • 除非配置了 [session_server],否则交互式 Web 终端将完全禁用。
  • 每次运行程序启动时,它都会生成一个 x509 证书,用于 wss(Web Socket Secure)连接。
  • 对于每个创建的作业,都会生成一个随机 URL,该 URL 在作业结束时被丢弃。此 URL 用于建立 Web Socket 连接。会话的 URL 格式为 (IP|HOST):PORT/session/$SOME_HASH,其中 IP/HOSTPORT 是配置的 listen_address
  • 创建的每个会话 URL 都有一个需要发送的授权 header,以建立 wss 连接。
  • 会话 URL 不会以任何方式向用户公开。极狐GitLab 在内部保存所有状态并相应地代理。

启用和禁用终端支持

noteAWS Classic 负载均衡器 (CLB) 不支持 Web Socket。 如果您希望 Web 终端正常工作,请使用 AWS 网络负载均衡器(NLB)。 阅读 AWS Elastic Load Balancing 产品比较,了解更多信息。

由于 Web 终端使用 WebSockets,Workhorse 前面的每个 HTTP/HTTPS 反向代理都必须配置为将 ConnectionUpgrade header 传递到链中的下一个 header。极狐GitLab 默认配置为这样做。

但是,如果您在极狐GitLab 前面运行负载均衡器,您可能需要对配置进行一些更改。这些指南记录了选择流行的反向代理的必要步骤:

Workhorse 不允许 WebSocket 请求通过非 WebSocket 端点,因此全局启用对这些标头的支持是安全的。如果您喜欢更窄的规则集,可以将其限制为以 /terminal.ws 结尾的 URL。 这种方法可能仍会导致一些误报。

要在极狐GitLab 中禁用 Web 终端支持,请停止在链中的首个 HTTP 反向代理中传递 ConnectionUpgrade hop-by-hop headers。对于大多数用户来说,这是与 Omnibus GitLab 捆绑在一起的 NGINX 服务器,在这种情况下,您需要:

  • 找到 gitlab.rb 文件的 nginx['proxy_set_headers'] 部分
  • 确保整个块未注释,然后注释掉或删除 ConnectionUpgrade 行。

对于您自己的负载均衡器,只需反转上述指南推荐的配置更改即可。

当这些 headers 未通过时,Workhorse 会向尝试使用 Web 终端的用户返回 400 Bad Request 响应。反过来,他们会收到 Connection failed 消息。

限制 WebSocket 连接时间

默认情况下,终端会话不会过期。要限制极狐GitLab 实例中的终端会话生命周期:

  1. 在左侧边栏中,选择 搜索或转到
  2. 选择 管理中心
  3. 选择设置 > Web 终端
  4. 设置最大会话时间