在自动化中使用 SecretStore

本文提供了在自动化方案中使用 Microsoft.PowerShell.SecretStore 保管库的示例。 通过 SecretStore 保管库,可以安全地存储和检索需要在本地计算机上的自动化管道中使用的密码、令牌和其他机密。

设置运行自动化的主机

对于此示例,必须先安装和配置 SecretManagement 模块。 此示例假定自动化主机正在运行 Windows。 必须在主机上自动化帐户的用户上下文中运行这些命令。

Install-Module -Name Microsoft.PowerShell.SecretStore -Repository PSGallery -Force
Install-Module -Name Microsoft.PowerShell.SecretManagement -Repository PSGallery -Force
Import-Module Microsoft.PowerShell.SecretStore
Import-Module Microsoft.PowerShell.SecretManagement

配置 SecretStore 保管库

还必须创建一个密码作为 SecureString ,用于保护 SecretStore 保管库的安全。 使用的自动化系统可以通过某种方式安全地提供可用于保护保管库的密码。 例如,GitHub 提供了一种在 GitHub Actions 中安全地存储和使用机密的方法。 有关详细信息,请参阅在 GitHub Actions 中使用机密

在此示例中,密码是安全导出到 XML 文件的 SecureString ,并由 Windows 数据保护 (DPAPI) 加密。 以下命令会提示输入密码。 在此示例中, UserName 并不重要。

PS> $credential = Get-Credential -UserName 'SecureStore'

PowerShell credential request
Enter your credentials.
Password for user SecureStore: **************

获得密码后,即可将其保存到加密的 XML 文件。

$securePasswordPath = 'C:\automation\passwd.xml'
$credential.Password |  Export-Clixml -Path $securePasswordPath

接下来,必须配置 SecretStore 保管库。 配置将用户交互设置为 None,以便 SecretStore 永远不会提示用户。 配置需要密码,密码作为 SecureString 对象传入。 使用 -Confirm:false 参数,以便 PowerShell 不会提示确认。

Register-SecretVault -Name SecretStore -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
$password = Import-CliXml -Path $securePasswordPath

$storeConfiguration = @{
    Authentication = 'Password'
    PasswordTimeout = 3600 # 1 hour
    Interaction = 'None'
    Password = $password
    Confirm = $false
}
Set-SecretStoreConfiguration @storeConfiguration

安装并配置保管库后,可以使用 Set-Secret 添加自动化脚本所需的机密。

在自动化中使用机密

必须以安全的方式提供 SecretStore 密码。 此处,密码是从使用 Windows 数据保护 (DPAPI) 加密的文件导入的。

注意

这是仅限 Windows 的解决方案,但另一种选择是使用 CI 系统提供的安全变量,例如GitHub Actions。

自动化脚本需要解锁保管库才能检索脚本中所需的机密。 cmdlet Unlock-SecretStore 用于解锁此会话的 SecretStore 。 密码超时已配置为 1 小时。 在该时间内,保管库在会话中保持解锁状态。 超时后,必须再次解锁保管库,然后才能访问机密。

$password = Import-CliXml -Path $securePasswordPath
Unlock-SecretStore -Password $password
$automationPassword = Get-Secret -Name CIJobSecret