Модуль PowerShell Secret Management: безопасное хранение и использование паролей

Microsoft недавно выпустила крайне интересный PowerShell модуль SecretManagement . Данный модуль можно использовать для безопасного хранения и использования сохраненных паролей в ваших PowerShell скриптах. Данный модуль условно состоит из двух составляющих: SecretStore vault – собственно дефолтное хранилище паролей, и движок SecretManagement , который позволяет работать с хранилищами паролей. Поддерживается как встроенное хранилище (SecretStore vault), так и внешние инструменты для хранения паролей, например: KeePass, LastPass, HashiCorp Vault, Azure Key Vault, Bitwarden, Windows Credential Manager и т.д. С помощью SecretsManagement вы можете сохранить любые пароли и извлечь их в любой момент. Можно хранить не только пароли, но и лицензионные ключи, ключи доступа, и любую другую конфиденциальную информацию (поддерживаются типы объектов Hashtable, Byte, String, SecureString и PSCredential).

В этой статье мы покажем, как использовать модуль Secret Management в ваших скриптах PowerShell для хранения и извлечения учетных данных, а также пример интеграции с KeePass.

Установка модуля Secret Management

Модуль SecretsManagement требует наличие установленного Windows PowerShell версии 5.1 или PowerShell Core.

Для установки модуля Secrets Management с помощью менеджера пакетов NuGet, выполните команду:

Install-Module -Name Microsoft.PowerShell.SecretManagement

Чтобы установить хранилище паролей SecretStore , предлагаемой Microsoft по умолчанию, выполните команду:

Install-Module -Name Microsoft.PowerShell.SecretStore

установка модуля Microsoft.PowerShell.SecretManagement

Чтобы вывести список доступных командлетов в модулях, используйте команды:

Get-Command -Module Microsoft.PowerShell.SecretManagement
Get-Command -Module Microsoft.PowerShell.SecretStore

список командлетов в модуле Microsoft.PowerShell.SecretStore

Создаем хранилище паролей (SecretStore Vault)

Сначала нужно создать локальное хранилище паролей. Я назову его MyDomainPassdb и назначу в качестве хранилища паролей по умолчанию.

Register-SecretVault -Name MyDomainPassdb -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault

Если настройки политики выполнения скриптов PowerShell блокируют запуск модуля, можете изменить настройки для текущей сессии так:

Set-ExecutionPolicy -Scope Process Unrestricted

Вы можете создавать и использовать как локальные, так и удаленные хранилища паролей.

Следующая команда выведет список зарегистрированных хранилищ паролей для текущего пользователя:

Get-SecretVault

зарегистрировать хранилище паролей в windows: Register-SecretVault

Задайте мастер пароль для доступа к хранилищу паролей:

Get-SecretStoreConfiguration

В случае утери мастер пароля от вашего SecretStore Vault, вы не сможете получить доступ к сохраненной в нем информации.

По умолчанию доступ к хранилищам паролей определяется следующими настройками:

  • Scope – CurrentUser (хранилище доступно только текущему пользователю);
  • Authentication – Password (доступ к хранилищу через мастер пароль);
  • PasswordTimeout – 900 (длительность сессии, в течении которой мастер пароль не запрашивается повторно – 15 минут, можно увеличить: Set-SecretStoreConfiguration -PasswordTimeout 1200) ;
  • Interaction – Prompt (нужно ли запрашивать мастер пароль при внесении изменений).

Модуль PowerShell Secret Management: безопасное хранение и использование паролей

Чтобы отключить запрос мастер пароля для доступа к хранилищу (не рекомендуется), нужно установить Authentication = None:

Set-SecretStoreConfiguration -Authentication None

Чтобы изменить мастер пароль, воспользуйтесь командлетом Set-SecretStorePassword .

В Windows локальное хранилище пароля хранится в профиле пользователя в каталоге %LOCALAPPDATA%MicrosoftPowerShellsecretmanagement .

защищенное хранилище паролей windows PowerShellsecretmanagement

К сожалению, модуль Secret Management нельзя использовать для сервисных MSA/gMSA аккаунтов , т.к. для них не создаются профили.

Управление сохранёнными паролями с помощью модуля Secret Management

Чтобы добавить строку типа SecureString в хранилище паролей используется командлет Set-Secret. Нужно указать имя хранилища и название записи:

Set-Secret -Vault MyDomainPassdb -Name user1

Укажите пароль, который нужно сохранить в базу.

Или можно сохранить защищаемое значение так (например GitHub ключ):
Set-Secret -Vault MyDomainPassdb -Name CORP_GITHUB_TOKEN -Secret 'gitHUB_API_AUThToken'

Будьте внимательны при указании закрытой информации в консоли PowerShell в открытом виде, т.к. она сохранится в истории команд PowerShell .

Вывести список записей в хранилище паролей можно так:

Get-SecretInfo

список сохраенных паролей в локальном хранилище Get-SecretInfo

В PowerShell 7.0 можно вывести защищаемое значение из базы паролей в открытом виде с помощью опции –AsPlainText ( обновите версию PowerShell , если нужно):

Get-Secret -Vault MyDomainPassdb -Name user1| ConvertFrom-SecureString –AsPlainText

В большинстве случаев для работы в сетях Windows вам нужно сохранять в хранилище паролей не просто пароль, а пару – учетная запись и пароль. В этом случае нужно сохранить эту пару в виде объекта PSCredential . Также может быть удобно добавить метаданные с описанием сохраненной записи.

Set-Secret -Vault MyDomainPassdb -Name adm_kbuldogov -Secret (Get-Credential) -Metadata @{description = "AD domain domain admin account resource.loc"}

Если вы не хотите вводить имя учетной записи в окне Get-Credential, можно указать ее так:

Set-Secret -Vault MyDomainPassdb -name adm_aivanov -Secret (get-credential corpadm_aivanov)

Вести список сохранённых паролей и их описание можно так:

Get-SecretInfo | Ft Name, Metadata

сохранить имя пользователя и пароль в виде PSCredential в локальное хранилище паролей

Как использовать сохраненные пароли в скриптах PowerShell?

Теперь вы можете использовать сохраненные пароли в своих скриптах и командах PowerShell. Например, у одного из заказчиков из соображений безопасности и защиты административных учетных записей для каждого администратора нарезали с десяток учетных записей (под разные сервисы/задачи). Использовать одинаковые пароли запрещено, выполняется регулярный аудит паролей . Вводить пароли каждый раз для них довольно утомительно.

С помощью модуля SecretManagement можно безопасно сохранить пароли в локальный файл и вызывать их при необходимости .

Например, для подключения к удалённому компьютеру и запуска команды через PowerShell Remoting , можно использовать такой код:

Enter-PSSession -ComputerName dc01 -Credential (Get-Secret -Vault MyDomainPassdb -Name adm_aivanov)

Аналогичным образом можно упростить доступ к Exchange/Office365 :

$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://exch1.remontka.com/PowerShell/ -Authentication Kerberos -Credential (Get-Secret -Vault MyDomainPassdb -Name admex_aivanov)

Или Azure AD :

Connect-AzureAD -Credential (Get-Secret -Vault MyDomainPassdb -Name azadm_aivanov)

Или просто получить значение имени и пароля в переменную:

$Cred = Get-Secret -Vault MyDomainPassdb user1

Получаем доступ к паролям в KeePass из PowerShell

Вы можете использовать модуль SecretManagement для доступа к другим популярным хранилкам паролей. Рассмотрим, как получить доступ к сохраненным паролям в файле KeePass (*.kdbx).

Сначала нужно установить модуль SecretManagement для взаимодействия с KeePass:

Install-Module -Name SecretManagement.KeePass

модуль powershell SecretManagement.KeePass

Затем зарегистрируйте хранилище KeePass в своем профиле пользователя:

Register-SecretVault -Name "KeePassDB" -ModuleName "SecretManagement.Keepass" -VaultParameters @{
Path = "C:UsersrootDocumentspersonal_creds.kdbx"
UseMasterPassword = $true
}

Чтобы проверить доступ к файлу KeePass, выполните команду:

Test-SecretVault -Name KeePassDB

введите мастер пароль keepass

Укажите мастер пароль для доступа к файлу KeePass. Если вы указали правильный пароль, команда должна вернуть True.

Теперь можно вывести список сохраненных паролей в базе KeePass.

Get-SecretInfo -Vault KeePassDB

получить список сохраненых паролей в keepass с помощью powershell

Чтобы сохранить новые пароль в KeePass:

Set-Secret -Vault KeePassDB -Name "ILO_adm" -Secret (Get-Credential remontkaILO_adm)

Аналогичным образом вы можете подключить любое другое популярное решение для хранения паролей и использовать его в PowerShell.

EnglishRussianUkrainian