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


240

我获得了AWS Console的访问权,该账户具有运行中的两个实例,但无法关闭(在生产中)。但是,我想获得对这些实例的SSH访问权限,是否可以创建一个新的Keypair并将其应用于实例,以便我可以进行SSH?目前,无法获得用于创建实例的密钥对的现有pem文件。

如果这不可能,那么还有其他方法可以进入实例吗?


您是否在这里尝试过该解决方案:stackoverflow.com/questions/1454629/…ssh-add应该做你需要的。
马克·布林格

很高兴学习ssh-add功能,但这无济于事,因为该用户实际上使用创建的密钥对创建了实例。我要引用的实例是使用另一个我无法访问的密钥对创建的。
克里斯·瓦格纳

1

4
您不能将密钥对应用于正在运行的实例。
罗德尼·奎洛

Answers:


172

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

为了进行恢复,如果它是EBS引导AMI,则可以将其停止并制作该卷的快照。基于它创建一个新的卷。并能够使用它来启动旧实例,创建新映像或恢复数据。

尽管临时存储中的数据将丢失。


由于此问题和解答的受欢迎程度,我想捕获Rodney在其评论中发布的链接中的信息。

有关此信息,请致信Eric Hammond

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

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

  • 您丢失了ssh密钥或忘记了密码
  • 您在编辑/ etc / sudoers文件时出错,并且无法再使用sudo进行root访问来修复它
  • 您的长期运行的实例由于某种原因而挂起,无法联系并且无法正常启动
  • 您需要从实例中恢复文件,但无法访问它

在坐在办公桌前的物理计算机上,您只需使用CD或USB闪存盘引导系统,安装硬盘驱动器,检出并修复文件,然后重新引导计算机即可恢复正常运行。

但是,在其中一种情况下,远程EC2实例似乎很遥远且无法访问。幸运的是,如果我们运行的是EBS引导实例而不是实例存储,则AWS为我们提供了强大的能力和灵活性,能够恢复这样的系统。

EC2上的方法在某种程度上类似于物理解决方案,但是我们将移动故障的“硬盘”(根EBS卷)并将其安装到其他实例,对其进行修复,然后再将其移回。

在某些情况下,启动一个新的EC2实例并丢弃坏的实例可能会更容易,但是如果您确实想修复文件,那么以下方法对许多人都有效:

建立

标识包含损坏的根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

修理它

此时,您可以在实例B的/ vol-a下查看实例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,这可能会导致问题,如果您使用一个名称对文件进行了整理,然后将卷移回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停止时为它分配了一个弹性IP地址,则需要在重新启动它后重新关联它。

记得!如果您的实例B仅出于此过程而临时启动,请不要忘记立即终止它。


您能否告诉我们有关此操作的逐步指南(或指向它)。就我而言,我有一个正在运行的实例,需要从没有私钥的远程位置登录到该实例。
2011年

87

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

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

  1. 步骤1:默认登录“ ubuntu”用户

    $ ssh -i my_orig_key.pem ubuntu@111.111.11.111
    
  2. 第2步:创建一个新用户,我们将新用户称为“ 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
    

    好的!我们已经创建了新用户,现在您需要生成登录所需的密钥文件,就像步骤1中的my_orin_key.pem一样。

    现在,退出并退出root进入ubuntu。

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

    [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
    
  4. 步骤4:现在您只需要下载名为“ john”的密钥。我使用scp从EC2下载/上传文件,这是您可以执行的操作。

    您仍然需要使用ubuntu用户复制文件,因为您只有该用户名的密钥。因此,您需要将密钥移动到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
    
  5. 步骤5:是时候测试您的密钥了

    $ ssh -i john john@111.111.11.111
    

因此,以这种方式,您可以设置多个用户使用一个EC2实例!


4
这很有用,但是作为最后一步,您是否还应该删除远程计算机上的私钥?这样,其他人访问实例也无法将它复制并使用您的密钥登录。
culix

这对我有用。但是,由于要处理的文件位于ubuntu用户目录中,因此如何从此处导航至ubuntu用户。这将带我进入john用户组。Ubuntu 14.04.4 LTS
olyjosh '17

这对我不起作用。它赋予了无效的权限。我不得不从ec2控制台创建密钥对,然后它开始起作用
黑骑士

11

在本地计算机上,运行命令:

ssh-keygen -t rsa -C "SomeAlias"

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

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

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


因此,就像@Dan提到的那样,可以更改对实例的访问权限,以编辑此文件,但是您永远无法在元数据级别上更改与实例关联的密钥对。不要忘记在您的publicKey末尾添加.pem文件名,例如:ssh-rsa AAAAB3NzaC1yc2EA...DsGt66 my-key-pair
Ricardo Mutti

7

这是我较早发生的事情(无法访问其他人创建的EC2实例,但可以访问AWS Web控制台),我在博客上写了答案:http : //readystate4.com/2013/04/09/aws-gaining- ssh访问一个EC2实例,您丢失了访问权限/

基本上,您可以分离EBS驱动器,将其连接到您有权访问的EC2。将您的SSH发布密钥添加到~ec2-user/.ssh/authorized_keys到此连接的驱动器上。然后将其放回旧的EC2实例。使用Amazon AMI在链接中分步介绍。

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


6

就我而言,我使用此文档将密钥对与我的Elastic Beanstalk实例相关联

重要

您必须先创建一个Amazon EC2密钥对,并将您的Elastic Beanstalk提供的Amazon EC2实例配置为使用Amazon EC2密钥对,然后才能访问您的Elastic Beanstalk提供的Amazon EC2实例。您可以使用AWS管理控制台设置Amazon EC2密钥对。有关为Amazon EC2创建密钥对的说明,请参阅《 Amazon Elastic Compute Cloud入门指南》。

使用Elastic Beanstalk配置Amazon EC2服务器实例


1
谢谢@ kamal-essajidi!对于使用EB的其他用户:拥有密钥对后,可以在“配置”>“实例”>“ EC2密钥对”中将其添加到Elastic Beanstalk中。
斯科特

4

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

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

您可以在〜/ .ssh配置中配置domain_alias

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

4

我没有找到通过控制台添加新密钥对的简便方法,但是可以手动进行。

只需使用现有密钥对将您的EC2放入SSH。然后编辑〜/ .ssh / authorized_keys并将新密钥添加到新行中。通过新机器退出并ssh。成功!



3

对于Elasticbeanstalk环境,您可以将键-值对应用于正在运行的实例,如下所示:

  • 从EC2->密钥对创建一个键-值对(在“网络和安全性”选项卡下)
  • 转到Elasticbeanstalk并单击您的应用程序
  • 进入配置页面并修改安全设置
  • 选择您的EC2密钥对,然后单击“应用”
  • 单击确认以确认更新。它将终止环境并将键值应用于您的环境。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.