从工具到实践:如何在GitHub上保障开源项目安全?
1998年,Christine Peterson创造了 “开源软件”这个词。她解释道:“这是刻意为之,为了让其他人更容易理解这个领域”。同年,O’Reilly组织了首届“开源峰会”。
开源软件受到更多人青睐原因在于,用户对软件拥有更多的控制权因为他们可以检查代码。对于长期项目来说,开源软件被认为是稳定的,因为这些项目遵循开放的标准,即便维护者停止工作,也不会凭空消失。活跃的开发者社区十分重要。
比起闭源软件,开源需要更多地考虑安全问题,因为任何人都可以查看并修改代码。贡献者可以发现错误并提交一个PR对代码进行变更。与此同时,这也伴随着一系列的安全问题。
什么是软件供应链攻击?
当有人利用外部供应商或能够访问你的企业的数据和系统的第三方组件来渗透你的数字基础设施时,就会发生软件供应链攻击。供应链攻击的类型多种多样,本文将聚焦于开源供应链。
任何人都可以通过开源举措为项目的开发做出贡献。利用这个切入点,黑客可以将漏洞编入开源项目中,当企业将该项目引入其软件中时也引入了新的威胁,而且往往是在不知情的情况下,通过遍历依赖或间接依赖引入。
Web 应用安全的重要性
Web 应用安全是一个概念,它涵盖了一系列嵌入Web应用程序的安全管控,以保护其资产免受潜在的恶意行为的影响。它涉及安全开发实践,在整个软件开发生命周期(SDLC)中实施安全措施,以发现项目及其配置中的安全漏洞。
好消息是你可以通过使用不同的应用程序及 action 在 GitHub 内实现安全保护,不管是一个简单的demo项目,还是大型开源项目。基于此,开源项目可以拥有与闭源软件相同的安全水平。
Section 1:GitHub Marketplace 及 GitGuardian 应用
什么是 GitHub Marketplace?
2016年的GitHub Universe上,首次引入GitHub Marketplace。它是一个开发者可以找到集成插件并将其落实到工作流程中的地方。
如何利用安全工具创建基础流水线并实现防护?
你可以利用GitHub Marketplace中的安全应用和action来保护你的流水线每个开发阶段的安全。
一个基础的流水线包括:
软件成分分析工具,专注于识别代码库中的开放源码,以便维护者和贡献者能够管理它们的安全和许可证合规问题
防止密钥泄露的工具
代码分析工具,它是一种在程序运行之前通过检查源代码进行调试的方法,一般根据一组编码规则分许一组代码
如何为你的项目选择相关应用?你需要考虑些什么?
选择工具、应用或是action 主要取决于你的项目或团队的工作流程。你们使用的是什么类型的技术栈?你们是部署到Docker还是使用K8S?在你们的流水线中有多少个步骤?你能在每个步骤都实施防护吗?
然后,你将会找到许多满足你需求的工具和应用。而对于开放源码软件的维护者来说,好消息是这些应用程序通常对公开的代码库或开源软件项目是免费的。
你可以在一个阶段中采用2个工具,比如 Synk 和 Mend 扫描你的依赖项。这两种工具在覆盖率方面都会有其优点和缺点,并会帮助你更好地了解你的项目的依赖项。如果你认为一个工具比另一个好,你仍然可以删除你不需要的那个。
让我们来看看OWASP Zap基线扫描这个GitHub action,它会扫描目标URL的漏洞,并在你提交PR时将其反馈给你的项目。
当你打算在项目中采用一个action或一个应用时,你应该在项目页上看到各种信息——GitHub是否验证该action?上图中显示为已验证,你可以在右侧看到一个蓝色的小勾。有多少贡献者在为这个项目工作?该项目获得了多少颗星?有多少issue和PR?
再导航到 GitHub 仓库,看看维护者和贡献者是如何积极推动这个项目的。它的文档是否完善?他们是否提供了基本的使用范例?(比如一个简单的YAML文件)是否容易实现?是否能与你项目的编程语言兼容?
接下来,我们来看看 GitGuardian 的实际用例。你可以直接在 Marketplace 中搜索到它。
点击产品页,你将获得更多信息。作为项目的维护者,你将会用 OWASP Action 检查我们前面提到的要求是否达标。我们可以看到 GitHub 是否验证了该应用、应用安装数量以及更多关于该组织的其他信息。
划到页面底部,你将看到价格及安装信息。GitGuardian为公开的代码库提供免费的监控。选择你想要安装的账号,并点击“Install it for free”。
你可以在所有代码库上都安装 GitGuardian 或者选择其中几个。你可以为需要安全防护的每个阶段重复这一过程。
Section 2:管理开源项目
当贡献者提交PR时,它将触发流水线中集成的所有应用和action。理想状况下,就GitGuardian而言,你希望凭证不被推送到源代码中,并且在贡献者提交PR之前停止这一行为。你可以在你的CLI上采用 GitGuardian Shield(ggsheild),并与预提交的 git hook集成以增强防护,确保凭证没有被推送到源码中。
如果没有设置 ggshield,在代码库上推送密钥的贡献者会在提交PR时收到告警。下图虚拟PR提交的过程中,你可以看到一些工具被触发。
你可以让其中一些工具在主干分支上是必须触发的。要做到这一点,需要进入项目设置,在【Code and automation】中点击【Branches】。在这里,你可以添加分支保护规则,要求在合并PR前必须通过状态检查。
如何从ChatOps中获取价值?
ChatOps 是一个协作模型,将人、工具、流程和自动化连接到一个透明的工作流程中。使用Slack进行讨论,并为特定的工具设置专门的频道,这将有助于你了解项目中发生的事情。监控和设置告警是重要的一环,可以帮助开发人员获得正确的信息。
GitHub 项目:如何利用面板追踪安全任务
在开发开源项目时,你可以利用GitHub projects来列出你为某一特定功能所要做的所有任务。你可以创建标签和epics(milestones)来跟踪进度或用于提出问题。还可以创建一个安全标签来追踪你项目中的漏洞。
你可以使用自动化项目或面板,其中的卡片会根据PR的状态相应地移动。这个方式可以很好地展示功能开发进度以及你可能需要帮助的地方。
在 README 文件中展示项目的健康状态
如果你想为你的项目吸引更多的贡献者,不要忘记使用应用及action工作流程提供的标签或tag来展示项目的健康状态,并将其添加到项目的README文件顶部。你通过GitHub文档了解更多徽章设置:
Section 3:安全加固开源项目
除了在流水线各环节添加安全防护外,你还可以通过采用以下最佳实践加固开源项目:
- 采用最小权限: 在成员权限部分将基本权限设置为无权限,这样成员只能克隆和提取公共代码库。如果要给贡献者更多的权限,维护者需要把他们加入团队或让他们成为单个代码库的协作者。创建团队、添加用户,并将他们分配到具有特定权限的特定代码库中。
- 让所有维护者和贡献者都必须使用2FA。 到2023年底,GitHub将要求所有贡献代码的用户启用一种或多种形式的双因素认证。
- 保护主分支: 如上所述,一定要保护主分支,以免被维护者意外删除。
启用提醒和告警: 更新email地址以保证你能收到来自项目的提醒信息
添加正确的许可证: OSS许可证可以保护贡献者和用户。如果你不确定应该选择哪个许可证,可以查看这篇文章进行简单的入门,并且确保在你的代码库中有 LICENSE.md 或 LICENSE.txt 文件。
审查应用程序、工具和Webhooks的列表: 如果你在流水线中的一个步骤中使用了多个应用程序、工具或webhooks,请review 它们是否仍然适用,并删除任何陈旧过时的或未使用的组件。
如果你依赖 GitHub Actions 来构建、测试和部署你的项目,一定要检查你的工作流程配置。访问下方链接可以查看 GitHub Actions 安全最佳实践:
https://blog.gitguardian.com/github-actions-security-cheat-sheet/
总 结
开源组件可以成为大规模网络攻击的一个载体。去年我们已经看到了Apache Log4j 的漏洞,这是一个开源的Java包,用于支持许多Java应用程序的活动记录。虽然不是所有用Java编写的软件都有漏洞,但受影响的软件包被开发人员广泛使用,有许多应用程序和服务都使用这个库。大型科技公司,如微软、VMWare、亚马逊、IBM等都受到影响。
使用不同的工具和防护在整个流水线中拥有可见性对于减少攻击面至关重要,在本文中我们已经看到借助 GitHub Marketplace 的应用和Action可以帮助达成这一目标。软件供应链安全管理平台SEAL 也可以帮助用户获取项目的全局安全可见性,目前已开放免费试用:seal.io/trial。
作为维护者和贡献者,可以先创建一个小型流水线,并尝试试用其中一些工具,为每个贡献者安全加固GitHub项目。
不停地实践是保证安全的关键一环,但更重要的是,不要在GitHub上push你的密钥!
从工具到实践:如何在GitHub上保障开源项目安全?的更多相关文章
- Pull Request的正确打开方式(如何在GitHub上贡献开源项目)
Pull Request的正确打开方式(如何在GitHub上贡献开源项目) GitHub的官方帮助如下: Fork A Repo: https://help.github.com/articles/f ...
- 如何参与github上的开源项目
今晚比较闲,于是乎装修了一下博客,顺便将一块心病(怎么参加github上的开源项目)解决了,最后发个文章总结下 这些是参考的链接 http://blog.csdn.net/five3/article/ ...
- GitHub Android 最火开源项目Top20 GitHub 上的开源项目不胜枚举,越来越多的开源项目正在迁移到GitHub平台上。基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要。利用这些项目,有时能够让你达到事半功倍的效果。
1. ActionBarSherlock(推荐) ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便 ...
- Fragment为载体可自己主动布局的CardView(GitHub上写开源项目初体验)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 前些天一直在看Android5.0 的Material Desgin,里面新增 ...
- 如何在github上传本地项目代码
首先你要在github上申请一个账号 网址:https://github.com/ 然后你要下载一个git工具 网址:https://gitforwindows.org/ 进入官网直接下载就行,下载完 ...
- 如何在github上fork一个项目来贡献代码以及同步原作者的修改
[-] 如何贡献自己的力量 如何让自己的项目与原作者的项目保持同步 作为一个IT人,通过github进行学习是最快的成长手 段.我们可以浏览别人的优秀代码.但只看不动手还是成长得很慢,因此为别人贡献代 ...
- 【转】如何在github上fork一个项目来贡献代码以及同步原作者的修改 -- 不错
原文网址:http://www.cnblogs.com/astwish/articles/3548844.html 作为一个IT人,通过github进行学习是最快的成长手段.我们可以浏览别人的优秀代码 ...
- 在github上参与开源项目日常流程
转载自:http://blog.csdn.net/five3/article/details/9307041 1. 注册帐号 打开https://github.com/,填写注册信息并提交. 2. 登 ...
- 如何在本地运行查看github上的开源项目
看中了一款很多星星的github的项目,想把这个项目拉到自己的电脑上运行查看项目效果,该怎么做?示例:我们今天要看的 github项目地址:https://github.com/lzxb/vue-cn ...
- Pull Request的过程、基于git做的协同开发、git常见的一些命令、git实现代码的review、git实现版本的管理、gitlab、GitHub上为开源项目贡献代码
前言: Pull Request的流程 1.fork 首先是找到自己想要pull request的项目, 然后点击fork按钮,此时就会在你的仓库中多出来一个仓库,格式是:自己的账户名/想要pull ...
随机推荐
- Libgdx游戏开发(2)——接水滴游戏实现
原文:Libgdx游戏开发(2)--接水滴游戏实现 - Stars-One的杂货小窝 本文使用Kotlin语言开发 通过本文的学习可以初步了解以下基础知识的使用: Basic file access ...
- 关于Jenkins-Item-Office 365 Connector-下的多选框的参数定义
在Jenkins的Item中Office 365 Connector下,我们有时会使用到,多选框(复选框),目的是可选择多个多个条目赋值给指定的变量 然后在Build Triggers中可以进行引用, ...
- Educational Codeforces Round 106 (Rated for Div. 2)
就ac了2题... A题一开始题意模模糊糊的似懂非懂,然后自己按样例推出了题意,简单题很容易ac了.还是自己的英语水平太菜了.... B题根据0和1的位置关系能看出来,因为0不能在1后面, 所以有00 ...
- python的基本运用
python基础 Python语言是一种解释型.面向对象.动态数据类型的高级程序设计语言 开发者:Guido van Rossum(人称龟叔) 基本概念 1.变量 变量名必须是大小写英文字母.数字或下 ...
- 浅谈MySQL、Hadoop、BigTable、Clickhouse数据读写机制
个人理解,欢迎指正 数据库 引擎 写数据 读数据 补充 MySql InnoDB:支持事务,高速读写性能一般 Myisam:不支持事务,高速读写性能好 以InnoDB更新一条记录为例 1.B+Tree ...
- bean文档类型定义
ELEMENT:表示当前 (bean*):表示0到多个bean元素 (property*):表示0到多个property元素 ATTLIST:表示属性 #REQUIRED:表示不可缺少 #IMPLIE ...
- 4.websocket基本概念
websockey的模式就是在于当前端向后端发送请求创建一个websocket链连接之后,连接默认不断开,前端和服务端就维护了一个连接,前端可以通过连接给服务端发消息,服务端也可以通过连接给前端发消息 ...
- 记录一次sshd服务启动失败
记录一次sshd服务启动失败 问题描述: 服务器开机之后发现无法通过远程连接服务器终端,但是服务器并未宕机,于是考虑到sshd服务出现异常 解决思路: 查看服务器sshd服务运行情况 [root@ha ...
- FileNotFoundError: Could not find module libmxnet.dll
解决方法:把CUDA的bin目录下的dll文件全部复制到libmxnet.dll所在的目录 问题原因:libmxnet.dll引用了一些CUDA的dll,但是找不到路径.
- nrf9160做主控连接阿里云——(mqtt_simple例程)
简介:基本每一个云都支持MQTT,这种轻量级协议在数据量不大的应用上是一个很好的选择.上一篇博客使用SLM例程去连接了阿里云,本次使用mqtt_simple去连接云进行测试,关于一些已近在前面文章中演 ...