【问题标题】:How does one securely handle passwords in a custom written PowerShell cmdlet?如何在自定义编写的 PowerShell cmdlet 中安全地处理密码?
【发布时间】:2012-06-25 19:52:55
【问题描述】:

假设我有一个自定义 PowerShell Cmdlet,它可以导出数据并使用密码对其进行加密。

[Cmdlet(VerbsData.Export, "SampleData")]
public class ExportSampleData : PSCmdlet
{
    [Parameter(Mandatory = true)]
    public string Password
    {
        get;
        set;
    }

    /* additional parameters */
}

如何妥善安全地处理密码?例如,我想阻止管理员在控制台中键入该值时显示该值。其他选项包括读取包含加密密码的文件。

我知道 PSCredential 但这需要一个在这种情况下没有意义的用户名。

【问题讨论】:

  • 你是怎么使用它的?我有类似的问题。

标签: c#-4.0 powershell cmdlets


【解决方案1】:

如果只想获取密码,可以使用

Read-Host cmdlet 与–asSecureString 参数。

此参数屏蔽输入。

【讨论】:

    【解决方案2】:

    您可以在this answer 中找到一种使用计算机密码进行加密的方法(适用于安全机器)。

    使用@Christian 响应,您可以像这样将密码放入磁盘:

    PS > $cred.Password | ConvertFrom-SecureString | Set-Content c:\temp\password.txt
    

    然后用 :

    检索它
    $password = Get-Content c:\temp\password.txt | ConvertTo-SecureString
    $cred = New-Object System.Management.Automation.PsCredential "UserName",$password
    

    【讨论】:

    • 一旦我有了密码,这将非常有用。
    【解决方案3】:

    将Password参数的类型改为SecureString;如果管理员省略了 -Password 参数,PowerShell 将通过提示管理员输入必填参数并在他们键入时显示星号来做正确的事情。

    理想情况下,您的 cmdlet 的实现会将 SecureString 传递给一些原生支持 SecureString(最安全)的 API;如果没有,您必须从 SecureString 中提取密码。这是一篇关于如何做到这一点的好文章:How to properly convert SecureString to String

    【讨论】:

      【解决方案4】:

      如果您正在编写 C# PowerShell Cmdlet,并且其中一个参数要求用户输入密码,则应该对其进行混淆处理。

      为此,您需要成为using System.Security;

      然后你的参数类型应该是SecureString

      所以用你的例子:

      [Cmdlet(VerbsData.Export, "SampleData")]
      public class ExportSampleData : PSCmdlet
      {
          [Parameter(Mandatory = true)]
          public SecureString Password
          {
              get;
              set;
          }
      
      /* additional parameters */
      }
      

      【讨论】:

        【解决方案5】:

        SecureString-Handling 让您感觉更加安全,即使情况并非如此。您可以像这样轻松加密任何 SecureString...

        $mrsh = [System.Runtime.InteropServices.Marshal]
        $ptr  = $mrsh::SecureStringToBSTR($secureString)
        $pass = $mrsh::PtrToStringAuto($ptr)
        

        甚至不用像这样的 webclient-object 编组...

        $cred = Get-Credential
        $web = [Net.WebClient]::new()
        $web.Credentials = [System.Net.NetworkCredential]::new($cred.UserName,$cred.Password)
        $pass = $web.Credentials.Password 
        

        因此,总而言之,密码和 SecureString-Password 都不应永久存储为文件或其他任何内容。让一生 尽可能短的信息 - 例如从输入密码到清除密码变量及其所有继承变量,如下所示:

        Remove-Variable pass, cred, web -ea 0 
        

        【讨论】:

          猜你喜欢
          • 2013-06-17
          • 2012-01-20
          • 1970-01-01
          • 2015-11-21
          • 2020-01-03
          • 1970-01-01
          • 2011-09-13
          • 2011-04-16
          • 1970-01-01
          相关资源
          最近更新 更多