1. ホーム
  2. amazon-web-services

[解決済み] TerraformでSSHキーを作成するには?

2023-02-20 01:37:48

質問

私は異なるユーザーのためにEC2ボックスの束をスピンアップする必要があります。各ユーザーは他のすべてのユーザーからサンドボックス化されるべきであるので、各EC2ボックスはそれ自身のSSHキーを必要とします。

Terraformでこれを達成する最良の方法は何ですか?

私が見つけたほとんどすべての説明は、手動でSSHキーを作成し、それをテラフォームスクリプトに貼り付けることを求めています。

(悪い)例です。

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

これは難しいユースケースのようには見えませんが、これに関するドキュメントをどこにも見つけることができません。

いざとなれば、Bashを使ってTerraformスクリプトを生成し、その場でSSHキーを注入することは可能です。しかし、それはまさにTerraformが最初に行うことになっていることのように思えます。

どのように解決するのか?

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-focal-20.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 14.04 インスタンスを作成し、そこで ubuntu ユーザがアクセスできる Ubuntu 14.04 インスタンスを生成します。

その後、ステートファイルから秘密鍵を取り出して、それをユーザーに提供する必要があります。そのためには output を使って、Terraformが適用されたときにこれを標準出力に直接吐き出すことができます。

セキュリティ上の注意点

ここで指摘しておきたいのは、秘密鍵を受け渡しするのは一般的に良くないということです。開発者が自分でキーペアを作成し、その公開鍵をあなたに渡して、あなた(あるいは開発者)がAWSのキーペアを生成したほうがずっと良いでしょう(潜在的には aws_key_pair リソース のように)、インスタンスを作成する際に指定することができます。

一般的に、私は上記のような SSH 鍵の生成方法を、秘密鍵を誰にも渡す必要がないように管理している、非常に一時的な開発環境に対してのみ使用します。秘密鍵を人に渡す必要がある場合は、安全なチャネルでこれを行うことを確認し、Terraformの状態(秘密鍵を平文で含む)も適切に保護されていることを確認する必要があります。