将密钥对添加到现有的EC2实例

我有权使用AWS控制台访问具有2个运行的帐户,但无法closures(在生产中)。 我想要获得这些实例的SSH访问权限,是否有可能创build一个新的密钥对,并将其应用于实例,以便我可以SSH? 获取密钥对的现有pem文件的情况下创build实例目前不是一个选项。

如果这是不可能的,有没有其他方法可以进入实例?

您不能将密钥对应用到正在运行的实例。 您只能使用新的密钥对来启动一个新的实例。

对于恢复,如果它是一个EBS启动AMI,您可以停止它,做一个卷的快照。 基于它创build一个新的卷。 并能够使用它来启动旧的实例,创build一个新的图像,或恢复数据。

尽pipe短暂存储的数据将会丢失。


由于这个问题和答案的受欢迎程度,我想要在Rodney发表的评论中的链接中捕获这些信息。

有关此信息 ,请访问Eric Hammond 。

修复EC2实例的根EBS卷上的文件

您可以检查和编辑EC2实例上的根EBS卷上的文件,即使您处于您认为是灾难性的情况,如:

  • 您丢失了ssh密钥或忘记了密码
  • 你在编辑/ etc / sudoers文件时犯了一个错误,并且不能再通过sudo获得root权限来修复它
  • 您的长时间运行的实例由于某种原因挂起,无法联系,并且无法正常引导
  • 您需要从实例中恢复文件,但无法访问它

在桌面上的物理计算机上,您可以简单地使用CD或U盘启动系统,安装硬盘驱动器,检查并修复文件,然后重新启动计算机以恢复业务。

但是,远程EC2实例在您处于这些情况之一时似乎很遥远,无法访问。 幸运的是,AWS为我们提供了恢复系统的能力和灵活性,只要我们运行EBS启动实例而不是实例存储。

EC2上的方法有点类似于物理解决scheme,但是我们将移动并将错误的“硬盘驱动器”(根EBS卷)安装到不同的实例,然后修复它,然后将其移回。

在某些情况下,启动一个新的EC2实例并抛弃坏的EC2实例可能会更简单,但是如果您确实想要修复文件,以下是适用于许多方法的方法:

build立

使用您要查看和编辑的文件标识包含已损坏的根EBS卷的原始实例(A)和卷。

 instance_a=i-XXXXXXXX volume=$(ec2-describe-instances $instance_a | egrep '^BLOCKDEVICE./dev/sda1' | cut -f3) 

确定您将用于修复原始EBS卷上的文件的第二个EC2实例(B)。 此实例必须与实例A在相同的可用区中运行,以便可以将EBS卷连接到它。 如果您没有运行实例,请启动一个临时实例。

 instance_b=i-YYYYYYYY 

停止被破坏的实例A(等待它完全停止),从实例中分离根EBS卷(等待它被分离),然后将卷连接到未使用的设备上的实例B.

 ec2-stop-instances $instance_a ec2-detach-volume $volume ec2-attach-volume --instance $instance_b --device /dev/sdj $volume 

ssh到实例B并挂载该卷,以便可以访问其文件系统。

 ssh ...instance b... sudo mkdir -p 000 /vol-a sudo mount /dev/sdj /vol-a 

修理它

此时,来自实例A的整个根文件系统可用于在实例B上的/ vol-a下查看和编辑。例如,您可能希望:

  • 把正确的SSH密钥放在/vol-a/home/ubuntu/.ssh/authorized_keys
  • 编辑并修复/ vol-a / etc / sudoers
  • 在/ vol-a / var / log / syslog中查找错误消息
  • 将重要文件复制到/ vol-a / …

注意:两个实例上的uid可能不完全相同,因此请小心创build,编辑或复制属于非root用户的文件。 例如,实例A上的mysql用户可能与实例B上的postfix用户具有相同的UID,如果使用一个名称对文件进行chown,然后将该卷移回到A,则可能会导致问题。

包起来

完成之后,您对/ vol-a下的文件感到满意,请卸载文件系统(仍在实例B上):

 sudo umount /vol-a sudo rmdir /vol-a 

现在,使用ec2-api-tools返回到您的系统,继续将EBS卷移回原始实例A的原始位置,然后再次启动实例:

 ec2-detach-volume $volume ec2-attach-volume --instance $instance_a --device /dev/sda1 $volume ec2-start-instances $instance_a 

希望你解决了这个问题,实例A出现的很好,你可以完成你最初设定的任务。 如果没有,你可能需要继续重复这些步骤,直到你有它的工作。

注意:如果在停止实例A时为实例A分配了弹性IP地址,则需要在重新启动后重新关联它。

记得! 如果您的实例B只是为了这个过程而暂时启动,那么不要忘记现在终止它。

虽然您不能直接将密钥对添加到正在运行的EC2实例中,但您可以创build一个Linux用户并为其创build一个新的密钥对,然后像使用原始用户的密钥对那样使用它。

在你的情况下,你可以要求实例所有者(谁创build它)执行以下操作。 因此,实例所有者不必与你分享他自己的密钥,但是你仍然可以ssh进入这些实例。 这些步骤最初由Utkarsh Sengar(aka。 @zengr )发布, url为http://utkarshsengar.com/2011/01/manage-multiple-accounts-on-1-amazon-ec2-instance/ 。 我只做了一些小的改变。

  1. 第一步:默认login“ubuntu”用户

     $ ssh -i my_orig_key.pem ubuntu@111.111.11.111 
  2. 第2步:创build一个新用户,我们将调用我们的新用户“john”

     [ubuntu@ip-11-111-111-111 ~]$ sudo adduser john 

    通过以下方式设置“john”的密码:

     [ubuntu@ip-11-111-111-111 ~]$ sudo su - [root@ip-11-111-111-111 ubuntu]$ passwd john 

    通过以下方式将“john”添加到sudoer的列表中:

     [root@ip-11-111-111-111 ubuntu]$ visudo 

    ..并将以下内容添加到文件的末尾:

     john ALL = (ALL) ALL 

    好的! 我们有我们的新用户创build,现在你需要生成密钥文件,这将需要login,就像我们在步骤1 my_orin_key.pem。

    现在,退出并回到Ubuntu,从根。

     [root@ip-11-111-111-111 ubuntu]$ exit [ubuntu@ip-11-111-111-111 ~]$ 
  3. 第3步:创build公钥和私钥

     [ubuntu@ip-11-111-111-111 ~]$ su john 

    input您在步骤2中为“john”创build的密码。然后创build一个密钥对。 请记住,密钥对的密码至less应为4个字符。

     [john@ip-11-111-111-111 ubuntu]$ cd /home/john/ [john@ip-11-111-111-111 ~]$ ssh-keygen -b 1024 -f john -t dsa [john@ip-11-111-111-111 ~]$ mkdir .ssh [john@ip-11-111-111-111 ~]$ chmod 700 .ssh [john@ip-11-111-111-111 ~]$ cat john.pub > .ssh/authorized_keys [john@ip-11-111-111-111 ~]$ chmod 600 .ssh/authorized_keys [john@ip-11-111-111-111 ~]$ sudo chown john:ubuntu .ssh 

    在上面的步骤中,john是我们创build的用户,而ubuntu是默认的用户组。

     [john@ip-11-111-111-111 ~]$ sudo chown john:ubuntu .ssh/authorized_keys 
  4. 第四步:现在你只需要下载名为“john”的密钥 。 我使用scp从EC2下载/上传文件,这里是如何做到的。

    您仍然需要使用ubuntu用户复制文件,因为您只有该用户名的密钥。 所以,你需要将密钥移动到Ubuntu的文件夹,并将其修改为777。

     [john@ip-11-111-111-111 ~]$ sudo cp john /home/ubuntu/ [john@ip-11-111-111-111 ~]$ sudo chmod 777 /home/ubuntu/john 

    现在来到本地机器的terminal,在那里你有my_orig_key.pem文件,并做到这一点:

     $ cd ~/.ssh $ scp -i my_orig_key.pem ubuntu@111.111.11.111:/home/ubuntu/john john 

    上面的命令将把密钥“john”复制到本地机器上的当前工作目录中。 将密钥复制到本地计算机后,应删除“/ home / ubuntu / john”,因为它是私钥。

    现在,你的本地机器chmod约翰到600。

     $ chmod 600 john 
  5. 第五步:testing你的密钥的时间

     $ ssh -i john john@111.111.11.111 

所以,用这种方式,你可以设置多个用户使用一个EC2实例!

在本地机器上运行命令:

 ssh-keygen -t rsa -C "SomeAlias" 

该命令运行后,会生成以* .pub结尾的文件。 复制该文件的内容。

在Amazon机器上,编辑〜/ .ssh / authorized_keys并粘贴* .pub文件的内容(并先删除任何现有的内容)。

然后,您可以使用从ssh-keygen命令(私钥)生成的其他文件进行SSH。

这发生在我之前(没有访问其他人创build,但有权访问AWS Web控制台的EC2实例),我博客答案: http : //readystate4.com/2013/04/09/aws-gaining- SSH接入到一个-EC2实例任您失去访问到/

基本上,您可以分离EBS驱动器,将其连接到您有权访问的EC2。 把你的SSH pub key添加到这个连接的驱动器上的~ec2-user/.ssh/authorized_keys 。 然后把它放在旧的EC2实例上。 在使用Amazon AMI的链接中逐步进行。

无需制作快照或创build新的克隆实例。

您可以通过以下命令将新密钥添加到实例中:

 ssh-copy-id -i ~/.ssh/id_rsa.pub domain_alias 

你可以在〜/ .sshconfiguration中configurationdomain_alias

 host domain_alias User ubuntu Hostname domain.com IdentityFile ~/.ssh/ec2.pem 

在我的情况下,我使用这个文档将密钥对与Elastic Beanstalk的实例相关联

重要

您必须先创buildAmazon EC2密钥对,然后configurationElastic Beanstalkconfiguration的Amazon EC2实例才能使用Amazon EC2密钥对,然后才能访问Elastic Beanstalkconfiguration的Amazon EC2实例。 您可以使用AWSpipe理控制台设置您的Amazon EC2密钥对。 有关为Amazon EC2创build密钥对的说明,请参阅Amazon Elastic Compute Cloud入门指南。

使用Elastic BeanstalkconfigurationAmazon EC2服务器实例

我没有find一个简单的方法来通过控制台添加一个新的密钥对,但你可以手动完成。

只需使用现有密钥对ssh进入您的EC2盒子。 然后编辑〜/ .ssh / authorized_keys并在新行上添加新的密钥。 通过新机器退出和ssh。 成功!

一旦实例启动,就无法在元数据级别更改与实例关联的密钥对,但可以更改用于连接到实例的ssh密钥

stackoverflow.com/questions/7881469/change-key-pair-for-ec2-instance