为啥 TFS 机密不是 SecureString?

Posted

技术标签:

【中文标题】为啥 TFS 机密不是 SecureString?【英文标题】:Why is a TFS secret not a SecureString?为什么 TFS 机密不是 SecureString? 【发布时间】:2021-05-25 13:36:35 【问题描述】:

根据documentation,您必须像这样将 TFS 2018 中的秘密传递给 powershell:

Param(
   [string]$sauceArgument,
   [string]$secretSauceArgument
)
Write-Host No problem reading $env:SAUCE or $sauceArgument
Write-Host But I cannot read $env:SECRET_SAUCE
Write-Host But I can read $secretSauceArgument "(but the log is redacted so I do not
           spoil the secret)"

将其作为字符串传递不允许在凭据中使用密钥。我只能在通过 ConvertTo-SecureString -AsPlainText 转换它时使用它,根据documentation,这应该是不好的做法:

$Secure_String_Pwd = ConvertTo-SecureString $secretSauceArgument -AsPlainText -Force

如果我将输入类型从 [String] 更改为 [SecureString],我会收到以下转换错误:

Cannot process argument transformation on parameter 'secretSauceArgument'. Cannot convert the "***" value of type "System.String" to type "System.Security.SecureString".

真的需要转换吗?这是否意味着使用 Secrets 是不好的做法?

更新以澄清我的问题:我能够将秘密传递到 powershell。我无法使用机密作为凭据(只能通过 ConvertTo-SecureString -AsPlainText -Force 这是不好的做法)。

【问题讨论】:

【参考方案1】:

Azure DevOps 管道中的秘密变量使用 2048 位 RSA 密钥进行静态加密。代理上提供了秘密供任务和脚本使用。

您使用了系统保留的变量前缀secret,因此您无法读取它。尝试修改变量名,不要使用系统保留的变量前缀。

查看Variable characters:

用户定义的变量可以由字母、数字、._组成 人物。不要使用保留的变量前缀 系统。它们是:endpointinputsecretsecurefile。 以这些字符串之一开头的任何变量(无论 大写)将不适用于您的任务和脚本。


更新:

现在我更了解您的问题了。根据我的测试,即使您在脚本中定义了$password = '123',您仍然需要-AsPlainText -Force。脚本中定义的所有变量都被视为字符串,管道中没有SecureString。您可以尝试从文件中的加密字符串创建安全字符串:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/convertto-securestring?view=powershell-7.1#example-2--create-a-secure-string-from-an-encrypted-string-in-a-file。

【讨论】:

如果我将名称更改为 mySauce,我会收到同样的错误:无法处理参数“mySauce”的参数转换。无法将“System.String”类型的“***”值转换为“System.Security.SecureString”类型。 我使用了文档示例的名称,因此根据您链接的站点,这是错误的:docs.microsoft.com/en-us/azure/devops/pipelines/process/… 在您的原始帖子中,您提到了文档docs.microsoft.com/en-us/azure/devops/pipelines/process/…,所以我假设您已经在管道的 Web 界面中设置了秘密。 如果你从脚本中设置一个变量,你可以使用前缀secret。管道中的脚本可以定义一个变量,以便管道中的后续步骤之一可以使用它。此方法设置的所有变量都被视为字符串。 不确定我们讨论的是否是同一个问题:我能够将机密从 Web 界面和脚本传递到其他任务。工作正常。我无法在 powershell 中将机密用作 SecureString。我认为秘密应该用于凭据,因此应该是 SecureString 或安全地转换为 SecureString。 (我只能用 AsPlainText 进行转换,这是不好的做法)...【参考方案2】:

我个人的看法是:TFS 机密对于 Powershell 中的凭据来说并不是最佳选择 - 这很令人惊讶,因为我希望机密的主要用途是用于凭据。

Cece Dong 的回答 - MSFT 使用文件代替是一个可靠的选择。

【讨论】:

如果我的回复对您有帮助,您可以Accept it as an Answer,这对阅读此主题的其他社区成员会有所帮助。 我知道。谢谢。

以上是关于为啥 TFS 机密不是 SecureString?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法进入数据库? jacky@本地主机密码:NO

SecureString 在 C# 应用程序中是不是实用?

Rfc2898DeriveBytes + PBKDF2 + SecureString 是不是可以使用安全字符串而不是字符串?

为啥 TFS 代理没有发现 VSTEST 功能

为啥 Azure DevOps / TFS 中忽略了我的 repositoryPath?

vs2010 tfs个别文件为啥没有签入签出了