在Powershell脚本中安全的使用密码信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Powershell脚本中安全的使用密码信息相关的知识,希望对你有一定的参考价值。

参考技术A

在使用基于Powershell自动化的脚本中,大多数场景下需要未脚本传递凭据以供验证环节能够正常工作,很多管理员习惯于在他们的脚本中使用明文密码,但如果是测试脚本,倒是无关紧要,若是用于生产环境的脚本,这种行为不但很糟糕,还很可怕,不怀好意的同志们会很乐意并轻松的拿到它然后搞一些或轻或重的破坏。但是,如果正确使用powershell所提供的密码加密功能,能很轻松的解决这个问题。

PowerShell中,提供了两种生成凭据的方式分别是 Get-Credential 和 Read-Host
Get-Credential
Get-Credential 命令被用来创建PSCredential对象并且将之存储到变量中,并保证不在屏幕上显示如下

上面的命令将凭据信息保存到变量 $crd 中 ,这个变量可被很容易的用于访问需指定凭据的 Cmdlets
Read-Host
使用 Read-Host 同样可以起到保护明文密码显示的功能 如下, -AsSecureString 可以将明文密码存储成加密密码串对象,SecureString对象可被用于可接受该类型参数的命令,可以通过定义变量和管道输出将该对象传递给命令。

ConvertTo-SecureString
ConvertTo-SecureString 用于加密密码和其它字符串,它可以接受字符串然后输出为SecureString对象,SecureString对象可被用于可接受该类型参数的命令,可以通过定义变量和管道输出将该对象传递给命令。

语法如下:

当不适用参 -Key 或者 -SecureKey 时,PowerShell将会调用 Windows Data Protection API (DPAPI) 加密\\解密字符串。但这将导致生成的 SecureString 对象在其它计算机上使用。
如下将把明文"Password"转化为 SecureString

这种方式虽然能够将明文字符转换为 SecureString 对象,但是却无法将其存储为一个文件以后用。必须把它转化为标准加密字符串才可以,要达到这个目的,要用到 ConvertFrom-SecureString 命令。
ConvertFrom-SecureString
使用 ConvertFrom-SecureString 命令可以将 SecureString 对象存储成为标准加密字符串,可以将 SecureString 对象或者命令产生的 SecureString 对象通过管道传给它来实现

语法:

上面的例子产生的 SecureString 对象可以用于此处转换成标准加密字符串

结合上面几个命令,我们可以有以下几种方法将 SecureString 转换成的标准加密字符串通过 Out-File 命令存储成txt文件

导出纯文本模式生成的 SecureString 对象

导出 Get-Credential 产生的 SecureString 对象

导出通过 Read-Host 产生的 SecureString 对象

将上述存储的标准加密字符串文件转换回 SecureString 并用来创建 PSCredential

上面提到,在使用 ConvertTo-SecureString 和 ConvertFrom-SecureString 加密凭据时,如不使用 -Key 或 -SecureKey ,则PowerShell会调用DPAPI进行加解密,因为无法再创建其之外的机器上使用,如下
同一台主机

不同主机上使用上面同一个txt文件

使用 Key 或者 SecureKey 实现跨机器使用加密文件
使用 -Key 参数创建保存标准加密字符串的文件,下面将会用到Windows Class “System.Security.Cryptography.RNGCryptoServiceProvider"来创建随机数据来填充作为 -Key 的参数值的数组

使用随机数据来创建AES key并导出为文件

创建 SecureString 对象

创建凭据

在另外的机器上

上面的内容已经完全可以帮助我们在powershell脚本中来加密密码了,如果有其它问题欢迎留言。

以上是关于在Powershell脚本中安全的使用密码信息的主要内容,如果未能解决你的问题,请参考以下文章

sh 用于从ubuntu构建安全的mysql服务器的shell脚本。 (必须以root身份运行并准备使用大量密码)

如何运行PowerShell的脚本文件

信息系统安全实验——Week 5

在 PowerShell 脚本中访问 Azure DevOps 管道中的安全文件

如何根据 clientid 和客户端密码在 Runbook 中运行 powershell 脚本

PowerShell 脚本中调用密文密码