web-dev-qa-db-fra.com

Comment créer une clé SSH dans terraform?

Je dois créer plusieurs boîtes EC2 pour différents utilisateurs. Chaque utilisateur doit être mis en bac à sable parmi tous les autres, de sorte que chaque boîte EC2 a besoin de sa propre clé SSH.

Quelle est la meilleure façon d'accomplir cela dans terraform?

Presque toutes les instructions que j'ai trouvées me demandent de créer manuellement une clé SSH et de la coller dans un script terraform.

Exemples (mauvais):

Comme je dois générer par programme des clés uniques pour de nombreux utilisateurs, cela n’est pas pratique.

Cela ne semble pas être un cas d'utilisation difficile, mais je ne trouve aucun document là-dessus.

À la limite, je pouvais générer des scripts terraform et injecter des clés SSH à la volée en utilisant bash. Mais cela semble être exactement le genre de chose que terraform est censée faire en premier lieu.

24
Abe

Terraform peut générer des clés privées SSL/SSH en utilisant le tls_private_key ressource .

Donc, si vous voulez générer des clés SSH à la volée, vous pouvez faire quelque chose comme ceci:

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"
  }
}

Cela créera une paire de clés SSH qui vit dans l'état Terraform (il n'est pas écrit sur le disque dans des fichiers autres que ce qui pourrait être fait pour l'état Terraform lui-même lorsque vous n'utilisez pas l'état distant), crée une paire de clés AWS basée sur la clé publique. puis crée une instance Ubuntu 14.04 où l'utilisateur ubuntu est accessible avec la clé privée générée.

Vous devrez ensuite extraire la clé privée du fichier d'état et la fournir aux utilisateurs. Vous pouvez utiliser un output pour le cracher directement sur la sortie standard lorsque Terraform est appliqué.

Mises en garde de sécurité

Il convient de souligner ici que la transmission de clés privées est généralement une mauvaise idée et qu'il serait bien préférable que les développeurs créent leurs propres paires de clés et vous fournissent la clé publique que vous (ou eux) pouvez utiliser pour générer une paire de clés AWS. (utilisant potentiellement le aws_key_pair ressource (utilisé dans l'exemple ci-dessus) pouvant être spécifié lors de la création d'instances.

En général, je n’utiliserais que la méthode ci-dessus pour générer des clés SSH pour des environnements de développement très temporaires que vous contrôlez, de sorte que vous n’avez pas besoin de passer des clés privées à qui que ce soit. Si vous devez transmettre des clés privées à des personnes, vous devez vous assurer de le faire dans un canal sécurisé et que vous vous assurez que l'état de Terraform (qui contient la clé privée en texte brut) est également sécurisé de manière appropriée.

50
ydaetskcoR