powershell шифрование пароля в скриптах
Повторное использование логина и пароля в Powershell с Get-Credential и их шифрование
Минусы описанных вариантов в том, что нам требуется вводить нужный логин и пароль каждый раз, когда мы запускаем Powershell (открываем/закрываем сессию). В этой статье будут рассмотрены несколько вариантов хранения учетных данных и их загрузка.
Навигация по посту
В чем особенность хранения учетных данных в Powershell?
Кроме этого, процесс создания SecureString и последующее шифрование уникальны для каждого компьютера и пользователя. Поэтому мы не сможем просто перенести этот файл на другой компьютер и использовать. Такой процесс работы с данными называется Windows Data Protection API.
В статье будут рассмотрены большинство способов работы и переноса учетных данных.
Импорт и экспорт в XML
После ввода учетных данных мы получаем обычный объект, который будет выглядеть так:
Экспорт в XML мы можем выполнить с помощью следующей команды, которая выполнит шифрование пароля и сохранит данные в корне диска ‘C’:
На примере ниже можно увидеть, что логин пользователя не зашифрован, в отличие от пароля:
Теперь мы можем загружать этот файл и использовать другие учетные данные без повторного ввода:
Мы можем конвертировать пароль из SecureString обратно в строку:
Минусы этого способа будут в том, вы должны будете генерировать такой файл для каждого компьютера и пользователя отдельно.
Импорт и экспорт пароля из обычного файла
Для того что бы безопасно сохранять эти данные в файл мы можем зашифровать их с помощью команды ConvertFrom-SecureString:
Результат команды выше будет та же строка, что была у пароля при выполнении команды Export-CliXML:
Мы можем открыть этот, и преобразовать зашифрованный пароль в объект SecureString:
Создание объекта PSCredential
Т.е. с этим способом мы можем создать учетные данные в нужном формате, но для этого мы должны будем хранить файл с паролем в чистом виде.
Шифрование пароля используя симметричный ключ
Мы можем шифровать файл с паролем используя симметричное шифрование (AES). После шифрования вы сможете опубликовать пароль в открытой папке и выдавать права или предоставлять сам ключ шифрования.
С помощью следующей команды мы создадим симметричный ключ для последующего шифрования пароля:
Далее я создам SecureString (объект в оперативной памяти) что бы потом его зашифровать ключом созданным выше:
Теперь у нас есть 2 файла, с помощью которого мы можем организовывать доступ к паролю. Это файл:
Вы сможете перенести эти файлы на другой компьютер и выполнить следующую операцию для расшифровки:
Использование Credential Manager (Диспетчер учетных данных)
Многие знают, что пароли от сетевых дисков (и многие другие) хранятся в специальном месте под названием Credential Manager. В панели управления он выглядит так:
Мы можем получить доступ к этим объектам использовав модуль CredentialManager. Этот модуль не относится к стандартным и устанавливается отдельно:
У вас могут появится два уведомления говорящие об установке репозитория NuGet и о том, что он является не доверенным.
У нас станут доступны 4 команды:
Далее мы сможем получить все учетные данные указав нужный тип в атрибуте Type или Target (источник) которому эти данные принадлежат:
Мы получаем объект типа PSCredential, который мы можем использовать в командах. Создавать новые учетные данные и добавлять их в хранилище CredentialManager мы тоже можем:
Кроме логина и пароля мы указываем:
Первые два пункта особого значения не имеют. Они предназначены для программ, которые получают пароли по определенным идентификаторам. В ваших скриптах вы выбираете идентификаторы для себя.
Как загружать переменную с учетными данными при открытии Powershell
В Powershell есть возможность загружать переменные (и другие данные) при открытии самой консоли. Например мы сможем единожды объявить переменные ‘$credential_local’, ‘$credential_domain’, ‘$credential_forest’ и каждый раз открывать консоль Powershell они сами будут импортироваться.
В этот файл мы помещаем один из скриптов написанных выше:
Теперь, открывая консоль, вы всегда сможете вызвать эту переменную:
Защита и шифрование паролей в скриптах PowerShell
Администраторы часто при написании сценариев автоматизации на PowerShell сохраняют пароли непосредственно в теле PoSh скрипта. Как вы понимаете, это крайне небезопасно при использовании в продуктивной среде, т.к. пароль в открытом виде могут увидеть другие пользователи сервера или администраторы. Поэтому желательно использовать более безопасный метод использования паролей в скриптах PowerShell, или шифровать пароли, если нельзя пользоваться интерактивным вводом.
Безопасно можно запросить от пользователя ввести пароль в скрипте интерактивно с помощью командлета Get-Credential. Например, запросим имя и пароль пользователя и сохраним его в объекте типа PSCredential:
При обращении к свойствам переменной можно узнать имя ползователя, который был указан.
Но при попытке вывести пароль, вернется текст System.Security.SecureString, т.к. пароль теперь хранится в виде SecureString.
Также для запроса пароля пользователя можно использовать команлет Read-Host с атрибутом AsSecureString:
$pass = Read-Host «Введите пароль» –AsSecureString
В рассмотренных выше способах использования пароля в скриптах PowerShell предполагался интерактивный ввод пароля при выполнении скрипта. Но этот способ не подойдет для различных сценариев, запускаемых автоматически или через планировщик.
В этом случае удобнее зашифровать данные учетной записи (имя и пароль) и сохранить их в зашифрованном виде в текстовый файл на диске или использовать непосредственно в скрипте.
Итак, с помощью комадлета ConvertFrom-SecureString можно преобразовать пароль из формата SecureString в шифрованную строку (шифрование выполняется с помощью Windows Data Protection API — DPAPI). Вы можете вывести шифрованный пароль на экран или сохранить в файл:
$Cred.Password| ConvertFrom-SecureString | Set-Content c:\ps\passfile.txt
Чтобы использовать зашифрованный пароль из файла нужно выполнить обратное преобразование в формат Securestring с помощью командлета ConvertTo-SecureString:
Таким образом, если скрипт будет запускаться под другим (сервисным) аккаунтом или на другом компьютере, необходимо использовать другой механизм шифрования, отдичный от DPAPI. Внешний ключ шифрования можно указать с помощью параметров –Key или –SecureKey.
Например, вы можете с помощью PowerShell сгенерировать 256 битный AES ключ, который можно использовать для расшифровки файла. Сохраним ключ в текстовый файл password_aes.key.
$AESKey = New-Object Byte[] 32
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($AESKey)
$AESKey | out-file C:\ps\password_aes.key
Теперь можно сохранить пароль в файл с помощью данного ключа:
Таким образом у нас получилось два файла: файл с зашифрованным паролем (passfile.txt) и файл с ключом шифрования (password_aes.key).
Их можно перенести на другой компьютер и попытаться из PowerShell получить пароль из файла (можно разместить файл ключа в сетевом каталоге)
Если не хочется заморачивать с отдельным файлом с AES ключом, можно зашить ключ шифрования прямо в скрипт. В этом случае вместо ключа в обоих случая нужно использовать
Как вы видите пароль не пустой, значит он был успешно расшифрован и может быть использован на других компьютерах.
И напоследок, самый печальный момент. Пароль из объекта PSCredential в открытом виде вытаскивается очень просто:
Можно извлечь пароль в текстовом виде и из SecureString:
Как вы понимаете, именно поэтому нежелательно сохранять пароли привилегированных учетных записей, таких как Domain Admins где бы то ни было кроме DC.
Сохранение учетных данных в PowerShell
Сохранение учетных данных довольно часто используется в PowerShell скриптах для автоматизации заданий, либо при делегировании полномочий для выполнения каких-либо административных задач.
По умолчанию скрипты выполняется от имени пользователя\процесса, его запустившего. Однако многие командлеты имеют параметр Credential, позволяющий указывать альтернативные учетные данные. Для примера возьмем командлет Get-WmiObject и попробуем посмотреть тип процессора на удаленном компьютере SRV1 с помощью команды:
Как видите, теперь удаленная команда выполнилась успешно.
Поскольку вводить каждый раз пароль не всегда возможно, то нам надо как-то сохранить его. Например, вывести в зашифрованном виде в обычный текстовый файл:
$credentials.Password | ConvertFrom-SecureString | Set-Content pass.txt
Теперь для того чтобы использовать сохраненный пароль, надо вытащить содержимое файла и преобразовать обратно в формат Securestring. Выглядеть это будет примерно так:
Полученные таким образом Credentials можно использовать для выполнения удаленной команды.
Вроде бы все получилось, учетные данные сохранены. Однако не все так просто. Если мы соберем все команды в скрипт, скопируем его (вместе с файлом, содержащим пароль) на другой компьютер и там попробуем выполнить, то получим ошибку. Если присмотреться повнимательней, то видно, что ошибка произошла из за отсутствия пароля (argument ″password″ is null).
Дело в том, что при сохранении в файл пароль шифруется с помощью механизма Windows Data Protection API (DPAPI). Это встроенный в систему программный интерфейс, использующийся для шифрования и обеспечения безопасности Internet Explorer, Outlook, IIS и многих других компонентов Windows.
Шифрование пароля производится с помощью ключей, создаваемых операционной системой. Ключи эти создаются из пользовательских учетных данных и хранятся локально, в профиле пользователя. Без этих ключей зашифрованные данные невозможно использовать. Проще говоря, сохраненные таким образом учетные данные нельзя перенести на другой компьютер или файловую шару, их можно использовать только локально, на том компьютере, на котором они были получены.
Чтобы отвязать зашифрованные данные от локальной машины ключ, которым будут зашифрованы данные, можно задать вручную. Делается это с помощью параметра key, допустимая длина ключа 16, 24 или 32 бит. Например:
Ключ необходимо запомнить\сохранить и при обратном преобразовании указать его. Получится как то так:
Теперь мы можем спокойно переносить скрипт и без помех использовать его на других компьютерах.
И в завершение, чтобы у вас не было особых иллюзий по поводу безопасности — зашифрованные пароли легко выдергиваются из сохраненных учетных данных, причем открытым текстом. Например, из PSCredential пароль вытаскивается очень просто:
И чуть сложнее из SecureString:
$BSTR = [System.Runtime.InteropServices.Marchall]::SecureStringToBSTR($credentials.Password)
[System.Runtime.InteropServices.Marchall]::PtrToStringAuto($BSTR)
Как видите, сохранение учетных данных небезопасно, поэтому старайтесь использовать учетные записи с минимальным необходимым набором прав. Не стоит подобным образом хранить пароли пользователей, входящих в группу Domain\Enterprise Admins (и им подобных).
Защита информации при помощи Windows PowerShell
В архиве находятся два PS скрипта:
Примечание: Исполняемые файлы не будут работать на другом компьютере. Можно смело хранить конфидециальную информацию (пароли, настройки и т. д.).
Скачать файлы
Специальные предложения
Обновление 20.08.09 01:07
Код открыт Не указано
См. также
Запуск 1С под любым пользователем (без необходимости указания пароля) Промо
Предназначается для запуска сеанса другого пользователя из своего сеанса 1С (если пароль вам неизвестен).
02.07.2019 27822 288 sapervodichka 0
Генератор ролей
Обработка генерирует атомарные наборы ролей для каждого объекта метаданных (Справочник, Документ, Отчет, Обработка, Регистр сведений).
12.05.2021 2264 6 anton.fly7 7
Как увидеть пароли, сохраненные в базе 1С
Обработка, позволяющая посмотреть пароли и прочие данные скрываемые звёздочками на формах настройки.
11.05.2021 10606 50 lepihin 27
Анализ ролей доступа
Быстрое определение, каких ролей доступа не хватает и на что влияет выбранная роль.
06.01.2021 5248 78 yermak 9
Анализ ролей и прав доступа Промо
Отчет для анализа ролей и прав с использованием СКД. Формируется в разрезе объектов, ролей, пользователей и прав (чтение, просмотр и т.д.). Позволяет быстро узнать, какие пользователи или роли имеют конкретные права на объекты.
09.01.2015 35983 20 kser87 7
Групповое добавление и удаление ролей из списка профилей
Подключаемая обработка. Помогает при конструировании профилей доступа пользователей (настройке прав пользователей), экономит время на добавлении/удалении одной и той же роли сразу в нескольких профилях.
14.12.2020 6670 37 sapervodichka 9
Анализ прав доступа на объекты метаданных 1С (быстрое получение списка только тех ролей, у которых есть соответствующий доступ). А так же получение списка ролей, которым дано право «Интерактивное удаление» (или другое, на выбор)
Часто нужно получить набор ролей, в которых есть определенное право для объекта. Чтобы не перебирать все роли в поисках доступных прав, можно воспользоваться этой обработкой. Она покажет только те роли, в которых назначено нужное нам право. И конфигуратор открывать не нужно. Особенно полезно для анализа облачных баз. По просьбам трудящихся, дополняю функционал: теперь можно быстро найти те объекты и роли, у которых есть право «Интерактивное удаление» для этого есть специальная кнопка.
08.11.2020 3863 26 akrelius 6
Обфускатор операционного кода 1С
Защита обработок 1С от восстановления исходного кода awa-ким декомпилятором. Протестировано 1С:Предприятие 8.3 (8.3.16.1502)
18.09.2020 8349 41 MoiseevSN 37
Просмотр прав пользователей Промо
Обработка наглядно показывает права доступа конкретного пользователя или роли к конкретному объекту метаданных.
19.10.2012 35373 306 NILS2009 17
Подсистема прав доступа к объектам с гибкими отборами (расширение)
Возможность без доработок конкретизировать пользователям права Просмотра и Изменения объектов базы 1С, установив ограничения с помощью отборов системы компоновки данных.
02.07.2020 16702 207 sapervodichka 109
Настройка ограничений входа пользователей в базу (расширение)
Настраиваем для пользователей 1С разрешенное количество открытых сеансов к текущей базе данных 1С в привязке к компьютерам. (У пользователя не будет возможности превысить допустимое количество сеансов или зайти с чужого компьютера).
19.05.2020 13257 24 sapervodichka 14
Обозреватель криптографии
Отчет для просмотра доступных провайдеров и сертификатов криптографии на сервере и клиенте.
21.10.2019 13978 19 YPermitin 10
Отключение доступа уволенным пользователям Промо
Давно хотели навести порядок в пользователях? Надоело, что в списке мешаются давно уволенные сотрудники? Тогда эта обработка для Вас!
15.10.2013 54642 109 VBod 17
Завершение работы пользователей
Завершение работы пользователей с помощью подключения обработчика ожидания.
02.10.2019 8827 16 user921814 6
Оптимизация прав ролей
09.09.2019 31806 10 toxilamer 11
Автоматическая блокировка интерфейса 1С при простое в работе пользователя
Простой способ реализации автоматической временной блокировки интерфейса программы при низкой активности пользователя некоторое время.
28.08.2019 10551 12 shalex5 0
Права доступа ролей Промо
Отчет по правам доступа ролей, выводит в удобной краткой форме права доступа в разрезе ролей на интересующие нас объекты метаданных или объекты метаданных, к которым есть доступ у интересующей нас роли. Показывает наличие RLS и позволяет сравнить роли. Отображает использование роли в профилях групп доступа/группах доступа.
05.02.2018 21889 155 Serge R 5
PowerShell из 1С: создание пользователя Active Directory
Пример создания пользователя Active Directory с помощью PowerShell из 1С.
27.08.2019 13737 24 wowik 13
Вход в программу под нужным пользователем из карточки пользователя [Расширение]
При проверке прав пользователей и тестировании требуется быстро войти в программу под пользователем (не меняя пароль пользователю). Для этого в карточку пользователя добавлена кнопка «Запустить сеанс».
03.07.2019 5785 24 WinnerOnLine 3
Сравнение доступа профилей, ролей, пользователей по всем объектам конфигурации 8.3, 8.2 (обычные формы «ОФ» и управляемые формы «УФ») (выборочно)(НАБОР УТИЛИТ)
23.06.2019 9270 38 AlexandrSmith 0
Регистры правил [Расширение] Промо
15.03.2018 22640 30 33lab 5
Подсистема динамических прав
Подсистема прав, позволяющая в реальном времени (без назначения ролей, перезапуска 1с, изменения конфигурации) менять права пользователя: Просмотр, Создание, Изменение, Проведение, Отмена проведения, Изменение проведенных, Неоперативное проведение. Существенно упрощает управление правами в базах с большим количеством пользователей. Версия платформы 8.3.12.1685.
10.04.2019 10645 17 itmind 53
Запуск 1С под другим пользователем без ввода пароля
Для проверки настроек ролей и прав или для отладки можно использовать это решение.
22.03.2019 10837 51 pridecom 0
Наследование ролей в профилях групп доступа в конфигурациях на базе БСП
С помощью данной доработки можно создать новый профиль групп доступа, с наследованием ролей от базового (поставляемого) профиля. В созданном профиле можно добавить или исключить какие-либо роли относительно базового профиля.
15.03.2019 12886 18 ids79 1
Включение и выключение регистрации отказа в доступе если «У пользователя не достаточно прав над операцией с базой данных». Промо
Включает (выключает) регистрацию событий отказа доступа в журнале регистрации.
12.01.2011 39637 368 nexts 32
Программа для просмотра хэшей паролей пользователей в файловых и клиент-серверных базах 1С. Зачем это нужно? Для их проверки на криптостойкость.
25.02.2019 8316 13 GeraltSnow 5
Обезличивание базы ЗУП 3.1.*
Обработка по перемешиванию/скрытию конфиденциальной информации в базе ЗУП.
05.02.2019 13800 78 Skin123 13
Наводим порядок в Active Directory с помощью ЗУП / ЗИКГУ 3.1 (идентификация, отключение и актуализация учетных записей пользователей)
01.02.2019 12547 51 Туки Туки 14
Convert To-Secure String
Converts plain text or encrypted strings to secure strings.
Syntax
Description
If the standard string being converted was encrypted with ConvertFrom-SecureString using a specified key, that same key must be provided as the value of the Key or SecureKey parameter of the ConvertTo-SecureString cmdlet.
Note that per DotNet, the contents of a SecureString are not encrypted on non-Windows systems.
Examples
Example 1: Convert a secure string to an encrypted string
This example shows how to create a secure string from user input, convert the secure string to an encrypted standard string, and then convert the encrypted standard string back to a secure string.
Example 2: Create a secure string from an encrypted string in a file
This example shows how to create a secure string from an encrypted standard string that is saved in a file.
Example 3: Convert a plain text string to a secure string
You should avoid using plain text strings in script or from the command line. The plain text can show up in event logs and command history logs.
Parameters
Specifies a plain text string to convert to a secure string. The secure string cmdlets help protect confidential text. The text is encrypted for privacy and is deleted from computer memory after it is used. If you use this parameter to provide plain text as input, the system cannot protect that input in this manner. To use this parameter, you must also specify the Force parameter.
Type: | SwitchParameter |
Position: | 1 |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Confirms that you understand the implications of using the AsPlainText parameter and still want to use it.
Type: | SwitchParameter |
Position: | 2 |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies the encryption key used to convert the original secure string into the encrypted standard string. Valid key lengths are 16, 24 and 32 bytes.
Type: | Byte [ ] |
Position: | Named |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies the encryption key used to convert the original secure string into the encrypted standard string. The key must be provided in the format of a secure string. The secure string will be converted to a byte array to be used as the key. Valid secure key lengths are 8, 12 and 16 code points.
Type: | SecureString |
Position: | 1 |
Default value: | None |
Accept pipeline input: | False |
Accept wildcard characters: | False |
Specifies the string to convert to a secure string.
Type: | String |
Position: | 0 |
Default value: | None |
Accept pipeline input: | True |
Accept wildcard characters: | False |
Inputs
Outputs
ConvertTo-SecureString returns a SecureString object.
Notes
Some characters, such as emoticons, correspond to several code points in the string that contains them. Avoid using these characters because they may cause problems and misunderstandings when used in a password.