我获得了AWS Console访问权限的帐户,其中有2个实例正在运行,我无法关闭(在 生产环境 中) . 但是,我想获得对这些实例的SSH访问,是否可以创建一个新的Keypair并将其应用于实例,以便我可以SSH?获取当前创建的实例的密钥对的现有pem文件目前不是一种选择 .
如果这不可能,还有其他方法可以进入实例吗?
您无法将密钥对应用于正在运行的实例 . 您只能使用新密钥对来启动新实例 .
对于恢复,如果它是EBS启动AMI,您可以停止它,创建卷的快照 . 基于它创建新卷 . 并能够使用它来启动旧实例,创建新映像或恢复数据 .
虽然短暂存储的数据将丢失 .
由于这个问题和答案的流行,我想捕获Rodney在评论中发布的链接中的信息 .
对于this information,积分为Eric Hammond .
您可以检查和编辑EC2实例上的根EBS卷上的文件,即使您处于您认为的灾难性情况中,例如:
您丢失了ssh密钥或忘记了密码
编辑/ etc / sudoers文件时出错了,无法再通过sudo获取root权限来修复它
长时间运行的实例由于某种原因挂起,无法联系,无法正常启动
您需要从实例中恢复文件但无法访问它
在坐在办公桌前的物理计算机上,您只需使用CD或USB记忆棒启动系统,安装硬盘驱动器,检出并修复文件,然后重新启动计算机即可重新开始工作 .
但是,当您处于其中一种情况时,远程EC2实例似乎很遥远且无法访问 . 幸运的是,AWS为我们提供了能够恢复这样的系统的能力和灵活性,只要我们运行的是EBS启动实例而不是实例存储 .
EC2上的方法有点类似于物理解决方案,但我们将移动并将故障“硬盘驱动器”(根EBS卷)安装到不同的实例,修复它,然后将其移回 .
在某些情况下,启动一个新的EC2实例并抛弃坏的实例可能会更容易,但如果你真的想修复你的文件,那么这个方法对许多人来说是有用的:
Setup
使用要查看和编辑的文件标识包含损坏的根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
Fix It
此时,来自实例A的整个根文件系统可在实例B上的/ vol-a下查看和编辑 . 例如,您可能希望:
将正确的ssh密钥放在/vol-a/home/ubuntu/.ssh/authorized_keys中
编辑并修复/ vol-a / etc / sudoers
在/ vol -a / var / log / syslog中查找错误消息
从/ vol-a / ...复制重要文件
注意:两个实例上的uid可能不相同,因此在创建,编辑或复制属于非root用户的文件时要小心 . 例如,实例A上的mysql用户可能与实例B上的postfix用户具有相同的UID,如果您使用一个名称chown文件然后将卷移回A,则可能会导致问题 .
Wrap Up
完成后您对/ 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出现就好了,您可以完成您最初设定的操作 . 如果没有,您可能需要继续重复这些步骤,直到它完成 .
注意:如果你当你停止它时,有一个弹性IP地址分配给实例A,你需要在重新启动后重新关联它 .
记得!如果您的实例B仅为此过程暂时启动,请不要忘记立即终止它 .
虽然您无法直接向正在运行的EC2实例添加密钥对,但您可以创建一个Linux用户并为他创建一个新的密钥对,然后像使用原始用户的密钥对一样使用它 .
在您的情况下,您可以要求实例所有者(创建它的人)执行以下操作 . 因此,实例所有者不必与您共享自己的密钥,但您仍然可以ssh到这些实例中 . 这些步骤最初由Utkarsh Sengar(又名@zengr)在http://utkarshsengar.com/2011/01/manage-multiple-accounts-on-1-amazon-ec2-instance/发布 . 我只做了一些小改动 .
$ ssh -i my_orig_key.pem ubuntu@111.111.11.111
[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
好的!我们创建了新用户,现在您需要生成登录所需的密钥文件,就像我们在步骤1中有my_orin_key.pem一样 .
现在,退出并从root返回ubuntu .
[root@ip-11-111-111-111 ubuntu]$ exit [ubuntu@ip-11-111-111-111 ~]$
[ubuntu@ip-11-111-111-111 ~]$ su john
输入您在步骤2中为“john”创建的密码 . 然后创建密钥对 . 请记住,密钥对的密码短语应至少为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是我们创建的用户,ubuntu是默认用户组 .
[john@ip-11-111-111-111 ~]$ sudo chown john:ubuntu .ssh/authorized_keys
您仍然需要使用 ubuntu user复制文件,因为您只有该用户名的密钥 . 因此,您需要将密钥移动到ubuntu文件夹并将其chmod到777 .
[john@ip-11-111-111-111 ~]$ sudo cp john /home/ubuntu/ [john@ip-11-111-111-111 ~]$ sudo chmod 777 /home/ubuntu/john
现在来到本地机器的终端,你有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 john到600 .
$ chmod 600 john
$ ssh -i john john@111.111.11.111
因此,通过这种方式,您可以设置多个用户使用一个EC2实例!
在本地计算机上,运行命令:
ssh-keygen -t rsa -C "SomeAlias"
运行该命令后,将生成以* .pub结尾的文件 . 复制该文件的内容 .
在亚马逊机器上,编辑〜/ .ssh / authorized_keys并粘贴* .pub文件的内容(并首先删除所有现有内容) .
然后,您可以使用从ssh-keygen命令(私钥)生成的其他文件进行SSH .
这发生在我之前(无法访问其他人创建但可访问AWS Web控制台的EC2实例)并且我在博客上写了答案:http://readystate4.com/2013/04/09/aws-gaining-ssh-access-to-an-ec2-instance-you-lost-access-to/
基本上,您可以拆卸EBS驱动器,将其连接到您有权访问的EC2 . 在此连接的驱动器上将您的SSH pub键添加到 ~ec2-user/.ssh/authorized_keys . 然后把它放回旧的EC2实例上 . 使用Amazon AMI在链接中循序渐进 .
~ec2-user/.ssh/authorized_keys
无需创建快照或创建新的克隆实例 .
您只需通过以下命令向实例添加新密钥:
ssh-copy-id -i ~/.ssh/id_rsa.pub domain_alias
您可以在〜/ .ssh config中配置domain_alias
host domain_alias User ubuntu Hostname domain.com IdentityFile ~/.ssh/ec2.pem
在我的例子中,我使用此文档将密钥对与我的Elastic Beanstalk实例相关联
重要您必须先创建Amazon EC2密钥对,然后配置Elastic Beanstalk配置的Amazon EC2实例才能使用Amazon EC2密钥对,然后才能访问Elastic Beanstalk配置的Amazon EC2实例 . 您可以使用AWS管理控制台设置Amazon EC2密钥对 . 有关为Amazon EC2创建密钥对的说明,请参阅Amazon Elastic Compute Cloud入门指南 .
Configuring Amazon EC2 Server Instances with Elastic Beanstalk
一旦实例启动,就无法在元数据级别更改与实例关联的密钥对,但您可以更改用于连接到实例的ssh密钥 .
stackoverflow.com/questions/7881469/change-key-pair-for-ec2-instance
我没有找到通过控制台添加新密钥对的简单方法,但您可以手动完成 .
只需使用现有密钥对将ssh插入EC2框即可 . 然后编辑〜/ .ssh / authorized_keys并在新行上添加新密钥 . 通过新机器退出并ssh . 成功!
8 回答
您无法将密钥对应用于正在运行的实例 . 您只能使用新密钥对来启动新实例 .
对于恢复,如果它是EBS启动AMI,您可以停止它,创建卷的快照 . 基于它创建新卷 . 并能够使用它来启动旧实例,创建新映像或恢复数据 .
虽然短暂存储的数据将丢失 .
由于这个问题和答案的流行,我想捕获Rodney在评论中发布的链接中的信息 .
对于this information,积分为Eric Hammond .
修复EC2实例的根EBS卷上的文件
您可以检查和编辑EC2实例上的根EBS卷上的文件,即使您处于您认为的灾难性情况中,例如:
您丢失了ssh密钥或忘记了密码
编辑/ etc / sudoers文件时出错了,无法再通过sudo获取root权限来修复它
长时间运行的实例由于某种原因挂起,无法联系,无法正常启动
您需要从实例中恢复文件但无法访问它
在坐在办公桌前的物理计算机上,您只需使用CD或USB记忆棒启动系统,安装硬盘驱动器,检出并修复文件,然后重新启动计算机即可重新开始工作 .
但是,当您处于其中一种情况时,远程EC2实例似乎很遥远且无法访问 . 幸运的是,AWS为我们提供了能够恢复这样的系统的能力和灵活性,只要我们运行的是EBS启动实例而不是实例存储 .
EC2上的方法有点类似于物理解决方案,但我们将移动并将故障“硬盘驱动器”(根EBS卷)安装到不同的实例,修复它,然后将其移回 .
在某些情况下,启动一个新的EC2实例并抛弃坏的实例可能会更容易,但如果你真的想修复你的文件,那么这个方法对许多人来说是有用的:
Setup
使用要查看和编辑的文件标识包含损坏的根EBS卷的原始实例(A)和卷 .
确定将用于修复原始EBS卷上的文件的第二个EC2实例(B) . 此实例必须在与实例A相同的可用区中运行,以便它可以附加EBS卷 . 如果您尚未运行实例,请启动临时实例 .
停止损坏的实例A(等待它完全停止),从实例中分离根EBS卷(等待它被分离),然后将卷附加到未使用设备上的实例B.
ssh到实例B并装入卷,以便您可以访问其文件系统 .
Fix It
此时,来自实例A的整个根文件系统可在实例B上的/ vol-a下查看和编辑 . 例如,您可能希望:
将正确的ssh密钥放在/vol-a/home/ubuntu/.ssh/authorized_keys中
编辑并修复/ vol-a / etc / sudoers
在/ vol -a / var / log / syslog中查找错误消息
从/ vol-a / ...复制重要文件
注意:两个实例上的uid可能不相同,因此在创建,编辑或复制属于非root用户的文件时要小心 . 例如,实例A上的mysql用户可能与实例B上的postfix用户具有相同的UID,如果您使用一个名称chown文件然后将卷移回A,则可能会导致问题 .
Wrap Up
完成后您对/ vol-a下的文件感到满意后,卸载文件系统(仍在实例-B上):
现在,使用ec2-api-tools重新启动系统,继续将EBS卷移回原始实例A上的主页并再次启动实例:
希望您解决了问题,实例A出现就好了,您可以完成您最初设定的操作 . 如果没有,您可能需要继续重复这些步骤,直到它完成 .
注意:如果你当你停止它时,有一个弹性IP地址分配给实例A,你需要在重新启动后重新关联它 .
记得!如果您的实例B仅为此过程暂时启动,请不要忘记立即终止它 .
虽然您无法直接向正在运行的EC2实例添加密钥对,但您可以创建一个Linux用户并为他创建一个新的密钥对,然后像使用原始用户的密钥对一样使用它 .
在您的情况下,您可以要求实例所有者(创建它的人)执行以下操作 . 因此,实例所有者不必与您共享自己的密钥,但您仍然可以ssh到这些实例中 . 这些步骤最初由Utkarsh Sengar(又名@zengr)在http://utkarshsengar.com/2011/01/manage-multiple-accounts-on-1-amazon-ec2-instance/发布 . 我只做了一些小改动 .
设置“john”的密码:
将“john”添加到sudoer的列表中:
..并将以下内容添加到文件末尾:
好的!我们创建了新用户,现在您需要生成登录所需的密钥文件,就像我们在步骤1中有my_orin_key.pem一样 .
现在,退出并从root返回ubuntu .
输入您在步骤2中为“john”创建的密码 . 然后创建密钥对 . 请记住,密钥对的密码短语应至少为4个字符 .
在上面的步骤中,john是我们创建的用户,ubuntu是默认用户组 .
您仍然需要使用 ubuntu user复制文件,因为您只有该用户名的密钥 . 因此,您需要将密钥移动到ubuntu文件夹并将其chmod到777 .
现在来到本地机器的终端,你有my_orig_key.pem文件并执行此操作:
上面的命令会将密钥“john”复制到本地计算机上的当前工作目录 . 将密钥复制到本地计算机后,应删除“/ home / ubuntu / john”,因为它是私钥 .
现在,你的本地机器chmod john到600 .
因此,通过这种方式,您可以设置多个用户使用一个EC2实例!
在本地计算机上,运行命令:
运行该命令后,将生成以* .pub结尾的文件 . 复制该文件的内容 .
在亚马逊机器上,编辑〜/ .ssh / authorized_keys并粘贴* .pub文件的内容(并首先删除所有现有内容) .
然后,您可以使用从ssh-keygen命令(私钥)生成的其他文件进行SSH .
这发生在我之前(无法访问其他人创建但可访问AWS Web控制台的EC2实例)并且我在博客上写了答案:http://readystate4.com/2013/04/09/aws-gaining-ssh-access-to-an-ec2-instance-you-lost-access-to/
基本上,您可以拆卸EBS驱动器,将其连接到您有权访问的EC2 . 在此连接的驱动器上将您的SSH pub键添加到
~ec2-user/.ssh/authorized_keys
. 然后把它放回旧的EC2实例上 . 使用Amazon AMI在链接中循序渐进 .无需创建快照或创建新的克隆实例 .
您只需通过以下命令向实例添加新密钥:
您可以在〜/ .ssh config中配置domain_alias
在我的例子中,我使用此文档将密钥对与我的Elastic Beanstalk实例相关联
Configuring Amazon EC2 Server Instances with Elastic Beanstalk
stackoverflow.com/questions/7881469/change-key-pair-for-ec2-instance
我没有找到通过控制台添加新密钥对的简单方法,但您可以手动完成 .
只需使用现有密钥对将ssh插入EC2框即可 . 然后编辑〜/ .ssh / authorized_keys并在新行上添加新密钥 . 通过新机器退出并ssh . 成功!