如果您建议的话,这并不是要复制服务器上的公钥然后进行 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_keys
,chmod 600 /path/.ssh/authorized_keys
最后将其复制id_rsa
为permission.pem 文件并将其提供给machine1。
这样,machine1 就可以连接到 machine2 进行操作ssh -i permission.pem thatuser@machine2
。 machine1 的用户可以携带permission.pem 并从任何机器连接到machine2,而无需密码。
当然,这是不安全的,但您也可以使用密码。我想知道的是如何做到这一点的概念。这回答了。