【问题标题】:How to decrypt windows administrator password in terraform?如何在 terraform 中解密 Windows 管理员密码?
【发布时间】:2018-12-08 05:14:22
【问题描述】:

我正在预置一个 Windows 服务器,用于在 AWS 中使用 terraform 进行测试。每次我需要用我的 PEM 文件解密我的 Windows 密码以进行连接时。相反,我选择了 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"
}

【问题讨论】:

  • 问题标题措辞优美。

标签: amazon-web-services syntax interpolation terraform


【解决方案1】:

密码使用您在启动实例时指定的key_pair加密,您仍然需要使用它来解密,因为password_data仍然只是base64编码的加密密码数据。

你应该使用${rsadecrypt(self.password_data,file("/path/to/private_key.pem"))}

这是有充分理由的。你真的不希望只是一个 base64 编码的密码在状态中浮动。

短版: 您缺少插值函数中的第二个参数。

【讨论】:

  • 错误:刷新状态错误:发生 1 个错误:* module.Windows_ec2.output.ec2_password:rsadecrypt:crypto/rsa:解密错误:${rsadecrypt(aws_instance.ec2.password_data,文件("C:/terraform/Task1/test.pem"))}
  • 我在使用self.password_data 时遇到以下错误,所以我进行了更改。错误:输出“ec2_password”:不能包含自引用 self.password_data
  • 很高兴看到您解决了第一个错误。第二个错误似乎表明解密出了问题。您能否确认C:\terraform\Task1\test.pem 是启动实例时使用的密钥对的私钥?另外,在那张纸条上,我注意到您使用正斜杠而不是反斜杠;)不确定这是否重要,但可能。
  • 刚刚对此进行了测试,它似乎可以工作。查看我的要点:gist.github.com/mootpt/1ea7aac43e90d27ab890d45bc3b1d3d5。所有这些都是在 Terraform 0.11.7 上完成的。你能确认你的版本吗?
  • 这就结束了。它按预期工作,并且可以在状态文件中看到解密的密码。 下面是工作代码: output "ec2_password" { value = "${rsadecrypt(aws_instance.ec2.password_data, file("C:/terraform/Task1/BOI-BOI.pem"))}"
【解决方案2】:

我知道这与实际问题无关,但如果您不想在公共环境(例如 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 password.bin

  • 运行这个命令来解密你的密码.bin

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

如果您不知道如何使用 openssl。请查看this发帖

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 来生成密钥

【讨论】:

    猜你喜欢
    • 2020-05-14
    • 2019-06-17
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 2017-01-21
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多