You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Terraform中创建SSH密钥?多用户EC2实例专属密钥配置方案

在Terraform中创建专属SSH密钥并实现多用户EC2沙箱

嘿,我来帮你搞定这个问题!针对你需要给每个用户的EC2实例配专属SSH密钥、实现独立沙箱的需求,这里有两个实用方案,其中自动生成的方案更适合批量场景:

方案1:Terraform自动生成专属SSH密钥对(推荐)

这个方案完全不需要手动创建密钥,Terraform会为每个用户自动生成RSA密钥对,然后直接导入AWS作为密钥对,再绑定到对应的EC2实例上。完美适配批量创建的需求。

完整代码示例

# 定义需要创建沙箱的用户列表,你可以根据实际需求修改
variable "users" {
  type    = list(string)
  default = ["alice", "bob", "charlie"]
}

# 为每个用户生成SSH私钥和公钥
resource "tls_private_key" "user_ssh_keys" {
  for_each   = toset(var.users)
  algorithm  = "RSA"
  rsa_bits   = 2048 # 密钥长度,2048是安全且通用的选择
}

# 将生成的公钥导入AWS,创建专属密钥对
resource "aws_key_pair" "user_key_pairs" {
  for_each   = toset(var.users)
  key_name   = "${each.key}_sandbox_ssh_key" # 用用户名做前缀,方便识别
  public_key = tls_private_key.user_ssh_keys[each.key].public_key_openssh
}

# 为每个用户创建独立的EC2沙箱实例,绑定专属密钥对
resource "aws_instance" "user_sandboxes" {
  for_each               = toset(var.users)
  ami                    = "ami-0c55b159cbfafe1f0" # 替换成你所在区域的合适AMI(比如Amazon Linux 2)
  instance_type          = "t2.micro" # 根据需求选择实例类型
  key_name               = aws_key_pair.user_key_pairs[each.key].key_name
  
  # 可选:为每个实例配置独立安全组,进一步强化沙箱隔离
  vpc_security_group_ids = [aws_security_group.user_sandbox_sg[each.key].id]
}

# 为每个用户创建专属安全组,只开放SSH访问(可根据需求调整规则)
resource "aws_security_group" "user_sandbox_sg" {
  for_each = toset(var.users)
  name     = "${each.key}_sandbox_sg"
  
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"] # 建议替换成公司办公IP段或者用户个人IP,提升安全性
  }
  
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

# 输出每个用户的私钥(标记为敏感信息,避免明文泄露)
output "user_private_keys" {
  type      = map(string)
  value     = { for user in var.users : user => tls_private_key.user_ssh_keys[user].private_key_pem }
  sensitive = true # 这个标记很重要,Terraform不会在控制台明文显示私钥
}

如何获取私钥

执行terraform apply后,你可以通过以下命令获取加密后的私钥输出,然后保存到安全的地方(比如密码管理器):

terraform output -json user_private_keys

方案2:手动创建密钥后批量导入(适合已有密钥的场景)

如果已经为用户手动生成了SSH密钥对,你可以把每个用户的公钥保存为单独的文件(比如alice_id_rsa.pub),然后用Terraform批量导入到AWS:

variable "users" {
  type    = list(string)
  default = ["alice", "bob"]
}

# 批量导入用户的公钥到AWS
resource "aws_key_pair" "user_key_pairs" {
  for_each   = toset(var.users)
  key_name   = "${each.key}_sandbox_ssh_key"
  public_key = file("${each.key}_id_rsa.pub") # 读取本地公钥文件
}

# 绑定密钥到EC2实例,和方案1的实例创建逻辑一致
resource "aws_instance" "user_sandboxes" {
  for_each               = toset(var.users)
  ami                    = "ami-0c55b159cbfafe1f0"
  instance_type          = "t2.micro"
  key_name               = aws_key_pair.user_key_pairs[each.key].key_name
}

关键注意事项

  • 私钥安全:无论是自动生成还是手动创建的私钥,都要妥善保管,绝对不能泄露给无关人员。方案1中标记sensitive = true可以避免Terraform在控制台明文输出私钥。
  • 沙箱隔离:除了专属SSH密钥,建议给每个用户的实例配置独立的安全组、子网(如果在VPC中),限制实例之间的网络访问,真正实现沙箱隔离。
  • 密钥命名规范:用用户名作为密钥名称的一部分,方便后续管理和排查问题。

内容的提问来源于stack exchange,提问作者Abe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:34:12