存储自动电子邮件脚本的帐户凭据(尤其是密码)的最佳方法是什么?

时间:2018-06-18 20:58:41

标签: powershell email security automation email-verification

我正在编写一个简单的脚本(windows powershell)来发送自动电子邮件。计算机将始终运行,收集数据,然后定期发送电子邮件。发送电子邮件的一部分显然是收集凭据,并且由于其自动化,我们每次都无法在那里输入用户和密码。显而易见的解决方案是在$ user和$ pass vars中存储信息,但这对我来说似乎非常不安全,并且容易受到攻击。有没有更好的方法来做到这一点?也许使用用户地址设置一次安全的电子邮件连接,而不必再次输入?我是powershell的新手,所以我不清楚最好的方法来做到这一点。目前我在做的是:

$from = 'UserEmail@anotherEmail.com'
$to = 'someEmail@SomeMail.com'
$smtpServer = 'smtp-mail.outlook.com'
$smtpPort = '587'
$mailSubject = 'PowerShell Script Email Test'
$password = 'p@ssword'
$mailBody = 'body text'
$credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $from, $($password | ConvertTo-SecureString -AsPlainText -Force)
Send-MailMessage -To "$to" -From "$from" -Subject $mailSubject -SmtpServer $smtpServer -UseSsl -Credential $credentials -BodyAsHtml -Body $mailBody

非常感谢您阅读的任何建议或文档

1 个答案:

答案 0 :(得分:3)

您可能需要调查Protect-CMSMessage cmdlet,它允许您encrypt/decrypt data使用公钥加密,以便只有拥有正确证书的用户才能解密密码。

如果这看起来有点过分,另一种更简单但可能不太安全的选择是将凭据导出到XML并在需要时将其读回。

要创建文件,请执行以下操作:

  1. 以脚本将作为
  2. 运行的用户身份登录
  3. 执行以下命令:Get-Credential | Export-CliXml <path>\cred.xml
  4. 出现提示时,输入要在脚本中使用的用户名/密码
  5. 生成的XML文件将安全地存储用户名和密码,并且可以像这样读回:

    $cred = Import-CliXml <path>\cred.xml
    

    然后,您可以将$cred传递给任何具有-Credential参数的cmdlet。

    密码的加密方式只能由同一台计算机上的同一个用户打开,因此如果其他人打开密码,他们将无法访问详细信息。显然,如果他们可以以加密它的用户身份登录(或说服该用户运行“坏”脚本),那么他们就可以访问详细信息,但这样做非常安全。

    第三种选择是在Windows中使用内置Credential Manager。对于旧系统,这需要一些复杂的.NET互操作,但幸运的是,一些好人已经为您完成了艰苦的工作:

    PowerShell Credentials Manager

    在Windows 10中这有点容易:

    PasswordVault Class