现在我们的团队可以通过 SSH 公钥身份验证连接到服务器。每个团队成员在其 PC 上都有一个私钥,~/.ssh/
而公钥则在服务器上的文件中authorized_key
。
已发出请求,仅授权从分配给每个团队成员的 PC 到服务器的 ssh 连接。
事实上,现在即使团队成员没有这些电脑的 root 访问权限,理论上他们也可以从主文件夹复制私钥并在其他计算机上使用它来连接到服务器。所以我的问题是如何做到这一点?
我阅读了大量文档并测试了对我来说最好的方法:基于主机的身份验证。
这似乎是解决我的问题的完美解决方案,每台 PC 都会有一个私钥,其中/etc/ssh/
非 root 用户无法读取该私钥,并且除了现有的公钥身份验证配置之外,还用于对主机进行身份验证。
我遇到的问题是 SSH 客户端发送到服务器的主机名。我注意到,根据我连接的网络,发送的主机名将为fooMachine.localdomain
, fooMachine.home
, fooMachine
。
我使用ssh -vvv user@ip
并查看了以
debug2: userauth_hostbased: chost ...
注意到这一点。
PC 并不总是从同一网络连接到 SSH 服务器,我们没有 VPN 或静态 IP。
因此,所有这一切意味着在 SSH 服务器上,我必须声明多次连接的主机 ( fooMachine.localdomain
, fooMachine.home
, fooMachine
),并且可能会发生我连接到的网络,在该网络之后我将有另一个后缀fooMachine
,并且我不会能够连接我的服务器。
我该如何解决这个问题?还是我的做法不对?
请注意,我尝试强制主机名类似于fooMachine.test.com
.重启后,hostname --fqdn
显示的fooMachine.test.com
SSH客户端使用的主机名仍然是fooMachine.localdomain
。
我还在 ssh 服务器上的 shosts.equiv 文件中尝试了通配符,在该文件中我声明了将连接到服务器的主机,但它不起作用。阅读完后源代码这是有道理的,因为通配符(+
在 rhosts 样式文件中)被忽略。
答案1
在尝试使用特定私钥进行身份验证时,对允许的内容添加限制的典型方法是通过 ~/.ssh/authorized_keys
服务器上的文件 - 特别针对您的用例,能够配置/限制可以与该from="pattern-list"
选项一起使用特定密钥对的主机。
例如:
# ~/.ssh/.authorized_keys
from="10.80.0.0/14,192.168.1.2,hbruijns-workstation.internal.example.com" ssh-rsa AAAAB3NzaC1y***...***== hbruijn@serverfault
例如,仅允许使用匹配的私钥从hbruijns-workstation.internal.example.com
IP 地址192.168.1.2
和/或范围内的任何 IP 地址 登录10.80.0.0/14
。
作为进一步的改进,您可以将 ~/.ssh/.authorized_keys 置于服务器管理员的控制之下,以确保您的团队成员不会覆盖该限制。
正如我已经评论过并且您也已经提到的那样,当您的网络不支持实现依赖于受信任客户端的安全模型的先决条件时,这对您没有多大帮助:
- 您需要有一种可靠的方法来识别您值得信赖的客户。
当您的客户端没有分配固定的 IP 和/或主机名时,此方法将不起作用(但其他方法也不起作用)。
所以请求“仅授权从分配给每个团队成员的 PC 到服务器的 ssh 连接” 应拒绝或反击请求,例如为您的团队成员 PC 获取所需的静态 IP 地址分配,或者例如您的团队成员可以通过 VPN 连接到的管理网络。
答案2
解决您的问题的一种方法是使用 SSH 客户端配置文件(/etc/ssh/ssh_config
或~/.ssh/config
)中的 SendEnv 选项来发送包含要用于基于主机的身份验证的主机名的自定义环境变量。在服务器端,您可以使用AcceptEnv
SSH 守护程序配置文件 ( /etc/ssh/sshd_config
) 中的选项来接受此环境变量。
以下是如何执行此操作的示例:
在每台客户端计算机上,编辑 SSH 客户端配置文件 ( /etc/ssh/ssh_config or
~/.ssh/config
) 并添加以下行:
Host *
SendEnv MY_HOSTNAME
在每台客户端计算机上,将 MY_HOSTNAME 环境变量设置为所需的主机名。您可以通过将以下行添加到用户的 shell 配置文件(例如~/.bashrc
或~/.zshrc
)来完成此操作:
export MY_HOSTNAME=fooMachine.test.com
在服务器上,编辑 SSH 守护程序配置文件 ( /etc/ssh/sshd_config
) 并添加以下行:
AcceptEnv MY_HOSTNAME
在服务器上,重新启动 SSH 守护程序以应用更改。完成这些步骤后,当用户使用 SSH 连接到服务器时,MY_HOSTNAME
环境变量将被发送到服务器,并可用于基于主机的身份验证。