即使值发生变化,如何保持 Gitlab 变量被屏蔽?

How to keep Gitlab variable masked even the value is changed?

我们有一个名为 SECRET_JAMES_BOND 的屏蔽变量,其值为 /vault/abc。在管道执行期间,日志显示为 [MASKED]。当我们将值更改为 ABCDE 时,显示该值。即使我们不更改它,如果我们执行SECRET_JAMES_BOND = $(echo $SECRET_JAMES_BOND) | base64),我们也可以很容易地从日志中获取值。通过回显 base64 值,它将显示在 UI 上,因为该值已更改。当我们复制编码的 base64 字符串并对其进行解码时,我们得到了实际的秘密。如果值已更改,我们如何防止屏蔽变量回显?屏蔽变量不应该显示 [MASKED] 即使值与其原始值不同吗?

How can we prevent a masked variable from echoing if its value has been changed

简而言之:如果有访问权限的人决心这样做,你就不能这样做。

屏蔽并不意味着阻止有权控制 CI 步骤的开发人员通过作业泄露秘密。这是为了防止意外泄露。有无数种方法可以通过作业输出来泄露价值,不可能涵盖所有这些方法。

如果您想防止显示秘密的 base64 表示,您可以将该值注册为另一个屏蔽变量,但必须提前完成。

Shouldn't masked variables show [MASKED] even the value is different from its original value ?

GitLab 应该屏蔽屏蔽变量的一些常见变体,例如 base64、url-encoded、向后等。其他 CI 服务(Travis CI for示例)执行此操作。

但是,这仍然只是出于意外披露的目的。

例如,我看到开发人员不小心泄露秘密的另一种方式是使用 curl-v 标志。

script:
  - curl -v https://myusername:${SECRET_JAMES_BOND}@myhost.example.com/secret

在上面的示例中,curl 的输出将(部分)显示如下输出:

> Authorization: Basic bXl1c2VybmFtZTpzZWNyZXQ=

因此,如果 GitLab 也屏蔽了密码的 base64 变体,就可以防止这种意外泄露。

但正如我提到的,有无数种方法可以输出秘密:url-encoding、凯撒密码、rot-N(rot16、rot24、rot32 等),甚至是自定义方式,例如回显每个字符一次一行,可能顺序相反。

所以,实际上,您只能切实防止事故发生,而不能防止有权在作业中执行代码的用户恶意渗漏。