如何在 cloudformation 模板中配置 SSH 主机密钥?

Dav*_*ave 1 ssh ssh-keys amazon-web-services cloud-init

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

这是我的模板中 EC2 片段的 userdata 部分:

    "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",
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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

如果你想配置一组公共密钥,您可以使用AWS :: CloudFormation ::初始化代替。

在文件部分,声明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"                                                                                                                                                                                                                                                                  
  }
  ...
Run Code Online (Sandbox Code Playgroud)

本示例中的用户数据来自cloudformation 模板的Mappings 部分

"Admins" : {                                                                                                                                                                                                                                                                          
  "userx" : { "sshPublicKey" : "ssh-rsa AAAABxxxxx...xxxxBSES/H userx" },
  "usery" : { "sshPublicKey" : "ssh-rsa AAAABxxxxx...xxxxKM+aSe usery" }
}
Run Code Online (Sandbox Code Playgroud)

请首先使用不同的文件名而不是authorized_keys来测试它,因为当您犯最轻微的错误时,您确实会被锁定在您的实例之外。