繁体   English   中英

如何在 Azure DevOps 中获取密钥库秘密 output

[英]How to get keyvault secret output in Azure DevOps

我有秘密dbname = "DatabaseName"的 kv 。

在 Azure DevOps 中,我正在使用两个任务,一个是从 Key Vault 读取机密,第二个是 Azure Write-Host $(dbname)我的代码行

日志中的 Output 是***

我想将DatabaseName设为 output。

我唯一发现的是

$DWH = "$(dbname)"
Write-Host "$($DWH.ToCharArray() -join ' ' )"

D atabase N ame是数据库名称。

是否有可能获取DatabaseName而不是***或 Database D atabase N ame

恐怕你得不到你想要的。

出于安全原因,您不能直接在日志中显示机密。 它就是这样设计的。

但是不影响你使用它。 例如,我刚刚从 Azure Keyvault 下载了机密,我可以在下一个 PowerShell 任务中检查它们:

在此处输入图像描述

结果

在此处输入图像描述

根据文档,微软从日志中屏蔽了秘密变量,因此您无法正常打印。

您可以安装从 Key Vault读取机密扩展程序,该扩展从 Key Vault 读取机密并将它们存储在常规变量中(而不是像 Microsoft 内置任务那样的机密变量)。

根据文档,可以拆分秘密和 output 子字符串:

我们努力掩盖秘密出现在 Azure 管道 output 中,但您仍然需要采取预防措施。 永远不要像 output 那样回应秘密。 一些操作系统记录命令行 arguments。 永远不要在命令行上传递秘密。 相反,我们建议您将您的秘密 map 放入环境变量中。

我们从不掩盖秘密的子串。 例如,如果将“abc123”设置为机密,则不会从日志中屏蔽“abc”。 这是为了避免在太细的级别上掩盖秘密,使日志不可读。 因此,机密不应包含结构化数据。 例如,如果 "{ "foo": "bar" }" 设置为机密,则不会从日志中屏蔽 "bar"。

这是 bash 中的一个示例,它可能会转移到 Powershell:

- task: Bash@3
  inputs:
    targetType: inline
    script: |
      # let's say the secret is Passw0rd

      # Direct output is masked:
      echo $MYSECRET
      # OUTPUTS "***"
    
      # Concatenated output is masked:
      echo "ABC$MYSECRET DDD"
      # outputs "ABC*** DDD"

      
      # Experimenting with substrings:
      firstPart=${MYSECRET::-2}
      secondPart=${MYSECRET: -2}

      # Substrings are displayed:
      echo $firstPart
      # outputs "Passw0"

      echo $secondPart
      # outputs "rd"

      # Substrings concatenated with other strings are displayed:
      echo "$firstPart-$secondPart"
      # outputs "Passw0-rd"

      # Directly concatenated substrings are masked:
      echo "$firstPart$secondPart"
      # outputs "***"

      # Secrets can be written to a file:
      echo "$MYSECRET" > test.txt

      # Secrets are even masked when being displayed as part of a file:
      cat test.txt
      # outputs "***"
    env:
      MYSECRET: $(my_secret) # This is defined in a variable group

- task: PublishPipelineArtifact@1
  inputs:
    targetPath: 'test.txt' # This pipeline artifact contains the secret unmasked
    artifact: 'TestArtifact'
    publishLocation: 'pipeline'
  displayName: 'Publish PipelineRunData artifact'

因此,我们有两种选择来获取秘密:

  1. Output 部分秘密并手动连接
  2. 下载管道工件

从安全角度来看可能并不理想,但了解系统的局限性非常重要:有权修改管道的任何人都可能访问管道使用的机密。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM