Безопасная передача пароля в скрипт инициализации с помощью консоли управления, CLI или API
Чтобы создать ВМ и защитить конфиденциальную информацию в скрипте инициализации с помощью консоли управления, CLI или API:
- Подготовьте облако к работе.
- Создайте сервисный аккаунт.
- Создайте ключ KMS.
- Создайте секрет.
- Создайте ВМ.
- Авторизуйтесь в ОС Windows.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит:
- плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование образа (зависит от образа);
- плата за использование ключа KMS (см. тарифы KMS);
- плата за использование секрета (см. тарифы Yandex Lockbox).
Создайте сервисный аккаунт
- В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. - Перейдите в сервис Identity and Access Management.
- Нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например,
win-secret-sa. - Нажмите кнопку Создать.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id. Если вы обращаетесь к ресурсу по имени, поиск будет выполнен в каталоге по умолчанию. Если вы обращаетесь к ресурсу по идентификатору, поиск будет выполнен глобально — во всех каталогах с учетом прав доступа.
Выполните команду для создания сервисного аккаунта, указав имя win-secret-sa:
yc iam service-account create --name win-secret-sa
Где name — имя сервисного аккаунта.
Результат:
id: ajehr0to1g8b********
folder_id: b1gv87ssvu49********
created_at: "2024-03-15T09:03:11.665153755Z"
name: win-secret-sa
Чтобы создать сервисный аккаунт, воспользуйтесь вызовом gRPC API ServiceAccountService/Create или методом create для ресурса ServiceAccount REST API.
Создайте ключ KMS
-
Создайте ключ шифрования:
Консоль управленияCLIAPI- В консоли управления
выберите каталог, в котором будет создана ключевая пара. - Перейдите в сервис Key Management Service.
- На панели слева выберите
Симметричные ключи. - Нажмите Создать ключ и задайте атрибуты ключа:
- Имя —
win-secret-key. - Алгоритм шифрования —
AES-256. - Для остальных параметров оставьте значения по умолчанию.
- Имя —
- Нажмите Создать.
Вместе с ключом создается его первая версия: кликните по ключу в списке, чтобы открыть страницу с его атрибутами.
Выполните команду:
yc kms symmetric-key create \ --name win-secret-key \ --default-algorithm aes-256Где:
--name— имя ключа.--default-algorithm— алгоритм шифрования:aes-128,aes-192илиaes-256.
Воспользуйтесь методом REST API create для ресурса SymmetricKey или вызовом gRPC API SymmetricKeyService/Create.
- В консоли управления
-
Назначьте сервисному аккаунту
win-secret-saрольkms.keys.encrypterDecrypter:Консоль управленияCLIAPI- На странице ключа перейдите на вкладку Права доступа.
- На странице Права доступа к сервисному аккаунту найдите аккаунт
win-secret-saв списке и нажмите значок . - Нажмите кнопку Изменить роли.
- В открывшемся диалоге нажмите кнопку Добавить роль и выберите роль
kms.keys.encrypterDecrypter.
Выполните команду:
yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role kms.keys.encrypterDecrypter \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>Чтобы назначить сервисному аккаунту роль на каталог, воспользуйтесь методом REST API setAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/SetAccessBindings.
Создайте секрет
Создайте секрет в сервисе Yandex Lockbox и сохраните в нем логины и пароли пользователей, для которых будут созданы учетные записи в ОС Windows.
Важно
При выборе пароля обязательно соблюдайте требования к безопасности пароля, иначе учетная запись для пользователя не будет создана.
Пароль должен:
- быть не короче восьми символов;
- не содержать в себе имени учетной записи;
- содержать знаки минимум трех из четырех групп:
- латинские заглавные буквы (A-Z);
- латинские строчные буквы (a-z);
- цифры (0-9);
- неалфавитные символы (!, ?, %, $, # и т. д.).
- Перейдите в сервис Lockbox.
- Нажмите кнопку Создать секрет.
- В поле Имя введите имя секрета:
win-secret. - В поле Ключ KMS укажите ключ
win-secret-key. - В блоке Версия:
- В поле Ключ введите логин администратора
Administrator. - В поле Значение введите пароль для администратора.
- В поле Ключ введите логин администратора
- При желании добавьте еще пользователей. Для этого нажмите кнопку Добавить ключ/значение и введите логин и пароль для следующего пользователя.
- Нажмите кнопку Создать.
-
Выполните команду:
yc lockbox secret create \ --name win-secret \ --kms-key-id <идентификатор_ключа> \ --payload "[{'key': 'Administrator', 'text_value': '<пароль_администратора>'},{'key': 'user1', 'text_value': '<пароль_пользователя>'}]" \ --cloud-id <идентификатор_облака> \ --folder-id <идентификатор_каталога>Где:
--name— имя секрета. Обязательный параметр.--kms-key-id— идентификатор ключа KMS.--description— описание секрета. Необязательный параметр.--payload— содержимое секрета в виде массива формата YAML или JSON.--cloud-id— идентификатор облака, в котором будет создан секрет.--folder-id— идентификатор каталога, в котором будет создан секрет.
Чтобы создать секрет, воспользуйтесь методом REST API create для ресурса Secret или вызовом gRPC API SecretService/Create.
-
Назначьте сервисному аккаунту
win-secret-saрольlockbox.payloadViewer:Консоль управленияCLIAPI- На странице секрета перейдите на вкладку Права доступа.
- Перейдите на вкладку Права доступа.
- Найдите аккаунт
win-secret-saв списке и нажмите значок . - Нажмите кнопку Изменить роли.
- В открывшемся диалоге нажмите кнопку Добавить роль и выберите роль
lockbox.payloadViewer.
Выполните команду:
yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role lockbox.payloadViewer \ --subject serviceAccount:<идентификатор_сервисного_аккаунта>
Создайте ВМ
Создайте ВМ с ОС Windows и учетными записями администратора и пользователей.
-
Создайте файл
init.ps1и сохраните в него код:#ps1 # logging Start-Transcript -Path "$ENV:SystemDrive\provision2.txt" -IncludeInvocationHeader -Force "Bootstrap script started" | Write-Host # SECRET'S ID: $SecretID = "<secret_id>" [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 $SecretURL = "https://payload.lockbox.api.cloud.yandex.net/lockbox/v1/secrets/$SecretID/payload" "Secret ID is $SecretID" "Payload URL is $SecretURL" $YCToken = (Invoke-RestMethod -Headers @{'Metadata-Flavor'='Google'} -Uri "http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token").access_token if (!$YCToken) { throw "Service Account doesn't connected to VM. Please, add Service account with roles lockbox.payloadViewer and kms.keys.encrypterDecrypter to VM and try again." } # Creating parameters for REST-invokations $Headers = @{ Authorization="Bearer $YCToken" } $Params = @{ Uri = $SecretURL Method = "GET" Headers = $Headers } # Getting secret via REST invoke $Secret = Invoke-RestMethod @Params $SecretAdministratorPlainTextPassword = $Secret.entries[0].textValue # inserting value's from terraform if (-not [string]::IsNullOrEmpty($SecretAdministratorPlainTextPassword)) { "Set local administrator password" | Write-Host $SecretAdministratorPassword = $SecretAdministratorPlainTextPassword | ConvertTo-SecureString -AsPlainText -Force # S-1-5-21domain-500 is a well-known SID for Administrator # https://docs.microsoft.com/en-us/troubleshoot/windows-server/identity/security-identifiers-in-windows $Administrator = Get-LocalUser | Where-Object -Property "SID" -like "S-1-5-21-*-500" $Administrator | Set-LocalUser -Password $SecretAdministratorPassword } # Creating new users if any if($Secret.entries.count -gt 1) { foreach($User in $Secret.entries[1..($Secret.entries.count-1)]){ $SecretUserPassword = $User.textValue | ConvertTo-SecureString -AsPlainText -Force New-LocalUser -Name $User.key -Password $SecretUserPassword -FullName $User.key Add-LocalGroupMember -Group Users -Member $User.key Add-LocalGroupMember -Group "Remote Desktop Users" -Member $User.key } } "Bootstrap script ended" | Write-Host -
В файле
init.ps1замените<secret_id>на реальный идентификатор секрета, в котором вы сохранили учетные записи пользователей. -
Создайте ВМ:
Консоль управленияCLI- В консоли управления
откройте каталог, в котором будет создана ВМ. - Справа сверху нажмите кнопку Создать ресурс и выберите
Виртуальная машина. - В блоке Образ загрузочного диска выберите образ с ОС Windows.
- В блоке Расположение выберите зону доступности, в которой будет находиться ВМ.
- В блоке Общая информация задайте имя ВМ, например,
win-test. - В блоке Дополнительно укажите данные для доступа на ВМ:
- Выберите сервисный аккаунт
win-secret-sa. - Разрешите доступ к серийной консоли.
- Выберите сервисный аккаунт
- В блоке Метаданные:
- В поле Ключ укажите
user-data. - В поле Значение вставьте содержимое файла
init.ps1.
- В поле Ключ укажите
- Нажмите кнопку Создать ВМ.
Выполните команду:
yc compute instance create \ --name win-test \ --hostname windows10 \ --zone ru-central1-a \ --create-boot-disk image-id=<идентификатор_образа> \ --cores 2 \ --core-fraction 100 \ --memory 4 \ --metadata-from-file user-data=init.ps1 \ --network-interface subnet-name=<имя_подсети>,nat-ip-version=ipv4 \ --service-account-name win-secret-sa \ --platform standard-v3Где:
image_id— идентификатор образа с ОС Windows.subnet_name— имя подсети, в которой вы хотите разместить ВМ.
Примечание
Команды
yc compute instance create|create-with-container|update|add-metadataподдерживают подстановку в метаданные ВМ значений переменных окружения. Эти значения, заданные в ключеuser-dataв формате$<имя_переменной>, в момент выполнения команды Yandex Cloud CLI будут подставлены в метаданные ВМ из переменных окружения среды, в которой выполняется команда.Чтобы изменить такое поведение, не подставлять значение переменной из среды выполнения команды CLI и передать в метаданные ВМ имя переменной в формате
$<имя_переменной>, используйте синтаксис с двумя символами доллара. Например:$$<имя_переменной>.Подробнее см. в разделе Особенности передачи переменных окружения в метаданных через CLI.
- В консоли управления
Авторизуйтесь в ОС Windows
Чтобы проверить, что данные из секрета были успешно использованы для создания пользователей, авторизуйтесь в ОС виртуальной машины:
-
В консоли управления
выберите каталог, которому принадлежит виртуальная машина. -
Перейдите в сервис Compute Cloud.
-
Выберите виртуальную машину
win-test. -
Перейдите на вкладку Серийная консоль.
-
В блоке Серийная консоль выберите
COM2и нажмите кнопку Подключиться. В командной строке отобразится приглашение ввода команд:Computer is booting, SAC started and initialized. Use the "ch -?" command for information about using channels. Use the "?" command for general help. SAC> EVENT: The CMD command is now available. -
Просмотрите список открытых каналов:
SAC>ch Channel List (Use "ch -?" for information on using channels) # Status Channel Name 0 (AV) SAC -
При необходимости создайте новый канал с экземпляром командной оболочки:
SAC>cmd The Command Prompt session was successfully launched. SAC> EVENT: A new channel has been created. Use "ch -?" for channel help. Channel: Cmd0001 -
Чтобы перейти на канал, нажмите сочетание клавиш ESC + TAB или выполните команду:
SAC>ch -sn Cmd0001 Name: Cmd0001 Description: Command Type: VT-UTF8 Channel GUID: e203fb79-d80d-11ea-87e3-c2679e14957d Application Type GUID: 63d02271-8aa4-11d5-bccf-00b0d014a2d0 Press <esc><tab> for next channel. Press <esc><tab>0 to return to the SAC channel. Use any other key to view this channel. -
Нажмите Enter и последовательно введите:
- Имя пользователя.
- Домен, если вход выполняется под доменной учетной записью. Иначе введите имя хоста либо оставьте пустым.
- Пароль.
Please enter login credentials. Username: Administrator Domain : Password: *************** -
Если авторизация прошла успешно, запустится экземпляр интерпретатора командной строки:
C:\Windows\system32>Успешная авторизация означает, что данные из секрета были использованы при создании виртуальной машины.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: