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
Чтобы вывести список доступных командлетов в модулях, используйте команды:
Get-Command -Module Microsoft.PowerShell.SecretManagement
Get-Command -Module Microsoft.PowerShell.SecretStore
Создаем хранилище паролей (SecretStore Vault)
Сначала нужно создать локальное хранилище паролей. Я назову его MyDomainPassdb и назначу в качестве хранилища паролей по умолчанию.
Register-SecretVault -Name MyDomainPassdb -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault
Set-ExecutionPolicy -Scope Process Unrestricted
Вы можете создавать и использовать как локальные, так и удаленные хранилища паролей.
Следующая команда выведет список зарегистрированных хранилищ паролей для текущего пользователя:
Get-SecretVault
Задайте мастер пароль для доступа к хранилищу паролей:
Get-SecretStoreConfiguration
По умолчанию доступ к хранилищам паролей определяется следующими настройками:
- Scope – CurrentUser (хранилище доступно только текущему пользователю);
- Authentication – Password (доступ к хранилищу через мастер пароль);
- PasswordTimeout – 900 (длительность сессии, в течении которой мастер пароль не запрашивается повторно – 15 минут, можно увеличить:
Set-SecretStoreConfiguration -PasswordTimeout 1200)
; - Interaction – Prompt (нужно ли запрашивать мастер пароль при внесении изменений).
Set-SecretStoreConfiguration -Authentication None
Чтобы изменить мастер пароль, воспользуйтесь командлетом
Set-SecretStorePassword
.
%LOCALAPPDATA%\Microsoft\PowerShell\secretmanagement
.К сожалению, модуль 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'
Вывести список записей в хранилище паролей можно так:
Get-SecretInfo
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 corp\adm_aivanov)
Вести список сохранённых паролей и их описание можно так:
Get-SecretInfo | Ft Name, Metadata
Как использовать сохраненные пароли в скриптах 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.winitpro.ru/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
Затем зарегистрируйте хранилище KeePass в своем профиле пользователя:
Register-SecretVault -Name "KeePassDB" -ModuleName "SecretManagement.Keepass" -VaultParameters @{
Path = "C:\Users\root\Documents\personal_creds.kdbx"
UseMasterPassword = $true
}
Чтобы проверить доступ к файлу KeePass, выполните команду:
Test-SecretVault -Name KeePassDB
Укажите мастер пароль для доступа к файлу KeePass. Если вы указали правильный пароль, команда должна вернуть True.
Теперь можно вывести список сохраненных паролей в базе KeePass.
Get-SecretInfo -Vault KeePassDB
Чтобы сохранить новые пароль в KeePass:
Set-Secret -Vault KeePassDB -Name "ILO_adm" -Secret (Get-Credential winitpro\ILO_adm)
Аналогичным образом вы можете подключить любое другое популярное решение для хранения паролей и использовать его в PowerShell.