Note
限制对 GitHub.com 的访问权限的标头目前为 公共预览版,可能随时更改。
如果你使用 Enterprise Managed Users,则可以阻止你的网络上的用户使用非企业成员的帐户向 GitHub.com 进行身份验证。 这有助于降低公司数据暴露给公众的风险。
若要强制实施此限制,可将网络代理或防火墙配置为将标头注入到用户对 GitHub.com 的 Web 和 API 请求中。
此功能需要一个外部防火墙或代理。 GitHub 支持 无法协助对此类外部工具进行设置或故障排除。 有关支持范围的详细信息,请参阅“关于 GitHub 支持”。
请求访问权限
此功能默认未启用,目前仅适用于按发票付款的企业。
- 如果你按发票付款,则要请求访问权限,请联系 GitHub 的销售团队中的客户经理。
- 如果你通过信用卡或 PayPal 付款,则此功能当前不可用。
先决条件
- 必须在 GitHub.com 上使用 具有托管用户的企业。
- 如果你所有用户的用户名都追加了你的企业的短代码,你就知道你正在使用 具有托管用户的企业。
- 如果你使用 具有数据驻留的 GitHub Enterprise Cloud,则你的企业驻留在 GHE.com 的专用子域上,因此不需要标头来区分流向企业资源的流量。
- 若要强制实施该限制,所有流量都必须流经一个代理或防火墙。 该代理或防火墙必须:
- 能够截获和编辑流量,通常称为“中断和检查”代理
- 支持任意标头注入
- GitHub 的帐户团队必须已授予你访问此功能的权限。
查找标头
若要强制实施该限制,可将一个标头注入到所有流向特定受支持的终结点的流量中。 该标头采用以下格式。
sec-GitHub-allowed-enterprise: ENTERPRISE-ID
企业所有者可以标识要在企业的标头中使用的正确企业 ID。
- 在 GitHub 的右上角,单击你的个人资料照片,然后单击“你的企业”****。
- 在页面左侧的企业帐户边栏中,单击 “设置”。
- 在“ 设置”下,单击“身份验证安全性” 。
- 在“Enterprise access restrictions”部分中,查找你的企业的标头。 此部分仅对启用了该功能的企业可见。
使用 标头
为获得最佳结果,请将代理配置为将该标头注入到所有流向以下受支持的终结点的流量中****。
终结点 | 用途 |
---|---|
github.com/* | 流向 GitHub.com 的 Web 流量 |
api.github.com/* | REST 和 GraphQL API 请求 |
*.githubcopilot.com | 特定 GitHub Copilot 功能所需的流量 |
这将阻止你的网络上的人员使用不为你的企业所拥有的用户帐户访问这些终结点。 除了此功能之外,你还可以通过设置 IP 允许列表来阻止来自你的网络外的流量。 请参阅“使用 IP 允许列表限制到企业的网络流量”。
Note
创建支持票证需要对 github.com/login
的访问权限。 若要确保拥有支持权利的用户可以请求帮助,你可能希望免除这些用户的限制。
取消对特定用户的限制
你可能希望取消对特定用户的限制,这些用户需要使用个人帐户为开放源代码资源做出贡献,或者在出现问题时可能需要创建支持票证。 若要处理此问题,必须将网络配置为仅为要限制的用户注入该标头。
选项包括:
- 网络隔离:创建一个注入标头的“工作”网络,以及一个不注入标头的“开放源代码”网络****。 将对“开放源代码”网络的访问权限限制在需要它的用户。
- 设备分组:如果代理或防火墙已经过身份验证,则你可以收集一组不需要标头的用户,并有选择地将他们排除在注入之外****。
不支持的功能
由于此限制仅适用于通过添加企业标头的代理发送的请求,因此特定 GitHub 功能不支持阻止用户访问或使用其个人帐户的限制。 若要阻止你的网络上的用户访问这些功能,需要进行下面所述的更改。
功能 | 关联的终结点 | 备注 |
---|---|---|
GitHub Pages | github.io | 这通常是用户生成的无法接受数据的内容。 你可能不想限制访问。 |
GitHub Codespaces | github.dev | 若要限制访问,请完全阻止该终结点。 |
SSH 访问权限 | GitHub.com 上的端口 22 | 若要限制访问,请完全阻止该终结点。 |
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 | 网络管理员已阻止对除 ENTERPRISE 企业之外的 GitHub 的访问。 请使用 _SHORTCODE 帐户登录,以访问 GitHub。 |
API 活动 | 403 | 网络管理员已阻止对除 ENTERPRISE 企业之外的 GitHub 的访问。 请使用 _SHORTCODE 企业中用户的令牌访问 GitHub。 |
安装令牌 | 403 | 网络管理员已阻止对除 ENTERPRISE 企业之外的 GitHub 的访问。 只有 SHORTCODE 企业的令牌才能访问 GitHub。 |
带有 400
代码的错误指示配置中出现错误。 请参阅 疑难解答。
本地测试示例
可以使用 Web 调试工具在本地测试网络配置。 本部分提供了使用 Fiddler 的示例。 请注意,Fiddler 和其他外部调试工具不在 GitHub 支持 的范围内****。
在以下示例中,你将添加一些 FiddlerScript 以对每个请求运行。
-
安装 Fiddler。
-
配置 Fiddler 以对 HTTPS 流量进行解密。 请参阅 Fiddler 文档。
-
在 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"; }
// 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"; }
-
单击“Save script”****。
现在,当数据包捕获处于活动状态时,将为每个指定的域注入标头。 若要启用或禁用注入,可以通过单击“File” > “Capture Traffic”来切换数据包捕获********。
可以打开和关闭此注入,以模拟使用不允许的帐户登录,然后进入网络,或在网络上尝试登录到不允许的帐户。
故障排除
如果标头注入未按预期工作,则尝试使用受影响的终结点时,你会看到带有 400
代码的错误。 这与该功能按预期工作时显示的 403
错误不同(请参阅阻止的用户显示的错误)。
通常,在以下情况下会出现 400
错误。
- 标头使用无效的数据域或企业 ID。
- 标头列出了多个企业。
- 请求包含多个
sec-GitHub-allowed-enterprise
标头。
场景 | 错误代码 | 消息 |
---|---|---|
无效的数据域或 ID | 400 | 找不到 sec-GitHub-allowed-enterprise 标头中命名的企业。 确保在防火墙或代理设置中正确输入了企业数据域。 如果此错误仍然存在,请与网络管理员联系。 |
多个企业 | 400 | 只能将一个企业与 sec-GitHub-allowed-enterprise 标头一起使用。 确保仅提供了单个企业和标头。 如果此问题仍然存在,请与网络管理员联系 |
多个标头 | 400 | 收到多个 sec-GitHub-allowed-enterprise 。 此标头必须被防火墙或代理覆盖,以确保只有单个企业被授予访问权限。 如果此问题仍然存在,请与网络管理员联系。 |