web-dev-qa-db-ja.com

TerraformでSSHキーを作成するにはどうすればよいですか?

さまざまなユーザー向けにEC2ボックスをたくさん用意する必要があります。各ユーザーは他のすべてのユーザーからサンドボックス化される必要があるため、各EC2ボックスには独自のSSHキーが必要です。

テラフォームでこれを達成する最良の方法は何ですか?

私が見つけたほとんどすべての指示では、SSHキーを手動で作成し、テラフォームスクリプトに貼り付けてほしいと思っています。

(悪い)例:

多くのユーザーに対して一意のキーをプログラムで生成する必要があるため、これは実用的ではありません。

これは難しいユースケースのようには見えませんが、どこにもドキュメントが見つかりません。

ピンチで、テラフォームスクリプトを生成し、bashを使用してその場でSSHキーを注入できました。しかし、そもそもテラフォームがやるべきことのように思えます。

24
Abe

Terraformは、 tls_private_key resource を使用してSSL/SSH秘密鍵を生成できます。

そのため、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"
  }
}

これにより、Terraform状態で存続するSSHキーペアが作成され(リモート状態を使用しない場合にTerraform状態自体に対して行われる可能性のあるファイル以外のファイルでディスクに書き込まれません)、公開キーに基づいてAWSキーペアが作成されますそして、ubuntuユーザーが生成された秘密鍵でアクセスできるUbuntu 14.04インスタンスを作成します。

次に、状態ファイルから秘密鍵を抽出し、ユーザーに提供する必要があります。 output を使用して、Terraformが適用されたときにこれを標準出力に直接吐き出すことができます。

セキュリティ上の注意

ここで、秘密キーを渡すことは一般的に悪い考えであり、開発者に独自のキーペアを作成させ、AWSキーペアを生成するために使用できる公開キーを提供することをお勧めします。 (潜在的に上記の例で使用されているように aws_key_pairリソース を使用)、インスタンスの作成時に指定できます。

一般的に、私はあなたが制御している非常に一時的な開発環境のためにSSHキーを生成する上記の方法のようなものを使用するだけなので、誰にも秘密キーを渡す必要はありません。秘密鍵を人々に渡す必要がある場合は、安全なチャネルでこれを行い、Terraform状態(プレーンテキストの秘密鍵を含む)も適切に保護されていることを確認する必要があります。

50
ydaetskcoR