【问题标题】:Powershell Access Azure DevOps Secret VariablesPowershell 访问 Azure DevOps 秘密变量
【发布时间】:2019-11-08 21:32:53
【问题描述】:

我正在尝试从 Powershell 管道脚本中读取 Azure DevOps 机密变量。 Azure 中的变量如下所示:

我尝试以param 的形式访问秘密变量,例如

[CmdletBinding()]
Param (
    $SecurePassword = $env:Password
)

并且简单地作为一个环境变量,例如

$SecurePassword = $env:Password

不幸的是,无论使用哪种方法,变量都会继续显示为空。

我在访问 非秘密 变量时没有问题。任何帮助将不胜感激。

---------------------------------------- 编辑 ----------------------------------------

我发现文档 here 指出,如果在任务的环境部分明确映射,秘密可用于管道内的脚本。

我更新了我的 Powershell 任务并尝试将变量映射为$(Password)Password,但没有任何运气。

如上所述映射$(Password) 显示隐藏在星号后面的字符串。

【问题讨论】:

  • 如果你能这样做,它会破坏安全性——理论上你可以通过这种方式提取一堆密码。
  • 根据你日志中的信息,你应该想使用 ConvertTo-SecureString 来解密加密的环境变量,但这仅适用于使用 powershell 加密的字符串,而 azure devops 中的 Secret 变量是静态加密的使用 2048 位 RSA 密钥。它们会自动从构建或发布的任何日志输出中屏蔽。所以我认为你不能在日志中解密它。
  • 我已经编辑了我的问题以包含我发现的有用信息here

标签: powershell azure-devops


【解决方案1】:

我们需要在 Azure DevOps 中创建一个新项目,并且需要将所有管道迁移到新项目。瞧,没有人知道所有的秘密,而导出/导入并不能做到这一点。

我编写了一个脚本,将所有环境变量输出到构建摘要旁边的“扩展”选项卡中。它的格式和一切。

输出秘密的关键是通过在秘密值中插入“”短语并保存到文件来更改字符串。创建文件后,我们删除字符串“”的所有实例,保存文件,并将其作为构建摘要的扩展页面放置在那里。

我想以某种方式动态找到所有秘密,但现在手动定义变量名就可以了。

我为这篇文章重新格式化并删除了专有信息,如果有问题请告诉我:)

function GetSecretLength ($secretVar){
     $i = 0;
     while($true){
          try { 
               $secretVar.substring(0,$i)|out-null 
          } catch { 
               break
          };
          $i++; 
     }
     if ($i -le 1) { return 1 }
     else { return $i-1 };
} 
function GetSecret($secret){
     $length = GetSecretLength($secret);
     if ($length -ge 2) {
        return $secret.substring(0,$length-1 )+"<-eliminate->"+$secret.substring($length-1,1)
    } elseif ($length -eq 1) {
        return $secret+"<-eliminate->"
    } else {
        return ""
    }
} 

$var = (gci env:*).GetEnumerator() | Sort-Object Name
$out = ""

Foreach ($v in $var) { $out = $out + "`t{0,-28} = {1,-28}`n" -f $v.Name, (GetSecret($v.Value)) }

$fileName = "$env:BUILD_ARTIFACTSTAGINGDIRECTORY\build-variables.md"
write-output "dump variables on $fileName"
set-content $fileName $out

write-output "##vso[task.addattachment type=Distributedtask.Core.Summary;name=Environment Variables;]$fileName"

((Get-Content -path $fileName -Raw) -replace '<-eliminate->', '') | Set-Content -Path $fileName

您必须将所需的秘密变量添加到 Powershell 任务的“环境变量”中:

你最终得到了这个漂亮的标签:

【讨论】:

  • 你是个坏人——但那行得通 :D 谢谢!截至目前,在这种情况下没有“扩展”选项卡,而是在摘要下的一个部分。
【解决方案2】:

为什么不将密码作为机密存储在密钥库中?然后有用于访问秘密的天蓝色命令,并避免这一切。哎呀,我们生成随机密码,将它们存储在密钥库中,然后访问适当资源中的内容,而无需在 powershell 命令中公开解密的秘密,就像在 ARM 模板中用于 azure sql server 数据库一样。

我知道这并不能解决您最初的问题,但它是一种可行的解决方法。

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 2020-07-06
    • 2021-07-14
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2020-01-25
    • 2020-10-14
    相关资源
    最近更新 更多