Mozilla试图保护其在GitHub上的存储库免受恶意更改。 正如最近的
Gentoo事件所表明的那样,此类攻击是真实的。
Mozilla最初使用GitHub作为备份托管。 像Gentoo一样,原始存储库也存储在自己的基础架构中。 尽管大多数Firefox代码仍使用其自己的基础结构进行分发,但是许多项目仅存在于GitHub上。 有些只是实验,有些则用于生产中(例如
Firefox帐户 )。 需要保护此类“敏感”存储库免受恶意编辑,同时又不使普通人的提交复杂化。
此处描述了针对从受损存储库中分发(或部署)代码的实际步骤。 我们分享经验和
一些审核
工具 。 这样的保护几乎不会干扰GitHub中的正常工作流程。
在这里,我们考虑通过此站点的独特机制来入侵GitHub帐户的风险。 正如Gentoo案和其他事件所显示的那样,如果发生黑客入侵,用户可以访问的所有代码都会受到威胁。
问题的实质
GitHub是一个很棒的生态系统,具有许多扩展或“应用程序”,可简化特定的工作流程。 应用程序收到用户的许可,可以代表他执行操作。 他们可能会请求权限,包括更改或添加其他帐户。 GitHub清楚地显示了这些请求:用户必须通过Web界面批准它们,但并不是每个人都对后果很熟悉。 许多人不理解访问个人存储库的权限会代表用户对GitHub上的任何存储库授予相同的访问权限。
过多的权限会通过机密信息危害存储库,而存储库的管理员则看不到任何内容。 他所能做的最好的事情就是在事发后注意到恶意提交。 GitHub和Git都无法配置为阻止或标记这种恶意提交。 仅外部监控。
实作
以下建议来自我们的
安全系统 ,仅针对本文已删除Mozilla的特定功能。 我们尽可能地借鉴Internet的最佳实践,使用GitHub的功能,并尽量避免使开发人员的生活变得过于复杂。
给组织的建议
- 所有员工必须执行2FA。
- 对于所有或至少具有更高权限的用户:
- 向组织或管理员提供联系人(电子邮件,IM)(GitHub允许您隐藏联系人信息以保护隐私)。
- 确保将您的帐户可能受到的威胁(例如,关于笔记本电脑被盗的情况)告知组织或管理员。
存储库准则
- 重要存储库仅应在遵循上述建议的组织中托管。
- 定义和配置生产分支:
- 禁止强行推。
- 只提交给少数用户的权限。
- 将这些限制也应用于管理员和所有者。
- 使用先前已知的GPG密钥签署所有提交。
工作流程建议
- 应当使用与先前已知的GPG密钥签名的标签来记录值得审核的部署,发行和其他事件。
- 仅在对所有已签名的提交和正确密钥的标签进行审核之后,才应发布所有部署和发行版。
这些保护措施的实施需要一定的成本,尤其是与承诺的签署有关。 我们已经开发了用于审核配置的工具,并计划发布用于审核提交的工具。 所有这些都在
我们的存储库中 。

这是一个审计示例。 首先,我们获得
octo_org
组织的数据的本地副本,然后为每个存储库编译一个报告:
$ ./get_branch_protections.py octo_org 2018-07-06 13:52:40,584 INFO: Running as ms_octo_cat 2018-07-06 13:52:40,854 INFO: Gathering branch protection data. (calls remaining 4992). 2018-07-06 13:52:41,117 INFO: Starting on org octo_org. (calls remaining 4992). 2018-07-06 13:52:59,116 INFO: Finished gathering branch protection data (calls remaining 4947).
现在,使用本地缓存的数据,您可以生成任何报告。 例如,一份报告显示符合上述建议:
$ ./report_branch_status.py --header octo_org.db.json name,protected,restricted,enforcement,signed,team_used octo_org/react-starter,True,False,False,False,False octo_org/node-starter,False,False,False,False,False
如您所见,只有
octo_org/react-starter
包含防止在生产分支上强制推送的保护。 结果为CSV格式,可轻松插入电子表格中。
你怎么能帮忙
我们仍在执行这些建议并一直学习。 如果您认为我们的
存储库安全建议适合您,请帮助简化实施。
在提示页面上分享您的经验,或在
GitHub-Audit存储库中
打开 故障单 。