如何将 SSH 密钥限制为某些 IP 地址?

use*_*686 12 ssh

我希望能够使用一些 SSH 密钥从本地网络 (192.168.1.*) 登录到(可公开访问的)SSH 服务器,但我不希望该密钥可从本地网络外部使用。
我希望将其他一些密钥用于外部访问(两种情况下都是同一用户)。

在SSH中可以实现这样的事情吗?

Kus*_*nda 22

是的。

~/.ssh/authorized_keys服务器上的文件中,每个条目现在可能看起来像

ssh-ed25519 AAAAC3NzaC1lZSOMEKEYFINGERPRINT comment
Run Code Online (Sandbox Code Playgroud)

(或类似)

有一个可选的第一列可能包含选项。这些在sshd手册中有描述。

选项之一是

from="pattern-list"
Run Code Online (Sandbox Code Playgroud)

指定除了公钥认证之外,远程主机的规范名称或其 IP 地址必须出现在以逗号分隔的模式列表中。有关模式的更多信息,请参阅 ssh_config(5) 中的模式。

除了可以应用于主机名或地址的通配符匹配之外,来自节的可以使用 CIDR 地址/掩码表示法匹配 IP 地址。

此选项的目的是可选地增加安全性:公钥身份验证本身不信任网络或名称服务器或任何东西(但密钥);然而,如果有人以某种方式窃取了密钥,则该密钥允许入侵者从世界任何地方登录。这个附加选项使得使用被盗密钥更加困难(除了密钥之外,名称服务器和/或路由器还必须受到损害)。

这意味着您应该能够~/.ssh/authorized_keys

ssh-ed25519 AAAAC3NzaC1lZSOMEKEYFINGERPRINT comment
Run Code Online (Sandbox Code Playgroud)

from="pattern" ssh-ed25519 AAAAC3NzaC1lZSOMEKEYFINGERPRINT comment
Run Code Online (Sandbox Code Playgroud)

pattern与您连接的客户端主机匹配的模式在哪里,例如通过其公共 DNS 名称、IP 地址或某些网络块:

from="192.168.1.0/24" ssh-ed25519 AAAAC3NzaC1lZSOMEKEYFINGERPRINT comment
Run Code Online (Sandbox Code Playgroud)

(这将只允许从192.168.1.*网络中的主机使用此密钥)

  • @Mehrdad 请注意,从服务器的角度来看,“模式”需要与客户端匹配。像“192.168.1.*”这样的本地 IP 地址模式可能不起作用(除非服务器位于同一网络上)。 (2认同)

13d*_*tar 6

您可以通过在文件from="192.168.1.0/24"中的公钥前面添加来实现此目的.authorized_keys。整行应该如下所示:

from="192.168.1.0/24" ssh-rsa AAAA....
Run Code Online (Sandbox Code Playgroud)