Как расшифровать пароль администратора Windows в Terraform?

Я предоставляю один сервер Windows для тестирования с помощью terraform в AWS. Каждый раз, когда мне нужно расшифровать мой пароль Windows с моим файлом PEM для подключения. Вместо этого я выбрал аргумент terraform get_password_data и сохранил мой password_data в файле tfstate. Теперь, как мне расшифровать то же самое с синтаксисом интерполяции rsadecrypt

Пожалуйста, найдите мой ниже код Terraform

### Resource for EC2 instance creation ###

resource "aws_instance" "ec2" {
  ami                   =   "${var.ami}"
  instance_type         =   "${var.instance_type}"
  key_name              =   "${var.key_name}"
  subnet_id             =   "${var.subnet_id}"
  security_groups       =  ["${var.security_groups}"]
  availability_zone     =   "${var.availability_zone}"
  private_ip            =   "x.x.x.x"
  get_password_data     =   "true"

  connection {
    password            =   "${rsadecrypt(self.password_data)}"
    }

  root_block_device {
              volume_type = "${var.volume_type}"
              volume_size = "${var.volume_size}"
    delete_on_termination = "true"
    }

  tags {
        "Cost Center"  =  "R1"
        "Name"         =  "AD-test"
        "Purpose"      =  "Task"
        "Server Name"  =  "Active Directory"
        "SME Name"     =  "Ravi"
    }

}


output "instance_id" {
  value = "${aws_instance.ec2.id}"
}


### Resource for EBS volume creation ###

  resource "aws_ebs_volume" "additional_vol" {
    availability_zone =  "${var.availability_zone}"
    size              =  "${var.size}"
    type              =  "${var.type}"
}

### Output of Volume ID ###

  output "vol_id" {
    value = "${aws_ebs_volume.additional_vol.id}"
}

### Resource for Volume attachment ###

   resource "aws_volume_attachment" "attach_vol" {
     device_name       = "${var.device_name}"
     volume_id         = "${aws_ebs_volume.additional_vol.id}"
     instance_id       = "${aws_instance.ec2.id}"
     skip_destroy      = "true"
}

3 ответа

Решение

Пароль зашифрован с помощью пары ключей, которую вы указали при запуске экземпляра, вам все равно нужно использовать его для расшифровки как password_data по-прежнему только закодированные в base64 зашифрованные данные пароля.

Вы должны использовать ${rsadecrypt(self.password_data,file("/path/to/private_key.pem"))}

Это не зря. Вы действительно не хотите, чтобы пароль в кодировке base64 плавал в состоянии.

Краткая версия: вам не хватает второго аргумента в функции интерполяции.

Вместо того, чтобы хранить файлы .pem или явно вводить открытый ключ, вы можете сгенерировать ключ напрямую с помощью tls_private_keyа затем напрямую скопируйте полученный пароль в хранилище параметров AWS SSM, чтобы вы могли получить его оттуда после того, как ваша инфраструктура будет запущена.

Вот как я генерирую ключ:

      resource "tls_private_key" "instance_key" {
  algorithm = "RSA"
}

resource "aws_key_pair" "instance_key_pair" {
  key_name   = "${local.name_prefix}-instance-key"
  public_key = tls_private_key.instance_key.public_key_openssh
}

В твоей aws_instanceвы хотите быть уверены, что они установлены:

        key_name                = aws_key_pair.instance_key_pair.key_name
  get_password_data       = true

Наконец, сохраните полученный пароль в SSM (ПРИМЕЧАНИЕ: вам нужно обернуть закрытый ключ nonsensitive):

      resource "aws_ssm_parameter" "windows_ec2" {
  depends_on = [aws_instance.winserver_instance[0]]
  name       = "/Microsoft/AD/${var.environment}/ec2-win-password"
  type       = "SecureString"
  value = rsadecrypt(aws_instance.winserver_instance[0].password_data, nonsensitive(tls_private_key.instance_key
  .private_key_pem))
}

Я знаю, что это не связано с фактическим вопросом, но это может быть полезно, если вы не хотите раскрывать свой закрытый ключ в общедоступной среде (например, Git)

Я бы лучше распечатал зашифрованный пароль

resource "aws_instance" "ec2" {
    ami = .....
    instance_type = .....
    security_groups = [.....]
    subnet_id = .....
    iam_instance_profile = .....
    key_name = .....
    get_password_data = "true"
    tags = {
        Name = .....
    }
}

Как это

output "Administrator_Password" {
   value = [
     aws_instance.ec2.password_data
   ]
 }

Потом,

  • Получите пароль base64 и поместите его в файл pwdbase64.txt

  • Запустите эту команду, чтобы декодировать base64 в файл bin

    certutil -decode pwdbase64.txt пароль.bin

  • Запустите эту команду, чтобы расшифровать свой пароль. Bin

    openssl rsautl -decrypt -inkey privatekey.openssh -in password.bin

Если вы не знаете, как играть с openssl. Пожалуйста, проверьте этот пост

privatekey.openssh должен выглядеть так:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCd+qQbLiSVuNludd67EtepR3g1+VzV6gjsZ+Q+RtuLf88cYQA3
6M4rjVAy......1svfaU/powWKk7WWeE58dnnTZoLvHQ
ZUvFlHE/LUHCQkx8sSECQGatJGiS5fgZhvpzLn4amNwKkozZ3tc02fMzu8IgdEit
jrk5Zq8Vg71vH1Z5OU0kjgrR4ZCjG9ngGdaFV7K7ki0=
-----END RSA PRIVATE KEY-----

открытый ключ должен выглядеть так:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB......iFZmwQ==

Код пары ключей terraform должен выглядеть так

resource "aws_key_pair" "key_pair_ec2" {
   key_name = "key_pair_ec2"
   public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB......iFZmwQ=="
}

Pd: вы можете использовать puttygen для генерации ключей

Другие вопросы по тегам