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

Posted

技术标签:

【中文标题】为自动电子邮件脚本存储帐户凭据(尤其是密码)的最佳方式是啥?【英文标题】:What is the best way to store account credentials (especially password) for an automated email script?为自动电子邮件脚本存储帐户凭据(尤其是密码)的最佳方式是什么? 【发布时间】:2018-11-27 18:23:40 【问题描述】:

我正在编写一个简单的脚本(windows powershell)来发送自动电子邮件。一台计算机将一直运行,收集数据,然后定期发送电子邮件。发送电子邮件的一部分显然是收集凭据,并且由于它是自动化的,我们不能每次都有人在那里输入用户和密码。显而易见的解决方案是将信息存储在脚本中的 $user 和 $pass 变量中,但这对我来说似乎非常不安全,并且容易受到攻击。有没有更好的方法来做到这一点?也许使用用户地址设置一次安全的电子邮件连接,而不必再次输入?我是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

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

【问题讨论】:

当然不安全。不要那样做。查看 SecureStringConvertFrom-SecureStringConvertTo-SecureString 以了解如何保护静态凭据。 【参考方案1】:

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

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

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

    以运行脚本的用户身份登录 执行此命令:Get-Credential | Export-CliXml <path>\cred.xml 当提示输入要在脚本中使用的用户名/密码时

生成的 XML 文件将安全地存储用户名和密码,并且可以像这样读取:

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

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

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

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

PowerShell Credentials Manager

这在 Windows 10 中要容易一些:

PasswordVault Class

【讨论】:

谢谢,导出到 XML 似乎是我使用的最佳选择,我会尝试实现类似的东西! @P.Caruana - 我自己在使用 CliXml,因为它既简单又安全,但请注意它只能由同一用户在同一台​​计算机上打开。生成的用户/密码文件不能以任何方式移植。 @boxdog - 你有任何关于 CliXml 不安全的额外信息吗? @LievenKeersmaekers,不,我只是有点偏执。我已经多次使用该技术并且从未遇到过问题,但是将您的凭据放入这样的文件中似乎总是太容易了,而且我一直怀疑是否有某种方法(除了以您的身份登录)其他人可以访问该信息。实际上,我认为情况并非如此。 哇,这太棒了!这是一个非常简单的解决方案,我喜欢它的紧凑性。

以上是关于为自动电子邮件脚本存储帐户凭据(尤其是密码)的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

更改 Git 中推送的凭据

使用 CloudKit 处理用户帐户的正确方法

MinIO 更改用户凭据(密钥)

无效的用户凭据 Paypal Sandbox 测试帐户

清除 Visual Studio 2017 中存储的 TFS 凭据

Firebase 使用 Google 帐户覆盖登录