Amazon web services 如何在terraform中解密windows管理员密码?
我正在为在AWS中使用terraform进行测试设置一台windows服务器。每次我需要用PEM文件解密windows密码以连接时。相反,我选择terraform参数并将我的存储在tfstate文件中。现在,我如何用插值语法对其进行解密 请在下面找到我的地形代码Amazon web services 如何在terraform中解密windows管理员密码?,amazon-web-services,syntax,interpolation,terraform,Amazon Web Services,Syntax,Interpolation,Terraform,我正在为在AWS中使用terraform进行测试设置一台windows服务器。每次我需要用PEM文件解密windows密码以连接时。相反,我选择terraform参数并将我的存储在tfstate文件中。现在,我如何用插值语法对其进行解密 请在下面找到我的地形代码 ### Resource for EC2 instance creation ### resource "aws_instance" "ec2" { ami = "${var.ami}"
### 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"
}
密码是使用启动实例时指定的密钥对加密的,您仍然需要使用它来解密,因为
密码\u数据
仍然只是base64编码的加密的密码数据
您应该使用${rsadecrypt(self.password\u数据,文件(“/path/to/private\u key.pem”)}
这是有充分理由的。您真的不希望只有一个base64编码的密码在状态中浮动
简短版本:
您缺少插值函数中的第二个参数。我知道这与实际问题无关,但如果您不想在公共环境(例如.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-解码pwdbase64.txt password.bin
- 运行此命令解密您的password.bin openssl rsautl-decrypt-inkey privatekey.openssh-in password.bin
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCd+qQbLiSVuNludd67EtepR3g1+VzV6gjsZ+Q+RtuLf88cYQA3
6M4rjVAy......1svfaU/powWKk7WWeE58dnnTZoLvHQ
ZUvFlHE/LUHCQkx8sSECQGatJGiS5fgZhvpzLn4amNwKkozZ3tc02fMzu8IgdEit
jrk5Zq8Vg71vH1Z5OU0kjgrR4ZCjG9ngGdaFV7K7ki0=
-----END RSA PRIVATE KEY-----
ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB......iFZmwQ==
公钥应该如下所示:
-----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生成密钥错误:错误刷新状态:发生1个错误:*module.Windows_ec2.output.ec2_密码:rsadecrypt:crypto/rsa:decryption错误在:${rsadecrypt(aws_instance.ec2.password_数据,文件(“C:/terraform/Task1/test.pem”)}我在使用
self.password\u数据时出现以下错误,因此我进行了更改。错误:输出“ec2\u密码”:不能包含自引用self.password\u数据很高兴看到您解决了第一个错误。第二个错误似乎表明解密出了问题。您能否确认C:\terraform\Task1\test.pem
是启动实例时使用的密钥对的私钥?另外,在这一点上,我注意到您使用了正斜杠而不是反斜杠;)不确定这是否重要,但它可能会。只是测试了一下,它似乎起了作用。查看我的要点:。所有这些都是在地形0.11.7上完成的。你能确认你的版本吗?到此为止。它按预期工作,可以在状态文件中看到解密的密码。下面是工作代码:output“ec2_password”{value=“${rsadecrypt(aws_instance.ec2.password_数据,文件(“C:/terraform/Task1/BOI-BOI.pem”))}”
这个问题的标题措辞巧妙。