Назад | Перейти на главную страницу

Как создать сертификат TLS на основе информации об экземпляре AMI и использовать его для подготовки?

Я пытаюсь создать сертификат TLS для аутентификации сервера в Docker в системе Terraformed. Чтобы создать сертификат сервера TLS, я сделал следующее

resource "tls_private_key" "master-1" {
  algorithm = "RSA"
  rsa_bits  = "2048"
}

resource "tls_cert_request" "master-1" {
  key_algorithm   = "RSA"
  private_key_pem = "${tls_private_key.master-1.private_key_pem}"

  subject {
    common_name = "${aws_instance.master-1.public_dns}"
  }

  dns_names = [
    "${aws_instance.master-1.public_dns}",
    "${aws_instance.master-1.private_dns}",
  ]

  ip_addresses = [
    "${aws_instance.master-1.public_ip}",
    "${aws_instance.master-1.private_ip}",
  ]
}

resource "tls_locally_signed_cert" "master-1" {
  ca_key_algorithm   = "RSA"
  cert_request_pem   = "${tls_cert_request.master-1.cert_request_pem}"
  ca_private_key_pem = "${tls_private_key.devops.private_key_pem}"
  ca_cert_pem        = "${tls_self_signed_cert.devops.cert_pem}"

  validity_period_hours = 8760

  allowed_uses = [
    "server_auth",
    "digital_signature",
    "key_encipherment",
  ]
}

в resource "tls_cert_request" "master-1" раздел я добавил ссылки на master-1 aws_instance

В данном случае у меня есть следующий провайдер, который использует значения из подписанного сертификата

  provisioner "remote-exec" {
    inline = [
      "echo ${tls_self_signed_cert.devops.cert_pem} > /tmp/ca.pem",
      "echo ${tls_locally_signed_cert.master-1.cert_pem} > /tmp/cert.pem",
      "echo ${tls_private_key.master-1.private_key_pem} > /tmp/key.pem",
    ]
  }

Я знаю, что технически это цикл, и когда я terraform plam это ошибка с

Error: Error asking for user input: 1 error(s) occurred:

* Cycle: aws_instance.master-1, tls_cert_request.master-1, tls_locally_signed_cert.master-1

Поэтому я хотел спросить, есть ли способ избежать этого, кроме использования openssl и создания TLS в сценарии обеспечения?

Это то, что я сделал для своей среды Vagrant, которую собираюсь перенести на терраформирование.

mkdir -p /var/lib/docker
openssl genrsa -out /var/lib/docker/key.pem 4096 2> /dev/null
openssl req -subj "/CN=$(hostname)" -sha256 -new -key /var/lib/docker/key.pem -out /tmp/server.csr
echo subjectAltName = DNS:$(hostname),IP:$(hostname -I | awk '{print $1}'),IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> /tmp/extfile.cnf
openssl x509 -req -days 365 -sha256 -in /tmp/server.csr -CA /vagrant/ca/ca.pem -CAkey /vagrant/ca/ca-key.pem -CAcreateserial -out /var/lib/docker/cert.pem -extfile extfile.cnf -passin file:/vagrant/ca/passphrase
rm /tmp/server.csr /tmp/extfile.cnf

Использовать null_resource для развертывания сертификатов вместо этого в AWS_instance.

resource "null_resource" "master" {
    connection {
        type    = "ssh"
        host    = "${aws_instance.master-1.0.public_ip}"
        user    = "fedora"
        timeout = "15m"
    }

    provisioner "remote-exec" {
        inline = [
        "echo ${tls_self_signed_cert.devops.cert_pem} > /tmp/ca.pem",
        "echo ${tls_locally_signed_cert.master-1.cert_pem} > /tmp/cert.pem",
        "echo ${tls_private_key.master-1.private_key_pem} > /tmp/key.pem",
        ]
    }
}