AWS实例允许我第一次使用私钥进行ssh而无需密码

AWS实例允许我第一次使用私钥进行ssh而无需密码

如果您建议的话,这并不是要复制服务器上的公钥然后进行 ssh 操作。

所以我制作了一个AWS Linux实例,并制作了一个ssh密钥对,它自动下载了私钥。

现在我可以通过简单地连接到我的 AWS Linux 实例:

ssh -i key_they_gave_me ec2-user@AWSinstanceIP

我如何为我自己的 Linux 虚拟机设置这种东西?这样有人就可以使用私钥 ssh 进入它,而不需要密码?

编辑:我不是在谈论复制 id_rsa.pub。我知道如何做到这一点,而 AWS 实例不需要这样做。这就是我想要的。

答案1

SSH 允许使用空密码。您ssh-keygen只需在提示输入密码时按 Enter 键即可复制它。从man ssh-keygen

该程序还要求输入密码。密码短语可以为空,表示没有密码短语(主机密钥必须具有空密码短语),也可以是任意长度的字符串。

这是作为各种云服务的一部分生成的密钥的标准行为。我希望如果您使用谷歌或微软云,您会发现同样的事情发生。这可能看起来不安全,但替代方案也不是很好。他们需要以某种方式允许您访问虚拟机。

对于任何担心安全性的人,ssh-keygen还有一个功能可以更改私钥上的密码,而无需更改公钥:

ssh-keygen -p -f key_they_gave_me

就我个人而言,我默认启用密码短语,但将无密码密钥存储在 LUKS 卷中。当我知道我将要频繁使用 ssh 时,我会将无密码密钥安装在默认密钥的顶部。当我完成工作后,我会卸载,因此任何入侵者仍然需要处理密码。这在很多时候不需要 ssh-agent,同时可以对密钥的安全性进行大量控制。

答案2

您询问的是 AWS 的基础设施如何生成 ssh 密钥。除非任何为 AWS 工作并被允许披露该信息的人 (高度不太可能)那么你将无法得到完整的答案。

最重要的是,您要寻找的答案完全取决于您使用的虚拟化后端。

话虽如此,从AWS公开的信息是,他们现在使用的是自己自制的KVM虚拟化平台,而不是XEN像以前那样使用。

因此,我们可以大胆猜测 AWS 是如何做到这一点的,或者至少提供一种通过 kvm 主机执行此操作的方法。据我所知,最常见的方法是在带有标志的图像virt-sysprep上使用。qcow2--ssh-inject

例子

首先在 kvmhost 上使用 生成公钥ssh-keygen。假设您的用户是iamAguest并且您已将新的公钥存储在/home/iamAguest/.ssh/id_rsa.pub

然后,您可以运行virt-sysprep将这些密钥注入到图像中:

virt-sysprep -a a_linux_image.qcow2 --run-command 'useradd iamAguest' --ssh-inject iamAguest:file:/home/iamAguest/.ssh/id_rsa.pub 

然后,一旦您使用该映像部署了实例a_linux_image.qcow2,您就应该能够使用新生成的密钥进行 ssh 连接。

亚马逊是如何通过点击按钮做到这一点的?

一个足够简单的脚本就可以做到这一点,但在 AWS 规模的平台上,这无疑会相当复杂。

如果您只是运行自己的 kvm 实例,那么像这样简单的事情就可以解决问题:

#!/usr/bin/bash

# get image and user from user input
image=$1
user=$2

# fail if no user input
if [ -z "$image" ] || [ -z "$user" ]; then
    echo "you must enter a filepath to an image and a user name to run this"
    echo "e.g: inject_ssh.bash <image> <user>"
    exit 1
fi

# create ssh key for current logged in user with no passphrase
echo -e "/home/$user/.ssh/id_rsa\n\n" | ssh-keygen

# inject key into image 
virt-sysprep -a $image --run-command "useradd $user" --ssh-inject $user:file:/home/$user/.ssh/id_rsa.pub

但请注意,最好先复制图像,这样如果您打算将其作为消费者解决方案提供,您仍然拥有一个没有任何密钥的干净图像。在脚本中添加更多验证也是一个好主意;这只是一个简单的例子。

答案3

我实际上找到了方法。其实很简单。

假设您有 machine1 和 machine2,并且您希望能够从 machine1 访问 machine2,而无需处理 machine1 的密钥,方法是让 machine1 的用户甚至可以从 machine1 以外的另一台计算机访问 machine2。

ssh-keygen在机器2上做。然后cat /path/.ssh/id_rsa.pub >> /path/.ssh/authorized_keyschmod 600 /path/.ssh/authorized_keys最后将其复制id_rsa为permission.pem 文件并将其提供给machine1。

这样,machine1 就可以连接到 machine2 进行操作ssh -i permission.pem thatuser@machine2。 machine1 的用户可以携带permission.pem 并从任何机器连接到machine2,而无需密码。

当然,这是不安全的,但您也可以使用密码。我想知道的是如何做到这一点的概念。这回答了。

相关内容