Безопасная передача пароля в скрипт инициализации
При создании виртуальной машины из образа с операционной системой Windows вы можете использовать скрипт инициализации. Например, в скрипте можно задать логин и пароль администратора и других пользователей системы. Чтобы защитить чувствительные данные, вместо явного указания в скрипте используйте возможности сервиса Yandex Lockbox.
В данном руководстве вы создадите ВМ с ОС Windows используя скрипт инициализации, в котором логины и пароли пользователей системы будут получены из сервиса Yandex Lockbox.
Чтобы создать ВМ и защитить конфиденциальную информацию в скрипте инициализации:
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит:
- плата за ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование образа (зависит от образа);
- плата за использование ключа KMS (см. тарифы KMS);
- плата за использование секрета (см. тарифы Yandex Lockbox).
Создайте сервисный аккаунт
- В консоли управления
выберите каталог, в котором хотите создать сервисный аккаунт. - На вкладке Сервисные аккаунты нажмите кнопку Создать сервисный аккаунт.
- Введите имя сервисного аккаунта, например,
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
Чтобы создать сервисный аккаунт, воспользуйтесь методом ServiceAccountService/Create gRPC API или методом 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 и его провайдеры распространяются под лицензией Business Source License .Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
или в зеркале .При изменении файлов конфигураций 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
— содержимое секрета.
Важно
Для повышения безопасности пароль в конфигурационном файле лучше задавать через переменную окружения.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
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>
Успешная авторизация означает, что данные из секрета были использованы при создании виртуальной машины.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы: