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

如何在AWS Secrets Manager自定义Lambda轮换函数中生成SSH私钥

解决方案

可直接使用Ruby内置的OpenSSL库生成SSH密钥对,AWS Lambda的Ruby运行时默认预装了该依赖,无需额外部署自定义层。

修改后的create_secret方法示例

首先在代码头部引入依赖:

require 'openssl'
# 若需要生成ED25519类型密钥可额外引入net/ssh库,Lambda Ruby运行时默认预装
# require 'net/ssh'

替换create_secret方法中注释处的逻辑:

def create_secret(client, arn, token)
  client.get_secret_value(secret_id: arn, version_stage: "AWSCURRENT")
  
  begin
    client.get_secret_value(secret_id: arn, version_id: token, version_stage: "AWSPENDING")
    puts "createSecret: Successfully retrieved secret for %s." % arn
  rescue
    puts "Not found secret with label AWSPENDING"

    # 生成2048位RSA SSH密钥对,可按需调整密钥长度或更换密钥类型
    rsa_key = OpenSSL::PKey::RSA.new(2048)
    # 导出PEM格式私钥
    private_key = rsa_key.to_pem
    # 导出SSH格式公钥,适配authorized_keys格式规范
    public_key = "#{rsa_key.ssh_type} #{[rsa_key.to_blob].pack('m0')} lambda-rotated-ssh-key@aws"

    # 组装密钥对结构,可根据业务需要增减字段
    new_secret_value = {
      "private_key": private_key,
      "public_key": public_key,
      "key_type": "RSA-2048",
      "rotate_time": Time.now.utc.iso8601
    }

    # 将新密钥存储为AWSPENDING版本
    client.put_secret_value(
      secret_id: arn,
      client_request_token: token,
      secret_string: JSON.generate(new_secret_value),
      version_stages: ["AWSPENDING"]
    )
    puts "createSecret: Successfully generated new SSH key pair for %s." % arn
  end
end

配套注意事项

  • 若需要更高安全性的密钥类型,可替换为OpenSSL::PKey::EC.new('prime256v1')生成ECDSA密钥,或使用Net::SSH::KeyFactory.generate('ed25519')生成ED25519密钥,需提前确认目标Linux实例的SSH服务支持对应密钥类型
  • 后续setSecret环节需通过AWS SSM Run Command或旧密钥登录的方式,将新生成的公钥写入目标实例对应用户的~/.ssh/authorized_keys文件,同时清理过期公钥避免遗留风险
  • testSecret环节需验证新私钥可正常登录目标实例,验证通过后再执行finishSecret将AWSPENDING版本切换为AWSCURRENT
  • 建议配置Secret的资源策略禁止不必要的IAM身份读取私钥内容,最小化权限风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:24:05