将密钥对添加到现有 EC2 实例
Posted
技术标签:
【中文标题】将密钥对添加到现有 EC2 实例【英文标题】:Add Keypair to existing EC2 instance 【发布时间】:2011-03-16 16:49:37 【问题描述】:我获得了 AWS 对一个帐户的控制台访问权限,该帐户运行了 2 个我无法关闭的实例(在生产中)。但是,我想获得对这些实例的 SSH 访问权限,是否可以创建一个新的密钥对并将其应用于实例,以便我可以通过 SSH 访问?获取用于创建实例的密钥对的现有 pem 文件目前不是一种选择。
如果这不可能,我可以通过其他方式进入实例吗?
【问题讨论】:
您是否尝试过这里的解决方案:***.com/questions/1454629/… ?ssh-add
应该做你需要的。
很高兴学习 ssh-add 功能,但这无济于事,因为该用户实际上使用他创建的密钥对创建了实例。我所指的实例是使用另一个我无权访问的密钥对创建的。
你最好在serverfault.com问这个问题
您不能将密钥对应用于正在运行的实例。
"Once an instance has been started, there is no way to change the keypair associated with the instance at a meta data level, but you can change what ssh key you use to connect to the instance."
【参考方案1】:
您不能将密钥对应用于正在运行的实例。您只能使用新密钥对来启动新实例。
对于恢复,如果它是 EBS 启动 AMI,您可以停止它,制作卷的快照。基于它创建一个新卷。并且能够使用它来启动旧实例、创建新映像或恢复数据。
虽然临时存储中的数据会丢失。
由于这个问答很受欢迎,我想在 Rodney 在他的评论中发布的链接中捕获信息。
this information 的信用转至 Eric Hammond。
在 EC2 实例的根 EBS 卷上修复文件
您可以检查和编辑 EC2 实例上根 EBS 卷上的文件,即使您处于您认为的灾难性情况,例如:
您丢失了 ssh 密钥或忘记了密码 您在编辑 /etc/sudoers 文件时出错,无法再 使用 sudo 获得 root 访问权限来修复它 您的长时间运行的实例由于某种原因挂起,不能 已联系,但无法正常启动 您需要从实例中恢复文件但无法访问它在您办公桌前的物理计算机上,您只需使用 CD 或 USB 记忆棒启动系统,安装硬盘驱动器,检查并修复文件,然后重新启动计算机即可恢复工作。
但是,当您处于其中一种情况时,远程 EC2 实例似乎很遥远且无法访问。幸运的是,AWS 为我们提供了恢复此类系统的能力和灵活性,前提是我们运行的是 EBS 引导实例而不是实例存储。
EC2 上的方法有点类似于物理解决方案,但我们将移动并安装有故障的“硬盘”(根 EBS 卷)到不同的实例,修复它,然后将其移回。
在某些情况下,启动一个新的 EC2 实例并丢弃坏的实例可能更容易,但如果您真的想修复您的文件,以下是适用于许多人的方法:
设置
确定原始实例 (A) 和包含损坏的 EBS 根卷的卷以及您要查看和编辑的文件。
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,如果您使用一个名称 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 时为其分配了弹性 IP 地址,则需要在重新启动后重新关联它。
记住!如果您的实例 B 只是为此进程临时启动的,请不要忘记现在将其终止。
【讨论】:
你能告诉我们一个分步指南吗(或指向它)。就我而言,我有一个现有的正在运行的实例,需要从远程位置登录,而我没有私钥。【参考方案2】:虽然您不能直接将密钥对添加到正在运行的 EC2 实例,但您可以创建一个 linux 用户并为他创建一个新的密钥对,然后像使用原始用户的密钥对一样使用它。
在您的情况下,您可以要求实例所有者(创建它的人)执行以下操作。因此,实例所有者不必与您共享他自己的密钥,但您仍然可以通过 ssh 访问这些实例。这些步骤最初由 Utkarsh Sengar(又名@zengr)在http://utkarshsengar.com/2011/01/manage-multiple-accounts-on-1-amazon-ec2-instance/ 发布。我只做了一些小的改动。
第一步:默认登录“ubuntu”用户:
$ ssh -i my_orig_key.pem ubuntu@111.111.11.111
第 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 一样。
现在,退出并返回 ubuntu,脱离根目录。
[root@ip-11-111-111-111 ubuntu]# exit
[ubuntu@ip-11-111-111-111 ~]$
第 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 步:现在您只需下载名为“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
现在来到本地机器的终端,那里有 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 步:测试密钥的时间:
$ ssh -i john john@111.111.11.111
因此,通过这种方式,您可以设置多个用户使用一个 EC2 实例!!
【讨论】:
这很有用,但作为最后一步,您不应该同时从远程机器上删除私钥吗?这样其他有权访问该实例的人也无法复制它并使用您的密钥登录。 这对我有用。但是我如何从这里导航到 ubuntu 用户,因为我将处理的文件位于 ubuntu 用户目录中。这将带我到 john 用户组。 Ubuntu 14.04.4 LTS 这对我不起作用。它提供了无效的权限。我必须从 ec2 控制台创建密钥对,然后它才开始工作【参考方案3】:对于 Elasticbeanstalk 环境,您可以将键值对应用于正在运行的实例,如下所示:
从 EC2 创建一个键值对 -> 密钥对(在 NETWORK & SECURITY 选项卡下) 转到 Elasticbeanstalk 并单击您的应用程序 进入配置页面并修改安全设置 选择您的 EC2 密钥对并单击应用 单击确认以确认更新。它将终止环境并将键值应用于您的环境。【讨论】:
【参考方案4】:在本地机器上,运行命令:
ssh-keygen -t rsa -C "SomeAlias"
该命令运行后,将生成一个以 *.pub 结尾的文件。复制该文件的内容。
在 Amazon 机器上,编辑 ~/.ssh/authorized_keys 并粘贴 *.pub 文件的内容(并首先删除所有现有内容)。
然后您可以使用从 ssh-keygen 命令生成的其他文件(私钥)进行 SSH。
【讨论】:
就像@Dan 提到的那样,可以更改对编辑此文件的实例的访问权限,但您永远无法在元数据级别更改与实例关联的密钥对。不要忘记在您的公钥末尾添加 .pem 文件名,例如:ssh-rsa AAAAB3NzaC1yc2EA...DsGt66 my-key-pair
【参考方案5】:
这发生在我之前(无法访问其他人创建但可以访问 AWS Web 控制台的 EC2 实例),我在博客中给出了答案:http://readystate4.com/2013/04/09/aws-gaining-ssh-access-to-an-ec2-instance-you-lost-access-to/
基本上,您可以分离 EBS 驱动器,将其连接到您有权访问的 EC2。将您的 SSH 发布密钥添加到此附加驱动器上的 ~ec2-user/.ssh/authorized_keys
。然后将其放回旧的 EC2 实例上。使用 Amazon AMI 的链接中的分步说明。
无需制作快照或创建新的克隆实例。
【讨论】:
【参考方案6】:我没有找到通过控制台添加新密钥对的简单方法,但您可以手动完成。
只需使用现有密钥对 ssh 进入您的 EC2 框。然后编辑 ~/.ssh/authorized_keys 并在新行上添加新密钥。通过新机器退出并 ssh。成功!
【讨论】:
【参考方案7】:就我而言,我使用此文档将密钥对与我的 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
【讨论】:
谢谢,@kamal-essajidi!对于使用 EB 的其他人:拥有密钥对后,您可以在配置 > 实例 > EC2 密钥对中将其添加到您的 Elastic Beanstalk。【参考方案8】:您可以通过以下命令向实例添加新密钥:
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
【讨论】:
【参考方案9】:实例一旦启动,就无法更改 在元数据级别与实例关联的密钥对,但 您 可以更改用于连接实例的 ssh 密钥。
***.com/questions/7881469/change-key-pair-for-ec2-instance
【讨论】:
【参考方案10】:您实际上可以通过弹性 beanstalk 配置页面添加密钥对。然后它会为您重新启动您的实例,一切正常。
【讨论】:
以上是关于将密钥对添加到现有 EC2 实例的主要内容,如果未能解决你的问题,请参考以下文章
使用 cloudformation 将 ec2 密钥对添加到 EMR 集群
我们能否通过 AWS Cloudformation 动态创建密钥对并将 .PEM 文件复制到 EC2 Linux 实例