为 AWS Lightsail/EC2 实例创建 ssh 密钥对无法按预期工作

为 AWS Lightsail/EC2 实例创建 ssh 密钥对无法按预期工作

我曾经创建过不少 SSH 密钥对,但 AWS 似乎以不同的方式处理它们。我使用的是 AWS Lightsail,它有一个“默认”密钥对的概念。对于 AWS 为我设置的“普通”用户来说,这很好。就我的 Lightsail Ubuntu 服务器而言,这个用户被称为“ubuntu”。

我已在此服务器上创建了另一个标准用户帐户,我们将其称为“fred”。通常,我会以 fred 的身份登录远程主机,运行 ssh-keygen 并创建公钥/私钥。我会将私钥复制回本地计算机,设置正确的权限,然后执行类似 ssh -i privatekeyforfred.pem 的操作[电子邮件保护]

如果我使用我的 lightsail/EC2 实例尝试这种方法,我会得到:权限被拒绝(公钥)。

如果我按照 AWS 关于此事的糟糕指南进行操作,他们会告诉我在他们的仪表板上做各种事情并创建一个“自定义”密钥:https://docs.aws.amazon.com/lightsail/latest/userguide/amazon-lightsail-ssh-using-terminal.html

这个自定义密钥似乎不知道我需要为哪个身份 (fred) 登录远程主机,所以我不知道它怎么能起作用。不管怎样,我想试一试,唉,我的担心确实是正确的。

我已经在 Google 上搜索了几个小时,终于筋疲力尽了!这应该是一件简单的事情,为什么 AWS 会让这项任务变得如此难以完成,有谁能帮我解决一下这个问题?

干杯!

答案1

通常情况下,我会以 fred 的身份登录远程主机,运行 ssh-keygen 并创建公钥/私钥。我会将私钥复制回本地计算机,设置正确的权限,然后执行类似以下操作:

这有点倒退。虽然密钥生成的位置对 SSH 来说完全没有区别,但建议的流程是直接在将要使用的机器上生成密钥对,这样你就不会需要通过网络传输私钥文件根本不可能。因此,您应该在本地生成密钥对,然后传输公钥在您的服务器上的正确位置。

这个自定义密钥似乎没有我需要为其登录远程主机的身份(fred)的概念,所以我不知道它如何工作。

标准 SSH 密钥首先没有用户身份的概念。

(公钥末尾的那段文字不是这个;它是一个注释字段,对客户端和服务器都没有意义。它的目的是可以区分同一服务器上的多个密钥。

这一切都是因为对面的查找已完成 - SSH 客户端始终单独传输用户名,因此 SSH 服务器可以检查该特定用户名的“授权密钥”列表是否包含密钥。

在运行 OpenSSH 的 Unix 服务器上,该列表会保留~/.ssh/authorized_keys您尝试登录的任何用户(除非路径已更改/etc/ssh/sshd_config为其他路径)。您没有提到在密钥生成过程中向此文件添加任何内容,但如果没有,新密钥将无法使用 - 在 ssh-keygen 之后不会自动发生这种情况。

大多数云提供商都有一个“首次启动设置”过程,为默认的“ubuntu”用户预先创建此文件;因此,Lightsail 中的“自定义密钥”设置只会对该点之后创建的虚拟机产生影响(并且仍然只对默认用户产生影响),但它们对已经运行的虚拟机没有影响。

(所有这些都是导致您当前流程有点倒退的另一个原因——如果您从五台电脑访问同一台服务器,并且它们都使用在服务器上生成的密钥,那么默认情况下所有密钥都会有完全相同的注释字段。通常,当您在服务器上的“authorized_keys”中有一个客户端主机列表时,您希望看到客户请参阅那里的描述。

有人能在这里伸出一只老 Unix 狗的援手吗?

检查服务器的日志文件。将 sshd 设置为LogLevel DEBUG,它会告诉您拒绝密钥的原因 - 尽管最有可能是因为它无法在您的 ~/.ssh/authorized_keys 中找到密钥。

也可能是因为 sshd 不喜欢该文件的权限太开放,或者该文件属于错误的帐户,或者该文件sshd_config被设置为使用不同的路径;无论哪种情况,系统日志中都会有一条消息。

答案2

好吧好吧,我已经找到答案了,它比我想象的要复杂得多,感谢我们在 AWS 的朋友 ;)

对于任何寻求答案的人,以下是您必须执行的操作:NB 我假设您已经使用“adduser”或类似命令在 lightsail 实例上创建了用户 fred,并且它已经有一个具有适当用户权限的 ~/.ssh 目录。我还概述了您必须在每个步骤上使用的主机 [desktop] 是您自己的计算机,[lightsail] 是 AWS lightsail(或 EC2 实例)。

步骤 1:创建 SSH 密钥对(如果尚未创建)

[桌面] 打开您的终端。生成新的 SSH 密钥对(或使用现有的密钥对)。要生成新密钥,请执行如下操作:

ssh-keygen -t rsa -b 2048 -f ~/.ssh/fred_lightsail

注意:当提示输入密码时,您可以选择将其留空,以进行无密码登录。

确保您的私钥(fred_lightsail)是安全的:

chmod 600 ~/.ssh/fred_lightsail

步骤 2:将公钥上传至 AWS Lightsail

[desktop] 接下来,就是魔术师的秘诀!您需要将公钥 (fred_lightsail.pub) 上传到您的 Lightsail 实例。您必须通过 AWS Lightsail 控制台执行此操作。

  1. 转到 Lightsail 管理控制台 (https://lightsail.aws.amazon.com) / 或从主 AWS 管理控制台导航到 Lightsail 部分。
  2. 确保防火墙中启用了 SSH:单击您的实例,然后转到“网络”选项卡。在防火墙下,确保允许 SSH(端口 22)。
  3. 添加 SSH 密钥:从 Lightsail 主页转到帐户页面,然后在 SSH 密钥下上传您的公钥 (fred_lightsail.pub)。

步骤 3:在 Lightsail 上设置用户和权限

[lightsail] 使用默认的“ubuntu”用户通过 SSH 进入您的 Lightsail 实例。

ssh -i /path/to/default/ubuntu-key ubuntu@your-instance-ip

将公钥添加到新用户的授权密钥中:

echo "your-public-key-contents" | sudo tee /home/fred/.ssh/authorized_keys
sudo chmod 600 /home/fred/.ssh/authorized_keys
sudo chown -R fred:fred /home/fred/.ssh

(您也可以通过 scp/sftp 将公钥发送给您的 ubuntu 用户,然后将文件 mv 到 /home/fred 并更改权限)

步骤 4:登录并尽情享受吧![桌面] 现在在您的桌面上,您应该能够使用以下命令以“fred”身份通过 SSH 进入您的 Lightsail 实例:

ssh -i ~/.ssh/fred_lightsail fred@your-instance-ip

我希望这能帮助那些肯定受挫的“普通”Linux 用户。AWS 关于此步骤的文档充其量是不准确的!

相关内容