当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

作者:精品下载站 日期:2024-12-14 13:09:46 浏览:15 分类:玩电脑

通过秘密管理模块的PowerShell加密密码命令


将机密信息存储为可读文本是一个重大的安全风险。遗憾的是,使用纯文本密码的 PowerShell 脚本似乎仍然存在,脚本编写者应该采取措施改变这种做法。但保护脚本中使用的秘密和密码一直是一个挑战。

但借助新的 PowerShell 加密密码模块,现在只需几个命令即可保护机密和密码。本教程将教您如何使用 PowerShell 机密管理和机密存储模块以交互方式或在脚本中安全地存储和检索密码。

先决条件

本教程将是一个实践演示,但不需要太多先决条件。只要您拥有一台运行 Windows PowerShell 5.1 或 PowerShell 7.x 的计算机,就可以开始使用。本教程使用装有 PowerShell 7.2.0 的 Windows 10 计算机。

安装 PowerShell 加密密码模块

在管理和存储 Powershell 加密密码之前,您需要安装 PowerShell 加密密码模块,有两个:

  • Microsoft.PowerShell.SecretStore - 一个扩展模块,提供用于存储机密的机密存储(保管库)。
  • Microsoft.PowerShell.SecretManagement - 为您提供用于连接和管理保管库及其包含的项目的命令。

有一些第三方机密存储模块可与 PowerShell 机密管理模块配合使用。但是,本教程将仅涵盖 Microsoft 提供的秘密存储。与往常一样,使用第三方保管库时请务必小心。

请按照以下步骤安装必要的 PowerShell 加密密码模块:

1. 在计算机上打开提升的 PowerShell 控制台(以管理员身份)。

2. 接下来,运行以下命令将 PowerShell 的执行策略 Set-ExecutionPolicy 设置为 RemoteSigned。此命令确保您可以在计算机上运行 PowerShell 脚本。

Set-ExecutionPolicy RemoteSigned

在非 Windows 计算机上,执行策略始终设置为“无限制”且不可更改。

3. 现在,运行以下 Install-Module 命令来安装机密管理模块 (Microsoft.PowerShell.SecretManagement)。

Install-Module -Name Microsoft.PowerShell.SecretManagement, Microsoft.PowerShell.SecretStore

在如下所示的确认提示中,按Y,然后按 Enter 继续安装。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

4. 最后,运行下面的Get-Module命令来确认模块的安装。

Get-Module -ListAvailable Microsoft.PowerShell.SecretManagement, Microsoft.PowerShell.SecretStore

下面的屏幕截图确认您已在此计算机上成功安装了模块。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

创建 Microsoft Secret Store Vault

在开始存储加密密码和机密之前,您首先需要设置一个保管库。保险库是用于存储您的秘密的安全存储库。

运行下面的 Register-SecretVault 命令来注册新保管库,并将保管库存储提供程序设置为 Microsoft.PowerShell.SecretStore 模块。在此示例中,保管库名为 Vault1,但您可以对其进行不同的命名。此外,-Description 是可选的,但有助于描述您的新秘密保险库。

Register-SecretVault -Name Vault1 -ModuleName Microsoft.PowerShell.SecretStore -Description "My first secret vault"

Microsoft Secret Store 保管库仅适用于当前用户帐户上下文,这意味着只有创建该保管库的用户帐户才能访问它。

现在,运行下面的 Get-SecretVault 保管库命令以确认新保管库的创建。

Get-SecretVault -Name Vault1 | Select-Object *

如下所示,Vault1 显示为 Microsoft.PowerShell.SecretStore 保管库。请注意,IsDefault 值设置为 True,因为此保管库是您用户帐户上的第一个也是唯一一个秘密保管库。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

请勿使用同一保管库模块创建多个保管库。如果这样做,每个保管库将包含重复的条目,并且没有任何额外的好处。

存储和更新机密

您已经注册了一个新的秘密保管库,现在可以开始在其中存储敏感信息。但在此之前,您应该知道可以在保险库中存储什么类型的秘密。

Microsoft 机密存储接受以下数据类型作为机密。

  • PS凭证
  • 哈希表
  • 安全字符串
  • 细绳
  • 字节[]

如果您计划存储秘密对,例如用户名+密码或应用程序 ID+API 密钥,则需要考虑 PSCredential 或 HashTable 类型。其他秘密类型仅更适合单值秘密。

例如,运行以下命令将新的用户名和密码 PSCredential 对象添加到存储中。

# Create a credential object.
$credential = Get-Credential
# Create a new secret named Secret1
Set-Secret -Name Secret1 -Secret $credential

第一次将机密添加到机密存储时,Set-Secret 命令将要求您为机密存储本身分配主密码,如下所示。为您的保管库指定新密码并确保记住它,因为无法恢复丢失的秘密存储密码。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

当您需要更新密钥时,只需运行相同的 Set-Secret 命令即可覆盖现有密钥。

取回秘密

您现在已经创建了第一个秘密并将其存储在您的秘密保险库中。现在,每当您需要从保管库检索机密时,请执行以下指南。

默认情况下,秘密存储需要密码才能解锁。 900 秒不活动后,保险库会再次自行锁定。因此,在检索秘密之前,您需要先解锁保险库。

1. 运行以下命令来解锁您的秘密保管库。

Unlock-SecretStore

输入保管库的密码,然后在出现密码提示时按 Enter 键。

如下所示,如果解锁操作成功,您将不会看到任何消息。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

但如果解锁失败,也许您输入了错误的密码,您会收到一条失败消息,如下所示。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

2. 解锁秘密存储后,运行以下命令以查看其中包含的秘密列表。如果您知道要检索的密钥的名称,请跳至下一步。

Get-SecretInfo

在下面,您可以看到该命令显示了密钥的名称、类型以及它所在的保管库名称。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

3. 现在您知道了密钥的名称,请运行以下命令来检索密钥的值。

Get-Secret -Name Secret1

请注意,下面的密码显示为 System.Security.SecureString,这表明密码加密效果良好。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

4. 最后,运行以下命令调用 PSCredential 上的 GetNetworkCredential() 方法以查看明文密码。

(Get-Secret -Name Secret1).GetNetworkCredential() | Select-Object *

现在您已成功找回密码。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

在自动化中使用 PowerShell 加密密码

到目前为止,您已经学会了注册和创建新的秘密商店。您还创建了一个新的秘密,并学会了如何在需要时调用该秘密。但秘密检索的方式是交互式的。

自动化的全部目的是消除与脚本的手动交互。手动输入秘密存储主密码来解锁它不太适合自动化。但不用担心,因为有一些方法可以解决这个挑战。

加密秘密存储主密码

由于默认情况下解锁秘密存储需要密码,因此您需要一种无需手动输入主密码即可解锁的方法。但您还必须确保不要以纯文本形式公开主密码。

实现此自动化场景的一种方法是将主密码保存在加密的 XML 文件中。

1. 首先,运行以下命令将主密码保存在 CliXml 文件中。此命令会提示凭据并将该凭据导出 (Get-Credential | Export-CliXml) 到主目录 (~/vaultpassword.xml) 中的 XML 文件。

您可以根据需要以不同的方式命名 XML 文件,并将其导出到不同的文件路径。

Get-Credential | Export-CliXml ~/vaultpassword.xml

用户提示中输入任意用户名,然后按 Enter。

接下来,输入秘密存储的主密码并按 Enter。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

2. 现在,运行下面的 Get-Content 命令来确认您导出的凭证文件 (~/vaultpassword.xml) 存在并且包含加密的主密码。

Get-Content ~/vaultpassword.xml

XML 文件不会以纯文本形式显示主密码,而是以安全字符串形式显示,如下所示。您现在可以在脚本中重复使用此 XML 文件。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

3. 在脚本中运行或添加以下命令。此命令将加密密码从 XML 文件 (Import-CliXml ~/vaultpassword.xml) 导入到变量 ($vaultpassword) 中。

$vaultpassword = (Import-CliXml ~/vaultpassword.xml).Password

如果您想知道,从 XML 解密/导入加密密码仅适用于加密密码的用户帐户。即使其他人复制了 XML 文件,也无法解密密码。

4. 运行以下命令解锁您的秘密存储,无需指定密码。为何如此?因为您的脚本调用 Unlock-SecretStore 命令并将 $vaultpassword 传递给 -Password 参数

Unlock-SecretStore -Password $vaultpassword

5. 最后,运行以下命令来检索您需要的机密 (Select-Object Username,Password)。

(Get-Secret -Name Secret1).GetNetworkCredential() | Select-Object Username,Password

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

禁用秘密库密码验证

请记住,秘密存储只能由创建它的用户帐户访问。只要您的脚本或 PowerShell 会话在该用户帐户上下文下运行,秘密存储就可用。

考虑到这种情况,禁用秘密存储密码要求是您可以尝试的另一种解决方案。这样做时,您的自动化脚本不需要额外的逻辑来处理主密码。

要禁用秘密存储的密码身份验证要求:

1. 首先,运行下面的 Get-SecretStoreConfiguration 命令以确认安全存储上启用了密码身份验证。 获取 SecretStoreConfiguration

根据下面的结果,秘密存储验证需要密码。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

2. 接下来,运行以下 " target="_blank" rel="noreferrer noopener nofollow">Set-SecretStoreConfiguration 命令来设置 Authentication交互设置为None以禁用密码要求。

Set-SecretStoreConfiguration -Authentication None -Interaction None

3. 在出现确认提示时,按 Y 并 Enter。最后输入当前密库密码并按Enter键即可完成操作。

[玩转系统] 通过秘密管理模块的PowerShell加密密码命令

结论

在整个教程中,您已经意识到在 PowerShell 中使用密码通常需要脚本编写人员开发安全存储和检索密码的方法。有第三方解决方案,但最合适的解决方案通常涉及成本和复杂的设置。

除了在本地存储密码之外,Microsoft 还提供 Azure Key Vault 模块,允许将凭据保存到 Azure 订阅 - 非常适合在团队或组织内共享机密。

随着秘密管理和秘密存储模块的发布,现在可以在 PowerShell 中标准化凭据管理。现在,您愿意转换脚本以利用 PowerShell 加密密码模块吗?

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯