Безопасная передача пароля в скрипт инициализации
При создании виртуальной машины из образа с операционной системой Windows вы можете использовать скрипт инициализации. Например, в скрипте можно задать логин и пароль администратора и других пользователей системы. Чтобы защитить чувствительные данные, вместо явного указания в скрипте используйте возможности сервиса Yandex Lockbox.
В данном руководстве вы создадите ВМ с ОС Windows используя скрипт инициализации, в котором логины и пароли пользователей системы будут получены из сервиса Yandex Lockbox.
Чтобы создать ВМ и защитить конфиденциальную информацию в скрипте инициализации:
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в 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. Вы можете указать другой каталог с помощью параметра --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
-
Создайте ключ шифрования:
Консоль управленияCLITerraformAPI- В консоли управления
выберите каталог, в котором будет создан ключ. - Выберите сервис 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
.
Terraform
позволяет быстро создать облачную инфраструктуру в Yandex Cloud и управлять ею с помощью файлов конфигураций. В файлах конфигураций хранится описание инфраструктуры на языке HCL (HashiCorp Configuration Language). При изменении файлов конфигураций Terraform автоматически определяет, какая часть вашей конфигурации уже развернута, что следует добавить или удалить.Terraform распространяется под лицензией Business Source License
, а провайдер Yandex Cloud для Terraform — под лицензией MPL-2.0 .Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
или в зеркале .Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
Чтобы создать новый ключ:
-
Опишите в конфигурационном файле параметры ресурса
yandex_kms_symmetric_key
:resource "yandex_kms_symmetric_key" "key-a" { name = "<имя_ключа>" description = "<описание_ключа>" default_algorithm = "AES_128" rotation_period = "8760h" lifecycle { prevent_destroy = true } }
Где:
-
name
— имя ключа. Формат имени:- длина — от 3 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
description
— описание ключа. -
default_algorithm
— алгоритм шифрования. Возможные значения:AES-128
,AES-192
илиAES-256
. -
rotation_period
— период ротации (частота смены версии ключа по умолчанию). Чтобы создать ключ без автоматической ротации, не указывайте параметрrotation_period
.
Важно
Удаление ключа KMS равносильно уничтожению всех зашифрованных с его помощью данных — без ключа восстановить данные не получится. Блок
lifecycle
необходим, чтобы обезопасить ключ от удаления (например, командойterraform destroy
).Более подробную информацию о параметрах ресурсов в Terraform см. в документации провайдера
. -
-
Проверьте конфигурацию командой:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминал слово
yes
и нажмите Enter.После этого в указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
или с помощью команд CLI:yc kms symmetric-key list
Воспользуйтесь методом REST API create для ресурса SymmetricKey или вызовом gRPC API SymmetricKeyService/Create.
- В консоли управления
-
Назначьте сервисному аккаунту
win-secret-sa
рольkms.keys.encrypterDercrypter
:Консоль управленияCLIAPI- На странице ключа перейдите на вкладку Права доступа.
- Перейдите на вкладку Права доступа.
- Найдите аккаунт
win-secret-sa
в списке и нажмите значок . - Нажмите кнопку Изменить роли.
- В открывшемся диалоге нажмите кнопку Добавить роль и выберите роль
kms.keys.encrypterDercrypter
.
Выполните команду:
yc resource-manager folder add-access-binding <идентификатор_каталога> \ --role kms.keys.encrypterDercrypter \ --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
— идентификатор каталога, в котором будет создан секрет.
Если у вас еще нет Terraform, установите его и настройте провайдер Yandex Cloud.
-
Опишите в конфигурационном файле параметры ресурсов, которые необходимо создать:
resource "yandex_lockbox_secret" "win_secret" { name = "<имя_секрета>" folder_id = "<идентификатор_каталога>" kms_key_id = "<идентификатор_ключа_шифрования>" } resource "yandex_lockbox_secret_version" "win_secret_version" { secret_id = yandex_lockbox_secret.win_secret.id entries { key = "Administrator" text_value = "<пароль_администратора>" } entries { key = "user1" text_value = "<пароль_пользователя>" } }
Где:
name
— имя секрета. Обязательный параметр.folder_id
— идентификатор каталога в котором будет создан секрет. Необязательный параметр.kms_key_id
— идентификатор ключа шифрования Key Management Service. Указанный ключ Key Management Service используется для шифрования секрета.entries
— содержимое секрета.
Примечание
Рекомендуется использовать ресурс
yandex_lockbox_secret_version_hashed
, он хранит в состоянии Terraform значения в хешированном виде. Поддержка ресурсаyandex_lockbox_secret_version
остается.Более подробную информацию о ресурсе
yandex_lockbox_secret_version_hashed
см. в документации провайдера .Важно
Для повышения безопасности пароль в конфигурационном файле лучше задавать через переменную окружения.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-
Чтобы создать секрет, воспользуйтесь методом 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:<идентификатор_сервисного_аккаунта>
Чтобы назначить сервисному аккаунту роль на каталог, воспользуйтесь методом REST API setAccessBindings для ресурса ServiceAccount или вызовом gRPC API ServiceAccountService/SetAccessBindings.
Создайте ВМ
Создайте ВМ с ОС 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.key.encryptorDecryptor 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- В консоли управления
откройте каталог, в котором будет создана ВМ. - Справа сверху нажмите кнопку Создать ресурс.
- В открывшемся списке выберите Виртуальная машина.
- В блоке Общая информация:
- Введите имя ВМ, например,
win-test
. - Выберите зону доступности, в которой будет находиться ВМ.
- Введите имя ВМ, например,
- В блоке Образ загрузочного диска выберите образ с ОС Windows.
- В блоке Доступ укажите данные для доступа на ВМ:
- Выберите сервисный аккаунт
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=<imade_id> --cores 2 --core-fraction 100 --memory 4 --metadata-from-file user-data=init.ps1 --network-interface subnet-name=<subnet_name>,nat-ip-version=ipv4 --service-account-name win-test-sa --platform standard-v3
Где:
- imade_id — идентификатор образа с ОС Windows.
- subnet_name — имя подсети в каталоге, в которой вы хотите разместить ВМ.
- В консоли управления
Авторизуйтесь в ОС Windows
Чтобы проверить, что данные из секрета были успешно использованы для создания пользователей, авторизуйтесь в ОС виртуальной машины:
-
В консоли управления
выберите каталог, которому принадлежит виртуальная машина. -
Выберите сервис Compute Cloud.
-
Выберите виртуальную машину
win-test
. -
Перейдите на вкладку Серийная консоль.
-
В блоке Серийная консоль выберите
COM2
и нажмите кнопку Подключиться. В командной строке отобразится приглашение ввода команд:SAC>
-
Просмотрите список открытых каналов:
SAC>ch Channel List (Use "ch -?" for information on using channels) # Status Channel Name 0 (AV) SAC 1 (AV) 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>
Успешная авторизация означает, что данные из секрета были использованы при создании виртуальной машины.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: