在 PowerShell 脚本中保护密码

Securing passwords in PowerShell scripts

我正在编写一个 PowerShell 脚本,第三方应用程序每隔几个月就会自动调用它来执行以下操作:

  1. 使用 [System.Web.Security.Membership]::GeneratePassword() 随机生成一个密码,然后将该密码与 Export-PfxCertificate 和 OpenSSL 的 passin.
  2. 一起使用
  3. 使用静态密码通过 COM API 向不支持 API 密钥或任何东西的第三方系统进行身份验证。

安全执行此操作的最佳方法是什么?

据我所知,#1 没有任何问题,但我在网上阅读的关于#2 的所有内容都建议:

你检查过 Azure Key Vault 或类似的东西了吗?

如果您走那条路,请查看 Az 模块(Windows PowerShell 5.1 或 PowerShell Core)。 Az.KeyVault 子模块有很多函数可以使用 vault。

编辑:为了解决安全问题,我们对该系统知之甚少。但是,这些是我要研究的内容:

  1. 最小权限:确保此服务帐户只能执行它应该执行的操作。
  2. 使用时间限制:如果知道应该执行的时间表,则将系统配置为仅允许帐户在此期间成功验证,甚至允许 JIT 权限(如果可能)。
  3. 基于位置的限制:只允许帐户从该位置进行身份验证。最好的结果,能够限制到应该执行它的特定服务器(可能需要专用的出口 IP)。
  4. 审核:监控这些设置的更改并发出警报。

如果这些都已到位,您的暴露是实际系统受到损害,攻击者可能会在允许的 window 期间在允许的范围内进行意外更改。在这一点上,这是一个相当低的风险,这比不实施此类控制要好得多。

这些可能会在应用程序中实现,或者如果可以与应用程序集成,则可以通过第三方可信身份验证源实现。

对于 #2,有很多 resources/articles 涉及使用 PowerShell 时保护凭据。

从 Windows 凭据管理器开始...

Install-Module -Name "CredentialManager"

Get-Command -Module "CredentialManager"

$Target = "YourServerName"
$UserName = "Administrator"
$Secure = Read-host -AsSecureString
New-StoredCredential -Target $Target -UserName $UserName -SecurePassword $Secure -Persist LocalMachine -Type Generic

Get-StoredCredential -Target "servername" –AsCredentialObject

Remove-StoredCredential -Target "servername"

...然后看看其他方法。有关其他方法,请参阅此问答。 Passwords in powershell logging

至于...

if the server gets compromised

...如果一个邪恶的人进入你的系统这么远,为了能够做到这一点,那么这就会开始:Ten Immutable Laws Of Security (Version 2.0)