Skip to main content

使用公司代理限制对 GitHub.com 的访问

配置代理以阻止用户使用个人帐户进行访问 GitHub.com 。

谁可以使用此功能?

Enterprises with Enterprise Managed Users on GitHub.com

如果使用 Enterprise Managed Users,则可以阻止网络上的用户使用不是企业成员的帐户进行身份验证 GitHub.com 。 这有助于降低公司数据暴露给公众的风险。

若要强制执行此限制,您需要将网络代理或防火墙配置为向用户发往 GitHub.com 的 Web 和 API 请求中注入一个标头。

此功能需要一个外部防火墙或代理。 GitHub 支持 无法协助设置或排查此类外部工具的问题。 有关支持范围的详细信息,请参阅“关于GitHub支持”。

启用访问限制

此功能默认未启用。 企业所有者可以为企业启用该功能。

  1. 导航到您的企业。 例如,从 GitHub.com 上的 公司 页面。
  2. 在页面顶部,单击“ 设置”。
  3. 下****,单击“身份验证安全性”。
  4. 在“企业访问限制”部分,选择“启用企业访问限制”。

先决条件

  • 必须在 具有托管用户的企业 上使用 GitHub.com。
    • 如果所有用户的用户名后都附加了企业的短代码,你就知道你使用的是 具有托管用户的企业。
    • 如果使用 带有数据驻留权的 GitHub Enterprise Cloud,企业驻留在专用子域 GHE.com上,因此不需要标头来区分企业资源的流量。
  • 若要强制实施该限制,所有流量都必须流经一个代理或防火墙。 该代理或防火墙必须:
    • 能够拦截和编辑流量,通常称为“中断并检查”代理
    • 支持任意标头注入
  • 你的企业所有者已启用此功能。

查找标头

若要强制实施该限制,可将一个标头注入到所有流向特定受支持的终结点的流量中。 该标头采用以下格式。

sec-GitHub-allowed-enterprise: ENTERPRISE-ID

企业所有者可以确定要在你的企业的标头中使用的正确企业 ID。

  1. 导航到您的企业。 例如,从 GitHub.com 上的 公司 页面。
  2. 在页面顶部,单击“ 设置”。
  3. 下****,单击“身份验证安全性”。
  4. 在“企业访问限制”部分,查找您企业的标题。

使用标头

为获得最佳结果,请将代理配置为将该标头注入到所有流向以下受支持的终结点的流量中****。

终结点用途
github.com/*到GitHub.com的网络流量
api.github.com/*REST 和 GraphQL API 请求
*.githubcopilot.com某些 GitHub Copilot 功能所需的访问量

这将阻止你的网络上的人员使用不为你的企业所拥有的用户帐户访问这些终结点。 除了此功能之外,你还可以通过设置 IP 允许列表来阻止来自你的网络外的流量。 请参阅“使用 IP 允许列表限制企业网络的流入流量”。

注意

创建支持票证需要对 github.com/login 的访问权限。 若要确保拥有支持权利的用户可以请求帮助,你可能希望免除这些用户的限制。

为多个企业启用访问限制

企业所有者可以跨多个企业帐户强制实施限制。

  1. 为每个企业帐户启用该功能。 请参阅 “启用访问限制”。
  2. 将标头注入到发往某些受支持终结点的所有流量中。 该标头采用以下格式。
sec-GitHub-allowed-enterprise: ENTERPRISE1-ID, ENTERPRISE2-ID, ENTERPRISE3-ID ... ENTERPRISE20-ID.

企业所有者可以为每个企业找到要在标头中使用的正确企业 ID。 请参阅 “查找标头”。

注意

我们目前支持标头中最多包含 20 个唯一企业 ID。

取消对特定用户的限制

你可能希望取消对特定用户的限制,这些用户需要使用个人帐户为开放源代码资源做出贡献,或者在出现问题时可能需要创建支持票证。 若要处理此问题,必须将网络配置为仅为要限制的用户注入该标头。

选项包括:

  • 网络隔离:创建一个注入标头的“工作”网络,以及一个不注入标头的“开放源代码”网络****。 将对“开放源代码”网络的访问权限限制在需要它的用户。
  • 设备分组:如果代理或防火墙已经过身份验证,则你可以收集一组不需要标头的用户,并有选择地将他们排除在注入之外****。

不支持的功能

由于此限制仅适用于通过添加企业标头的代理发送的请求,因此某些 GitHub 功能不支持阻止用户访问或使用其个人帐户的限制。 若要阻止网络上的用户访问这些功能,需要进行下面所述的更改。

功能关联的终结点备注
GitHub Pagesgithub.io这通常是用户生成的无法接受数据的内容。 你可能不想限制访问。
GitHub Codespacesgithub.dev若要限制访问,请完全阻止该终结点。
SSH 访问权限
GitHub.com上的端口 22若要限制访问,请完全阻止该终结点。
基于 HTTPS 的 SSHssh.github.com若要限制访问,请完全阻止该终结点。
GitHub 托管运行者各种若要强制实施特定路由,请使用 Azure 专用网络。 请参阅“关于企业中的 GitHub 托管的运行器的 Azure 专用网络”。
自托管运行程序各种若要强制实施特定路由,请使用代理服务器。 请参阅“将代理服务器与运行器一起使用”。

不需要限制的终结点

以下终结点不支持或不需要限制,因为它们仅提供而不接收数据。

  • *.githubusercontent.com
  • *.githubassets.com
  • GitHub.com 上的 WebSocket 流量

限制的工作原理是什么?

对于包含企业标头的流量,当用户尝试使用用户帐户(或与用户帐户关联的令牌)(而不是企业成员)通过 Web、Git 或 API 访问 GitHub.com 时:

  • 用户会看到一条带有 403 状态代码的错误消息。 请参阅显示给被阻止用户的错误
  • business.proxy_security_header_unsatisfied 事件将记录在企业审核日志中。 由于隐私原因,这些日志事件将没有 actor 字段,但将具有 actor_ip 字段(如启用)(请参阅“在企业审核日志中显示 IP 地址”)。 若要进一步调查这些事件,可以查看环境中的代理日志。

以下部分提供了适用于用户 Web 活动和 API 请求的预期行为的详细信息。

Web 活动

对于用户界面中的 GitHub.com 活动,标头限制用户可以登录的帐户。

用户在你的网络上时:

  •           **可以**登录到企业中的 托管用户帐户。
    
  • 无法登录到你的企业外的帐户****。
  • 无法使用帐户切换器切换到你的企业外的帐户****。

如果用户已登录到企业外部的帐户(例如,他们在网络外部登录),则当用户将设备引入你的网络时,他们将收到错误,在他们使用企业拥有的帐户登录之前无法访问 GitHub.com 。

Git 活动

如果您的代理配置为在 HTTP(S) 请求中注入标头,则您网络中的用户将无法通过 HTTP(S) 向 GitHub.com 进行身份验证,除非他们属于您的企业。 对于未经身份验证的匿名用户,公共读取请求不会被阻止。

你不能使用企业标头通过 SSH 限制 Git 活动。 相反,你可以选择完全阻止 SSH 请求的端口。 请参阅不支持的功能

API 请求

对于发往 api.github.com 的 REST 和 GraphQL API 流量(包括通过 GitHub CLI 发出的请求),当用户连接到你的网络时,该标头会限制访问令牌的使用。

场景结果受影响的令牌类型
用户使用与你的企业拥有的帐户关联的 personal access token。
personal access token 在 API 请求中如预期那样工作。
ghp_github_pat_
当连接到你的网络时,某个用户尝试使用与企业外部用户关联的 personal access token。使用令牌的请求被阻止。
ghp_github_pat_
在你的网络外,用户使用你的企业外的帐户登录到在其设备上运行的 OAuth 应用。 然后,用户将其设备引入你的网络。应用中的 OAuth 令牌停止工作。gho_
在企业网络之外,使用企业外部的帐户时,用户会登录到在其设备上运行的 GitHub App。 然后,用户将其设备引入你的网络。应用中的令牌停止工作。ghu_
连接到网络时,应用程序会尝试使用 GitHub App 刷新令牌为企业外部的用户刷新会话。刷新失败。ghr_
连接到你的网络时,应用程序尝试为你的企业外的组织获取安装令牌(一个没有用户标识,只有应用标识的令牌)。令牌将不起作用。ghs_

向阻止的用户显示的错误

当限制按预期工作时,将向用户显示错误。 在以下情况下会出现错误:

  • Web 活动:当用户被阻止登录或使用现有的过时会话时****。
  • API 活动:当用户尝试使用与企业外的用户关联的令牌时****。
  • 安装令牌:当应用程序尝试使用安装令牌访问企业外的组织或用户帐户时****。 对于安装,仅写入请求会被阻止。 对企业外的资源的读取请求不会被阻止。 若要详细了解安装令牌,请参阅“验证为 GitHub 应用程序安装”。
场景错误代码消息
Web 活动403您的网络管理员已阻止访问 GitHub,但 ENTERPRISE Enterprise 除外。 请使用帐户 _SHORTCODE 登录以访问 GitHub。
API 活动403您的网络管理员已阻止访问 GitHub,ENTERPRISE 企业版除外。 请使用来自 _SHORTCODE 企业中某个用户的令牌来访问 GitHub。
安装令牌403您的网络管理员已阻止访问 GitHub,ENTERPRISE 企业版除外。 只有 SHORTCODE 企业的令牌可以访问 GitHub。

带有 400 代码的错误指示配置中出现错误。 请参阅 疑难解答

本地测试示例

可以使用 Web 调试工具在本地测试网络配置。 本部分提供了使用 Fiddler 的示例。 请注意,Fiddler 和其他外部调试工具在GitHub 支持的范围内。

在以下示例中,您将添加一些 FiddlerScript 以便在每个请求上运行。

  1. 安装 Fiddler

  2. 配置 Fiddler 以对 HTTPS 流量进行解密。 请参阅 Fiddler 文档

  3. 在 Fiddler 中,导航到“FiddlerScript”选项卡,并将以下代码添加到 OnBeforeRequest 函数。 将 enterpriseId 变量设置为自己的企业 ID。

    JavaScript
    // Your enterprise id
    var enterpriseId: String = "YOUR-ID";
    
     //Inject on the web UI
     if (oSession.HostnameIs("github.com")){
         oSession.oRequest.headers.Add("sec-GitHub-allowed-enterprise",enterpriseId)
         oSession["ui-color"] = "green";
     }
    
     // Inject on API calls
     if (oSession.HostnameIs("api.github.com")){
         oSession.oRequest.headers.Add("sec-GitHub-allowed-enterprise",enterpriseId)
         oSession["ui-color"] = "blue";
         }
    
     // Inject on Copilot API calls
     if (oSession.HostnameIs("githubcopilot.com")){
         oSession.oRequest.headers.Add("sec-GitHub-allowed-enterprise",enterpriseId)
         oSession["ui-color"] = "yellow";
     }
    
  4. 单击“Save script”****。

现在,当数据包捕获处于活动状态时,将为每个指定的域注入标头。 若要启用或禁用注入,可以通过单击“File”****“Capture Traffic”来切换数据包捕获 > ****。

可以打开和关闭此注入,以模拟使用不允许的帐户登录,然后进入网络,或在网络上尝试登录到不允许的帐户。

故障排除

如果你的标头注入未按预期工作,当你尝试使用受影响的终结点时,会看到带有 400 代码的错误。 这与功能正常运作时显示的 403 错误不同(请参阅阻止用户时显示的错误)。

通常,在以下情况下会出现 400 错误。

  • 标头使用无效的短代码或企业 ID。
  • 标头列出了多个企业。
  • 请求包含多个 sec-GitHub-allowed-enterprise 标头。
场景错误代码消息
无效的短代码或 ID400找不到 sec-GitHub-allowed-enterprise 标头中命名的企业。 确保在防火墙或代理设置中正确输入了“企业短代码”。 如果此错误仍然存在,请与网络管理员联系。
多个企业400只能将一个企业与 sec-GitHub-allowed-enterprise 标头一起使用。 确保只提供一个企业和一个标题栏。 如果此问题仍然存在,请与网络管理员联系
多个标头400收到多个 sec-GitHub-allowed-enterprise。 此标头必须被防火墙或代理覆盖,以确保只有单个企业被授予访问权限。 如果此问题仍然存在,请与网络管理员联系。

其他阅读材料