如何在云信息模板中配置 SSH 主机密钥?

如何在云信息模板中配置 SSH 主机密钥?

我正在尝试使用 cloudformation 模板中的 cloud-init 在启动时使用已知 SSH 主机密钥配置 EC2。但现在我无法通过 SSH 进入服务器。调试起来很棘手 :-)

这是我的模板中的 EC2 片段的用户数据部分:

    "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
      "#cloud-config", "\n",
      "ssh_keys:", "\n",
      "- rsa_private: |", "\n",
      "    -----BEGIN RSA PRIVATE KEY-----", "\n",
      "    MIIEowCBAAKCAQF71D8K9C/+K0a2fO+S9s441kSI44lF5ml++ewD+Mp115x9", "\n",
      "    /XwwTlvqxCIpxdzpzq4xXEqH48StHyYIjAOPxoS1/QG0Ti6OqU893PpukLdmV", "\n",
      "    kLZKn2ph4fTT2aMl...", "\n",
      "    -----END RSA PRIVATE KEY-----", "\n",
      "rsa_public: ssh-rsa AAAAB...", "\n",

根据文档,我也有 (ec)dsa_public/private 的条目。

cloudinit 是否有些奇怪,我还必须指定 ssh_authorized_keys?我假设我的密钥对的公钥现在没有被 Amazon 推送到我的 EC2 上...

答案1

您问题中的 UserData 基本上是一个在实例首次启动时运行的 shell 脚本。请参阅UserData 文档了解更多详细信息。

如果你想配置一组民众键,您可以使用AWS::CloudFormation::Init反而。

在文件部分,声明authorized_keys文件:

"files" : {                                                                                                                                                                                                                                                                               
  "/home/ec2-user/.ssh/authorized_keys" : {                                                                                                                                                                                                                                               
    "content" : { "Fn::Join" : ["", [                                                                                                                                                                                                                                                     
      { "Fn::FindInMap" : [ "Admins", "userx", "sshPublicKey"] }, "\n",                                                                                                                                                                                                                
      { "Fn::FindInMap" : [ "Admins", "usery", "sshPublicKey"] }, "\n"                                                                                                                                                                                                                 
    ]] },                                                                                                                                                                                                                                                                                 
    "mode" : "000600",                                                                                                                                                                                                                                                                    
    "owner" : "ec2-user",                                                                                                                                                                                                                                                                 
    "group" : "ec2-user"                                                                                                                                                                                                                                                                  
  }
  ...

本例中的用户数据来自映射部分cloudformation 模板:

"Admins" : {                                                                                                                                                                                                                                                                          
  "userx" : { "sshPublicKey" : "ssh-rsa AAAABxxxxx...xxxxBSES/H userx" },
  "usery" : { "sshPublicKey" : "ssh-rsa AAAABxxxxx...xxxxKM+aSe usery" }
}

请先使用不同的文件名来测试授权密钥,事实上,当您犯下最轻微的错误时,您就会被锁定在您的实例之外。

答案2

我需要这样做是因为我没有 AWS 中 prod 环境的密钥,无法通过 SSH 进入实例来调试 CFN 部署失败的原因。出于各种原因,包括我正在排除 cfn-init 本身的故障,我发现更好的策略是将以下行添加到 UserData 的顶部并将参数传递tempSSHkey给 CFN:

Properties:
  LaunchTemplateData:
      UserData:
           Fn::Base64: !Sub |
               #!/bin/bash -ex
               sudo echo 'ssh-rsa ${tempSSHkey} temp-ssh-key' >> /home/admin/.ssh/authorized_keys

相关内容