【问题标题】:Enable SSH with a password instead of pem key使用密码而不是 pem 密钥启用 SSH
【发布时间】:2018-05-01 05:44:30
【问题描述】:

我正在使用 cloudformation 启动一个 EC2 实例。我想为该实例使用密码而不是 pem 密钥启用 SSH。我可以编写启动脚本(用户数据)来执行此操作,但我为用户“学生”设置了静态密码“pass123”。我想让这个动态(随机)。 除了 SSH 客户端证书身份验证之外,我们真的会对任何事情感到满意。

这是我的 cloudformation 模板:

{
   "AWSTemplateFormatVersion":"2010-09-09",
   "Description":"Password for instance",
   "Parameters":{
      "KeyName":{
         "Description":"Name of an existing EC2 KeyPair",
         "Type":"String"
      },
      "AWSAmiId":{
         "Description":"AMI Id to find",
         "Type":"String",
         "Default":"x86_64,amzn-ami-pv-2014.09.1.x86_64-ebs,amazon,ebs,paravirtual"
      }
   },
   "Resources":{
      "Ec2Instance":{
         "Type":"AWS::EC2::Instance",
         "DependsOn":"Ec2SecurityGroup",
         "Properties":{
            "ImageId":{
               "Ref":"AWSAmiId"
            },
            "InstanceType":"t1.micro",
            "Tags":[
               {
                  "Key":"Name",
                  "Value":"MYINSTANCE"
               }
            ],
            "DisableApiTermination":"true",
            "SecurityGroupIds":[
               {
                  "Ref":"Ec2SecurityGroup"
               }
            ],
            "KeyName":{
               "Ref":"KeyName"
            },
            "UserData":{
               "Fn::Base64":{
                  "Fn::Join":[
                     "\n",
                     [
                        "#!",
                        "useradd student\n",
                        "echo pass123 | passwd student --stdin\n",
                        "echo \"student ALL=(ALL) NOPASSWD: ALL\" | tee -a /etc/sudoers\n",
                        "mkdir /home/student/.ssh\n",
                        "cp cp ~ec2-user/.ssh/authorized_keys ~student/.ssh/authorized_keys\n",
                        "sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config\n",
                        "service sshd reload\n"
                     ]
                  ]
               }
            }
         }
      },
      "Ec2SecurityGroup":{
         "Type":"AWS::EC2::SecurityGroup",
         "Properties":{
            "GroupDescription":"VPC Security Group",
            "SecurityGroupIngress":[
               {
                  "CidrIp":"0.0.0.0/0",
                  "FromPort":"22",
                  "IpProtocol":"tcp",
                  "ToPort":"22"
               }
            ]
         }
      }
   },
   "Outputs":{
      "Password":{
         "Description":"newly created EC2 instance",
         "Value":"pass123"
      }
   }
}

密码可以是:

  • SSH 密钥的文件名

  • AMZN 账户 ID(例如:45678923)

  • 随机字符串 (poiblkjfda)

【问题讨论】:

  • 问题出在哪里?
  • 我想为这个密码分配任何随机字符串,而不是硬编码'pass123'
  • 只需在控制台的用户数据中使用不同的密码。或者,如果您从脚本触发启动,请让脚本选择密码。您的问题是如何生成随机字符串,或者如何将其包含在用户数据中?
  • @JohnRotenstein,我在找 1.如何生成随机字符串? 2、如何在栈输出中显示(包括在云形成的输出部分)?

标签: amazon-web-services amazon-ec2 ssh amazon-cloudformation ec2-ami


【解决方案1】:

如果您的要求是生成一个随机字符串作为密码,您可以使用 /dev/urandom。对于 10 个字符的字符串

head /dev/urandom | tr -dc A-Za-z0-9 | head -c 10 ; echo ''

您可以将其包含在您的用户数据中,而不是静态密码。

【讨论】:

  • 谢谢!但我的下一个问题是“如何在堆栈输出中显示(包括在云形成的输出部分中)?”
  • PM我问题链接,我去看看。同时,如果答案正确,则标记为已接受答案
【解决方案2】:

返回随机密码有多种选择:

  • 您可以在调用 CloudFormation 之前生成它。也就是说,任何触发器 CloudFormation 都可以生成密码,并将其作为参数传递给堆栈。然后,您可以将参数显示为输出。
  • 您可以将值作为CloudFormation WaitCondition 的一部分返回,然后将结果显示为输出。
  • 您可以在AWS Lambda-backed Custom Resources 中生成密码,然后可以将其插入到用户数据中并作为输出提供。
  • 您可以配置用户数据以将密码存储在AWS Secrets Manager 中,这比将其显示为堆栈输出更安全。然后用户将自己检索密码。

只有第一个很简单。其余的涉及一些配置/编码。

【讨论】:

  • 是否有任何示例 sn-p 可以做到这一点?因为,我尝试定义 Parameter 但没有运气。可能是我尝试错误:(
  • 您也许可以通过网络搜索找到一些东西,但您的需求对于您的用例来说是相当独特的。尝试自己编码。如果您遇到问题,您可以随时发布另一个问题,显示您的代码和您遇到的问题。
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2016-01-26
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
相关资源
最近更新 更多