97 votes

Comment créer une clé SSH dans terraform?

J'ai besoin de faire tourner un tas de EC2 boîtes pour les différents utilisateurs. Chaque utilisateur doit être en mode bac à sable à partir de tous les autres, de sorte que chaque EC2 boîte a besoin de sa propre clé SSH.

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

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

(Mauvais) Exemples:

Depuis que j'ai besoin de programmation pour générer des clés uniques pour de nombreux utilisateurs, ce n'est pas pratique.

Cela ne semble pas être difficile de cas d'utilisation, mais je ne trouve pas de docs sur elle n'importe où.

À la rigueur, je pourrais générer terraform scripts et de les injecter des clés SSH à la volée à l'aide de bash. Mais c'est exactement le genre de chose qui terraform est censé faire en premier lieu.

161voto

ydaetskcoR Points 19392

Terraform peut générer SSL/SSH clés privées de l'aide de l' tls_private_key des ressources.

Donc si vous voulez générer des clés SSH à la volée, vous pourriez 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 va créer une paire de clés SSH, qui vit dans la Terraform état (il n'est pas écrit sur le disque en fichiers autres que ce qui pourrait être fait pour le transformer le terrain de l'état lui-même lorsque vous ne l'utilisez à distance de l'état), crée une AWS paire de clés basé sur la clé publique, puis crée une Ubuntu 14.04 instance où l' ubuntu utilisateur est accessible avec la clé privée qui a été généré.

Vous auriez alors à extraire la clé privée à partir du fichier d'état et de fournir aux utilisateurs. Vous pouvez utiliser un output de cracher ce droit vers stdout quand Terraform est appliquée.

Les avertissements de sécurité

Je me dois de souligner ici que la transmission des clés privées autour est généralement une mauvaise idée et vous feriez beaucoup mieux de demander aux développeurs de créer leurs propres paires de clés et de vous fournir avec la clé publique que vous (ou eux) peut utiliser pour générer un AWS paire de clés (éventuellement à l'aide de l' aws_key_pair des ressources utilisées dans l'exemple ci-dessus) qui peuvent ensuite être spécifié lors de la création d'instances.

En général, je ne utilisez quelque chose comme ci-dessus façon de générer des clés SSH pour très temporaire dev environnements que vous êtes en contrôle de sorte que vous n'avez pas besoin de passer les clés privées de n'importe qui. Si vous avez besoin de passer des clés privées des gens, vous devez vous assurer que vous faites cela dans un canal sécurisé et que vous vous assurez que le Terraform etat (qui contient la clé privée en texte brut) est également fixé de manière appropriée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X