在PowerShell脚本中保护密码

在PowerShell脚本中保护密码,powershell,security,passwords,Powershell,Security,Passwords,我正在编写一个PowerShell脚本,每隔几个月,第三方应用程序就会自动调用它来执行以下操作: 使用[System.Web.Security.Membership]::GeneratePassword()随机生成密码,然后将该密码与导出PfxCertificate和OpenSSL的密码一起使用 使用静态密码通过COM API向不支持API密钥或任何东西的第三方系统进行身份验证 安全地执行此操作的最佳方法是什么 据我所知,《1》没有错,但我在网上读到的关于《2》的所有信息都建议: 要求用户在执

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

  • 使用
    [System.Web.Security.Membership]::GeneratePassword()
    随机生成密码,然后将该密码与
    导出PfxCertificate
    和OpenSSL的
    密码一起使用
  • 使用静态密码通过COM API向不支持API密钥或任何东西的第三方系统进行身份验证
  • 安全地执行此操作的最佳方法是什么

    据我所知,《1》没有错,但我在网上读到的关于《2》的所有信息都建议:

    • 要求用户在执行脚本时提供凭据,但这会妨碍流程的自动化
    • 使用PSCredential,但这在这里是不可能的
    • 使用加密的密钥/密码文件,但据我所知,这并没有任何意义,因为您仍然有效地将密码存储在脚本文件旁边-如果服务器受到攻击,则他们可以从脚本读取密码或解密密钥文件中的密码。除非您使用的自定义加密密钥不存储在服务器上,但同样会破坏自动化
    您是否已退房或类似情况

    如果您选择这种方式,请查看Az模块(Windows PowerShell 5.1或PowerShell Core)。子模块具有许多使用vault的功能

    编辑:为了解决安全问题,我们对系统了解不多。不过,我会研究以下几点:

  • 最低权限:确保此服务帐户只能执行其应执行的操作
  • 使用时间限制:如果知道应该执行的计划,则将系统配置为仅允许帐户在此期间成功进行身份验证,如果可能,甚至允许JIT权限
  • 基于位置的限制:仅允许帐户从位置进行身份验证。最好的结果是,能够限制到应该从中执行的特定服务器(可能需要专用的出口IP)
  • 审核:监视这些设置的更改并发出警报
  • 如果存在这些漏洞,则表明实际系统已受损,攻击者可能在允许的窗口内在允许的范围内进行意外更改。在这一点上,这是一个相当低的风险,比不实施此类控制要好得多

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

    对于#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"
    
    。。。然后看看其他的方法。有关其他方法,请参见本问答

    至于

    如果服务器受到威胁


    。。。如果一个邪恶的密码进入您的系统这么远,为了能够做到这一点,那么这就起作用了:

    可以对文件的密码进行加密,使其只能由同一用户在同一台服务器上恢复,因此该文件实际上对其他任何人都没有用处。不是100%安全,但可能对您的情况足够好。查看我以前对一个类似问题的回答:这让我找到了“凭据”,它使用
    获取凭据| Export CliXml
    $Credential=Import CliXml
    ,以及
    $Credential.GetNetworkCredential().Password
    这正是我所使用的。后续问题:如果用户执行设置以输入配置(包括凭据),但系统执行脚本,那么实现我的理想方案的最佳方式是什么?当然,系统将无法解密凭据,因为这是一个不同的安全上下文,因此,*-CliXml使用不同的键?我使用了这个方法: