【问题标题】:Obscuring Default Plaintext password in Powershell (PowerCLI) script在 Powershell (PowerCLI) 脚本中隐藏默认明文密码
【发布时间】:2016-03-24 09:58:54
【问题描述】:

我正在编写一个 PowerCLI 脚本,该脚本通过模板部署和配置虚拟机。在配置阶段,我必须运行一些命令,这些命令需要访客的根用户名和密码才能在 VM 上运行脚本。这些是模板的默认凭据,它们以纯文本形式存储在我的脚本中。配置完成后,我让用户使用 SecureString Credentials 更改他们的密码。

我担心的是,由于我正在配置的虚拟机的性质,如果有人可以在我的脚本中找到我拥有的默认纯文本凭据,那么他们就有很大的机会访问此虚拟机。有没有办法在加密的脚本中存储默认凭据?

【问题讨论】:

    标签: passwords powercli


    【解决方案1】:

    可以使用受信任的存储和ConvertTo-SecureString 存储针对用户帐户加密的凭据。

    以下是针对您的帐户加密值的方法,您要加密的值存储在$Password 中。确保在$configDir下也设置了一个路径以将密码存储在一个文件中。

    $Password = "SomeValue"
    #Path to store the credential
    $configDir = "$Env:AppData\WindowsPowerShell\Modules\YourScriptName\0.1\Config.ps1xml"
    $password = ConvertTo-SecureString "SomeValue" -AsPlainText -Force
    $password | ConvertFrom-SecureString | Export-Clixml $configDir -Force
    

    现在,从加密中恢复密码:

    $password = Import-Clixml -Path $configDir -ErrorAction STOP | ConvertTo-SecureString
    $Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($password)
    $password= [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
    

    您的密码最终会存储在$password

    【讨论】:

    • 这个脚本必须在每个用户帐户上运行,对吗?我将把这些脚本(和这个 VM 模板)提供给不同的客户,他们的 Powershell 知识差异很大。为了适应最小的公分母,我必须将您的代码作为脚本提供给他们。但是问题是默认密码仍然以纯文本形式存在。我想我可能不得不指示客户在使用密码初始化脚本后删除它,或者我自己删除它。
    • 第一位的输出是一个 ps1xml 文件,可以使用第二位的代码将其转换回明文密码。不过,这只能在加密的同一台计算机上使用。
    • 具体来说,如果你在某台电脑上使用这些脚本向虚拟机发送指令,你应该可以安全地使用这种方法。只有登录到那台电脑的人才能解密文件,并获得虚拟机的默认值
    猜你喜欢
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2010-10-10
    • 2015-01-05
    • 1970-01-01
    • 2014-06-09
    相关资源
    最近更新 更多