第三方网站如何生成构建/代码覆盖率徽章?

4
我的工作设置包括由公司托管的Github企业服务器和Azure Devops管道。像shields.io这样的网站,我可以生成构建成功或代码覆盖率的徽章,似乎从未在DevOps中进行身份验证。然后,徽章托管在shields.io上,这意味着这个第三方网站必须以某种方式访问我的构建过程。它们看起来像这样:

enter image description here

由于Github以及所有构建流水线显然都是公司内部的,我可以看到三种可能的工作方式:

  1. 尽管流水线和其他内容是私有的,但构建成功状态会公开托管在整个网络上。这是设计上的问题,因为它并不被认为是安全风险。知道我的内部项目的组织/项目名称/定义ID后,没有其他事情可以做。

  2. 这不应该发生,可能配置有误。我的设置可能存在漏洞。

  3. 有一些我不知道的身份验证正在进行,例如只有当我的浏览器登录到Azure时才能看到徽章(似乎在私人模式下也可以使用)

我在网络或stackoverflow上找不到任何关于这方面的信息。如果有任何资源可以解释这个问题,我会很高兴,因为我不确定是否可以安全地使用它们。使用shields.io是否存在安全风险?


如果您访问shields.io上的Azure DevOps构建徽章页面,它会要求输入项目ID。这个ID可能是私有的,提供此ID将对您进行身份验证,以便从Azure接收构建状态。 - GoodDeeds
项目ID似乎只是一个向上计数器,我无法更改它。由于这种方式并不安全,我无法想象它被用作任何形式的身份验证。 - Thomas
在我看到的示例中(单击/azure-devops/build/:organization/:projectId/:definitionId),它是一个很长的字符串。但我只是猜测,无法回答。Travis CI为私有存储库使用了类似的策略。 - GoodDeeds
shields.io 的示例是错误/过时的:仅传递项目名称而不是项目 ID 也同样有效。 - Thomas
1个回答

7
像你提到的标记通常只是没有信息的空白SVG图像(可以在此处查看模板)。
因此,要创建SVG(或PNG):
- 服务通过某种CI系统从您那里获取更新数据 - 该服务生成相应的图像(SVG或PNG),并附加到某个`GET`端点
该服务有两种方法来实现这一点:
- 使用shields.io作为服务,将包含如何生成图像的信息的JSON发送到其JSON端点 - 使用shields.io作为库或使用任何自定义手段在内部实现图像生成。
因此,即使在内部调用shields.io,具有徽章的SaaS应用程序通常会自己提供它们。这意味着每个服务都可以自己实现任何安全措施。
传递给shields.io的数据通常包括两个词和一些颜色。因此,为了生成徽章,不会暴露太多信息(请参见下面的示例)。此外,服务和shields.io之间的通信是加密的,并通过HTTPS发送。
例如,出于隐私考虑,大型公司通常具有仅限内部访问的托管解决方案,因此徽章也仅在内部可访问。
你问题中特别提到的徽章只包含来自应用商店或GitHub项目的公共数据,只要项目本身是公共的,这些数据通常都是公共的。那些徽章经常使用shields.io API根据公共数据自动生成它们。
但是,如果您查看Coveralls或Travis等内容的徽章,则会发现它们托管自己的徽章:
- `` - ``
以下是使用shields.io作为库并提供徽章的typescript示例:
首先,使用以下命令安装gh-badges
npm i gh-badges --save

这就是如何使用它:

import { BadgeFactory } from 'gh-badges';

(async () => {
  const bf = new BadgeFactory();

  const format = {
    format: 'svg',
    text: [ 'coverage', '90%' ],
    labelColor: '#894597',
    color: '#5d5d5d',
    template: 'for-the-badge',
    logo: [
      'data:image/png;base64,iVBORw0KGgoAAAA',
      'NSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJL',
      'R0QA/wD/AP+gvaeTAAAA/0lEQVRYhe3WMU7DM',
      'BjFcadqh0qdWWBl7QU4Ss/AjsREF8RdOhYO0E',
      'qoN2DhFIgBOvBjIIMVxSFyUiEhP8lD7C/v/T9',
      '7sEMoKkoIe+Npn8qpOgCM2VBVVa1ZkzFDcjQd',
      'apDqLIR+u/jnO1AACkABKABdAO9DjHEWfb7lA',
      'LwOAQghXPXx6gJ4zE3GJIRwE0095Zhc4PO3iz',
      '7x7zoq+cB5bifr9tg0AK7xFZXcZYXXZjNs+wB',
      'giofG8hazbIDaeI5dFwAu8dxY2mE+KDyCWGCT',
      'YLj3c86xNliMEh5BVLjFseNEjnVN8pU0BsgSh',
      '5bwA5YnC25AVFjhpR6rk3Zd9K/1Dcae2pUn6m',
      'qiAAAAAElFTkSuQmCC'
    ].join('')
  };

  return bf.create(format);
})();

这基本上是与前面提到的服务端点一样发送到shields.io作为服务端点的数据。

您可以在控制器上下文中查看完整示例 这里这里

关于风险,主要考虑实际上暴露了哪些数据。几乎没有什么。如果您担心数据隐私问题,只需自己生成徽章并将其作为您想要的私人服务或嵌入。


1
非常感谢您提供详细的答案。我的理解是,我们的流水线构建状态确实是公开的,并且可能会被shields.io或第三方记录/滥用,但他们真的没有太多可获得的好处,因为这不是非常有用/易误用的信息。 - Thomas
1
@Thomas 是的,听起来很正确 :-) 只要没有身份验证并且服务器公开暴露,徽章图像也会被公开暴露。但攻击者需要知道确切的端点才能获取图像以获取一些信息,即使如此,他们也几乎不会知道什么。我认为在大多数情况下,这是公司愿意承担的小风险,当他们不这样做时,他们可以在内部安全地创建徽章。 - Thatkookooguy
1
一个可行的安全解决方案示例:自托管的GitLab已经内置了徽章功能。因此,由于GitLab仅由连接到公司内部网络的计算机访问和托管,GitLab为项目或特定分支\构建生成的徽章也只能在内部访问。 - Thatkookooguy
1
另一个安全解决方案的例子是在 CI\CD 中运行一个小脚本,每当构建发生时收集构建信息和覆盖率信息;在脚本中生成图像(不调用任何 API 并暴露数据);并将图像嵌入\上传到您想要的任何安全位置。不依赖于 CI\CD 在其端创建的徽章。但是...这可能有点过度了 :-) - Thatkookooguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接