在PowerShell脚本中保护密码

时间:2019-04-29 11:52:21

标签: powershell security passwords

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

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

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

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

  • 要求用户在执行脚本时提供凭据,但这使流程自动化的目的变得白白了。
  • 使用PSCredential,但这在这里是不可能的。
  • 使用加密的密钥/密码文件,但是据我所知,这实际上没有任何意义,因为您实际上仍将密码存储在脚本文件旁边-如果服务器受到威胁,则它们可以从脚本中读取密码,也可以解密密钥文件中的密码。除非您使用不存储在服务器上的自定义加密密钥,否则,这样做会破坏自动化。

2 个答案:

答案 0 :(得分:0)

您是否已签出Azure Key Vault或类似内容?

如果您走这条路线,请查看Az模块(Windows PowerShell 5.1或PowerShell Core)。 Az.KeyVault子模块具有许多用于库的功能。

编辑:为了解决安全问题,我们对系统了解不多。但是,这些是我要研究的东西:

  1. 最高特权:确保该服务帐户只能执行应有的功能。
  2. 使用时间限制:如果知道应执行的时间表,则将系统配置为仅允许该时间段内的帐户成功进行身份验证,甚至允许JIT权限。
  3. 基于位置的限制:仅允许帐户从该位置进行身份验证。最好的结果是,能够限制从中执行该服务器的特定服务器(可能需要专用的出口IP)。
  4. 审核:监视并提醒这些设置的更改。

如果这些措施到位,则您可能会发现实际系统已受到威胁,攻击者可能会在允许的窗口内的允许范围内进行意外更改。那时的风险相当低,比不实施此类控制要好得多。

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

答案 1 :(得分:0)

对于#2,有很多资源/文章涉及使用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

至于...

  

如果服务器受到攻击

...如果您的系统中有这么一个邪恶的人,那么您可以这样做:Ten Immutable Laws Of Security (Version 2.0)