Как создать ключ SSH в terraform?

Мне нужно раскрутить кучу коробок EC2 для разных пользователей. Каждый пользователь должен быть изолирован от всех остальных, поэтому каждый ящик EC2 должен иметь свой собственный ключ SSH.

Какой лучший способ сделать это в терраформе?

Почти все инструкции, которые я нашел, требуют, чтобы я вручную создал ключ SSH и вставил его в скрипт terraform.

(Плохо) Примеры:

Поскольку мне нужно программно генерировать уникальные ключи для многих пользователей, это нецелесообразно.

Это не похоже на сложный вариант использования, но я нигде не могу найти документы по нему.

В крайнем случае, я мог генерировать скрипты terraform и вводить ключи SSH на лету, используя bash. Но это похоже на то, что терраформ должен делать в первую очередь.

Ответ 1

Terraform может генерировать закрытые ключи SSL/SSH, используя ресурс tls_private_key.

Поэтому, если вы хотите генерировать ключи SSH на лету, вы можете сделать что-то вроде этого:

variable "key_name" {}

resource "tls_private_key" "example" {
  algorithm = "RSA"
  rsa_bits  = 4096
}

resource "aws_key_pair" "generated_key" {
  key_name   = "${var.key_name}"
  public_key = "${tls_private_key.example.public_key_openssh}"
}

data "aws_ami" "ubuntu" {
  most_recent = true

  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
  }

  filter {
    name   = "virtualization-type"
    values = ["hvm"]
  }

  owners = ["099720109477"] # Canonical
}

resource "aws_instance" "web" {
  ami           = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"
  key_name      = "${aws_key_pair.generated_key.key_name}"

  tags {
    Name = "HelloWorld"
  }
}

Это создаст пару ключей SSH, которая живет в состоянии Terraform (она не записывается на диск в файлах, отличных от того, что может быть сделано для самого состояния Terraform, когда не используется удаленное состояние), создает пару ключей AWS на основе открытого ключа а затем создает экземпляр Ubuntu 14.04, где пользователь ubuntu доступен с помощью сгенерированного закрытого ключа.

Затем вам придется извлечь закрытый ключ из файла состояния и предоставить его пользователям. Вы можете использовать output чтобы выплюнуть это прямо в stdout при применении Terraform.

Предостережения о безопасности

Я должен отметить, что передача закрытых ключей, как правило, плохая идея, и вам было бы гораздо лучше, если бы разработчики создавали свои собственные пары ключей и предоставляли вам открытый ключ, который вы (или они) можете использовать для генерации пары ключей AWS. (возможно, с использованием ресурса aws_key_pair который используется в приведенном выше примере), который затем можно указать при создании экземпляров.

В общем, я бы использовал что-то подобное описанному выше способу генерации ключей SSH для очень временных сред разработки, которыми вы управляете, поэтому вам не нужно никому передавать личные ключи. Если вам нужно передать личные ключи людям, вам необходимо убедиться, что вы делаете это по защищенному каналу и убедитесь, что состояние Terraform (которое содержит закрытый ключ в виде простого текста) также защищено надлежащим образом.