Безопасная передача пароля в скрипт инициализации с помощью Terraform
Чтобы создать ВМ и защитить конфиденциальную информацию в скрипте инициализации с помощью Terraform:
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость поддержки инфраструктуры входит:
- плата за постоянно запущенные ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование образа (зависит от образа);
- плата за использование ключа KMS (см. тарифы KMS);
- плата за использование секрета (см. тарифы Yandex Lockbox).
Создайте инфраструктуру
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Для создания инфраструктуры с помощью Terraform:
-
Установите Terraform, получите данные для аутентификации и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файлы с описанием инфраструктуры:
Готовая конфигурацияВручную-
Клонируйте репозиторий с конфигурационными файлами.
git clone https://github.com/yandex-cloud-examples/yc-secured-password.git -
Перейдите в директорию с репозиторием. В ней должны появиться файлы:
yc-secured-password.tf— конфигурация создаваемой инфраструктуры.script.tpl— шаблон скрипта создания учетных записей администратора и пользователей.yc-secured-password.auto.tfvars— файл с пользовательскими данными.
- Создайте папку для конфигурационных файлов.
- Создайте в папке:
-
Конфигурационный файл
yc-secured-password.tf:yc-secured-password.tf
# Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { folder_id = var.folder_id } # Объявление переменных для конфиденциальных параметров variable "zone" { type = string } variable "folder_id" { type = string } variable "admin_pass" { type = string sensitive = true } variable "username" { type = string } variable "user_pass" { type = string sensitive = true } variable "image_family" { type = string } # Создание облачной сети и подсети resource "yandex_vpc_network" "network-1" { name = "win-network" } # Создание подсети resource "yandex_vpc_subnet" "subnet-a" { name = "win-subnet" zone = var.zone v4_cidr_blocks = ["192.168.1.0/24"] network_id = yandex_vpc_network.network-1.id } # Создание группы безопасности resource "yandex_vpc_security_group" "vm-sg" { name = "vm_security_group" network_id = yandex_vpc_network.network-1.id egress { protocol = "ANY" description = "any" from_port = 0 to_port = 65535 v4_cidr_blocks = ["0.0.0.0/0"] } ingress { protocol = "TCP" description = "ext-http" v4_cidr_blocks = ["0.0.0.0/0"] port = 80 } ingress { protocol = "TCP" description = "ext-https" v4_cidr_blocks = ["0.0.0.0/0"] port = 443 } ingress { protocol = "TCP" description = "ext-https" v4_cidr_blocks = ["0.0.0.0/0"] port = 3389 } } # Создание сервисного аккаунта resource "yandex_iam_service_account" "my-sa" { name = "win-secret-sa" } # Назначение прав сервисному аккаунту resource "yandex_resourcemanager_folder_iam_member" "view-keys" { folder_id = var.folder_id role = "kms.keys.encrypterDecrypter" member = "serviceAccount:${yandex_iam_service_account.my-sa.id}" } resource "yandex_resourcemanager_folder_iam_member" "view-payload" { folder_id = var.folder_id role = "lockbox.payloadViewer" member = "serviceAccount:${yandex_iam_service_account.my-sa.id}" } # Создание симметричного KMS-ключа шифрования resource "yandex_kms_symmetric_key" "key-a" { name = "win-secret-key" default_algorithm = "AES_128" rotation_period = "8760h" } # Создание секрета resource "yandex_lockbox_secret" "win_secret" { name = "win-secret" folder_id = var.folder_id kms_key_id = yandex_kms_symmetric_key.key-a.id } # Создание версии секрета resource "yandex_lockbox_secret_version_hashed" "win_secret_version" { secret_id = yandex_lockbox_secret.win_secret.id key_1 = "Administrator" text_value_1 = var.admin_pass key_2 = var.username text_value_2 = var.user_pass } # Создание загрузочного диска для ВМ data "yandex_compute_image" "default" { family = var.image_family } resource "yandex_compute_disk" "boot-disk" { type = "network-ssd" zone = var.zone size = "100" image_id = data.yandex_compute_image.default.id } # Создание ВМ resource "yandex_compute_instance" "my-vm" { name = "win-test" platform_id = "standard-v2" zone = var.zone service_account_id = yandex_iam_service_account.my-sa.id resources { cores = "2" memory = "4" } boot_disk { disk_id = yandex_compute_disk.boot-disk.id } network_interface { subnet_id = yandex_vpc_subnet.subnet-a.id nat = true security_group_ids = ["${yandex_vpc_security_group.vm-sg.id}"] } metadata = { serial-port-enable = 1 user-data = templatefile("script.tpl", { MYSECRET_ID = yandex_lockbox_secret.win_secret.id }) } } -
script.tpl— шаблон скрипта создания учетных записей администратора и пользователей:script.tpl
#ps1 # logging Start-Transcript -Path "$ENV:SystemDrive\provision2.txt" -IncludeInvocationHeader -Force "Bootstrap script started" | Write-Host # SECRET'S ID: $SecretID = "${MYSECRET_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 -
Файл с пользовательскими данными
yc-secured-password.auto.tfvars:zone = "<зона_доступности>" folder_id = "<идентификатор_каталога>" admin_pass = "<пароль_администратора>" username = "<имя_пользователя>" user_pass = "<пароль_пользователя>" image_family = "<семейство_образа>"
-
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
- Облачная сеть — yandex_vpc_network.
- Подсеть — yandex_vpc_subnet.
- Группа безопасности — yandex_vpc_security_group.
- Сервисный аккаунт — yandex_iam_service_account.
- Назначение прав — yandex_resourcemanager_folder_iam_member.
- Симметричный ключ шифрования — yandex_kms_symmetric_key.
- Секрет — yandex_lockbox_secret.
- Версия секрета — yandex_lockbox_secret_version_hashed.
- Образ — yandex_compute_image.
- Диск — yandex_compute_disk.
- Виртуальная машина — yandex_compute_instance.
-
-
В файле
yc-secured-password.auto.tfvarsзадайте пользовательские параметры:-
zone— зона доступности. -
folder_id— идентификатор каталога. -
admin_pass— пароль администратора.Важно
При выборе пароля обязательно соблюдайте требования к безопасности пароля, иначе учетная запись для пользователя не будет создана.
Пароль должен:- быть не короче восьми символов;
- не содержать в себе имени учетной записи;
- содержать знаки минимум трех из четырех групп:
- латинские заглавные буквы (A-Z);
- латинские строчные буквы (a-z);
- цифры (0-9);
- неалфавитные символы (!, ?, %, $, # и т. д.).
-
username— имя пользователя. -
user_pass— пароль пользователя. -
image_family— семейство одного из образов ВМ с нужной версией ОС.
-
-
Создайте ресурсы:
-
В терминале перейдите в директорию с конфигурационным файлом.
-
Проверьте корректность конфигурации с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
-
После создания инфраструктуры авторизуйтесь в ОС Windows.
Авторизуйтесь в ОС 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>Успешная авторизация означает, что данные из секрета были использованы при создании виртуальной машины.
Как удалить созданные ресурсы
Чтобы перестать платить за созданные ресурсы:
-
Откройте конфигурационный файл
yc-secured-password.tfи удалите описание создаваемой инфраструктуры из файла. -
Примените изменения:
-
В терминале перейдите в директорию с конфигурационным файлом.
-
Проверьте корректность конфигурации с помощью команды:
terraform validateЕсли конфигурация является корректной, появится сообщение:
Success! The configuration is valid. -
Выполните команду:
terraform planВ терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply -
Подтвердите изменения: введите в терминале слово
yesи нажмите Enter.
-