如何在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
相关产品推荐
相关产品推荐

