每次我想让某人访问一台机器时,我都会要求他们执行 ssh-copy-id。我在计算机上创建用户帐户和随机密码后执行此操作。这通常通过电子邮件发生。
在要求人们执行 ssh-copy-id 和他们采取行动之间(可能需要几个小时到几天),我必须保持我的计算机对密码登录“ PasswordAuthentication yes
”开放。
有没有办法让这个工作流程变得更好?我不想将 sshd 暴露给密码登录,并且经常在对话之间我最终忘记设置PasswordAuthentication no
。
答案1
要求他们自己生成密钥。通过电子邮件发送密码或私钥从来都不是一个好主意。尽管传输应该是安全的,但邮件在至少两个可能不可信的服务器上放置了多年(免费邮件,...)。
仅公开此用例的密码身份验证是不值得的。您可能只是忘记取回它,或者重新启动服务,最终会打开密码身份验证。如果必须,只需为该单个用户启用它:
Match user new-user PasswordAuthentication yes
创建一个脚本,为新用户设置公钥和正确的权限。它要么是直接在该服务器上的几行,要么您甚至可以使用
ssh-copy-id
with-f
开关(如果您已经启用密码身份验证)来最小化打开服务器的窗口。如果您想控制用于身份验证的公钥并避免用户写入/修改其授权密钥,您可以将其配置
AuthorizedKeysFile
到某个公共目录,您将在其中控制访问权限,例如AuthorizedKeysFile /etc/ssh/authorized_keys/%u
new-user
这将在 中搜索用户的文件/etc/ssh/authorized_keys/new_user
。在该目录下创建的文件/etc/
应具有适合 ssh 的默认权限。
答案2
您可以按照 Hetzner Online(一家德国 ISP)的方式进行操作,至少在设置公钥身份验证时使用他们的 Linux VPS(他们在配置期间提供此选项,作为设置帐户密码的替代方法root
)。
要求用户提交公钥前您允许他们访问他们的帐户。永远不要自己为用户帐户设置密码,如果您愿意,请将所有内容保留PubkeyAuthentication
在 sshd 中,但始终关闭。在您创建用户帐户后,或者在您收到密钥后但在允许他们访问之前,将用户提供的密钥插入到用户自己的 ~/.ssh/authorized_keys 中。假设使用 OpenSSH,您甚至可以将 SSH 服务器设置为仅接受来自本地主机的密码身份验证(使用Match
/etc/ssh/sshd_config 中的节),这应该允许您在本地使用ssh-copy-id
工作流程,确保设置权限和所有权等内容正确。
这样,用户始终保留对其私钥的完全控制,并且不会传输任何不会共享的数据。您也不训练他们接受其他人生成私钥。亚马逊也许能够做到这一点——我个人对此表示怀疑,并且肯定希望立即更换密钥对——但是你可以像他们一样投入大量资金来使该流程正确无误的可能性有多大?
理想情况下,您应该要求通过加密通道传输公钥,但这与其说是为了隐私,不如说是为了真实性。用户希望确保他们正在与他们认为正在与之通信的实体进行通信,并且您希望至少合理地确定没有人充当中间人并修改通信并将公钥替换为他们自己的。但即使通过简单、不安全的电子邮件发送公钥也没有那么糟糕。毕竟,公钥就是要公开的。
如果您很少设置新帐户,并且对于与您已经建立关系的人,您甚至可以通过电话呼叫用户并要求他们读出他们的 SSH 密钥指纹,并根据您收到的信息进行验证。同时向他们提供主机密钥的指纹。这样,即使是第一次,他们也可以确保他们连接到正确的主机。 (Hetzner 在“您的 VPS 已准备就绪”电子邮件中包含了主机密钥指纹。)
答案3
按照亚马逊的方式进行操作——为他们生成公钥/私钥对,并向他们发送私钥。他们需要提交该私钥进行身份验证 ( ssh -i /path/to/key.pem user@host
),这样您就无需启用 SSH 密码身份验证。
编辑: 感谢评论者,我终于知道他们来自哪里了。到最初分享用户的私钥,应通过安全通道(例如 HTTPS)发送。