如何在Azure DevOps中获取密钥仓库秘密输出

时间:2019-11-12 22:05:11

标签: azure powershell azure-devops azure-pipelines azure-keyvault

我的kv带有秘密 dbname =“ DatabaseName”

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

日志中的输出为***

我想获得DatabaseName作为输出。

我唯一发现的是

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

输出为D a t a b a s e N a m e

是否有可能获得DatabaseName而不是***D a t a b a s e N a m e

3 个答案:

答案 0 :(得分:1)

恐怕您无法获得想要的东西。

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

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

enter image description here

结果

enter image description here

答案 1 :(得分:1)

根据docs,Microsoft屏蔽了日志中的秘密变量,因此您无法正常打印它。

您可以安装Read Secrets from Key Vault扩展名,该扩展名从Key Vault读取机密并将其存储在常规变量中(而不是存储在Microsoft内置任务之类的机密变量中)。 / p>

答案 2 :(得分:0)

根据documentation,可以拆分secrets并输出子串:

<块引用>

我们努力掩盖秘密,以免出现在 Azure Pipelines 中 输出,但您仍然需要采取预防措施。永远不要把秘密作为 输出。一些操作系统记录命令行参数。永不通过 命令行上的秘密。相反,我们建议您映射您的 环境变量中的秘密。

我们从不掩盖秘密的子串。例如,如果设置了“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. 部分输出秘密并手动连接
  2. 下载管道工件

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