如何批准特定计算机通过 ssh 连接到已禁用密码验证的机器?

如何批准特定计算机通过 ssh 连接到已禁用密码验证的机器?

中的说明help.ubuntu.com/community/SSH/OpenSSH/Configuring建议禁用密码验证,这样“只有您明确批准的计算机才可以连接”。但他们没有说明如何明确批准计算机。我该怎么做?

答案1

对于每个想要访问服务器的用户,请在终端中运行:

ssh-keygen
ssh-copy-id <username>@<serverIPorDNSname>

它会询问你将其保存在哪里,默认即可。它会要求你输入密码。这是为了在计算机被盗或被盗时加密密钥。如果你不想要密码,可以将两个密码提示留空。

第一个命令为当前运行该命令的用户创建一个 ssh 密钥。第二个命令 ssh 进入服务器并将当前用户的密钥添加到服务器的允许登录用户列表中。由于 ssh-copy-id 使用 ssh,因此您需要在禁用密码登录之前执行此操作。

SSH 密钥由两个匹配的部分组成。其中一半告诉所有人,另一半则保密。使用数学算法,可以使用公钥部分解密使用私钥加密的数据。如果使用公钥成功解密数据,则您毫无疑问知道是密钥的私钥部分对其进行了加密。因此,当您使用 ssh 密钥登录时,客户端会发送一条消息(使用私钥加密),基本上是说“让我进去”。服务器使用公钥进行检查,如果公钥在允许的计算机列表中,则登录成功。

ssh-copy-id 是(使用 ssh)将公钥的一半复制到允许登录的密钥的服务器列表中(此列表存储在 /home/<username>/.ssh/authorized_keys2 中,如果是 root 用户,则存储在 /root/.ssh/authorized_keys2 中)。如果您已经禁用密码验证,仍然可以添加计算机。您只需将公钥(位于客户端计算机上的 /home/username/.ssh/id_rsa.pub 中)复制到 USB 记忆棒之类的东西上,然后将 id_rsa.pub 的内容添加到服务器上的 /home/<username>/.ssh/authorized_keys2 文件的末尾。(您可以通过cat /media/USB/stick/path/to/id_rsa.pub >>/home/<username>/.ssh/authorized_keys2在服务器上运行类似命令来执行此操作。)

答案2

iptables 目录

如果计算机具有特定的 IP 范围,则可以使用 iptables 来控制访问。Iptables 是内核的一部分。您可以在文件中控制它们/etc/iptables

# from /etc/iptables
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
#
# loopback device
#
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
#
# all connections already established (started outgoing from my machine)
#
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# but SSH - restricted
#
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 --source 138.232.0.0/255.255.0.0 -j ACCEPT
#
# block all others (without answering - thus nobody is able to scan the network)
#
-A INPUT -p icmp --icmp-type echo-request -j DROP
-A RH-Firewall-1-INPUT -j DROP
COMMIT

有趣的是这一行:

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 --source 111.111.0.0/255.255.0.0 -j ACCEPT

Prot 22 是默认的 ssh 端口。如果与您的机器不同,请更改它。111.111.0.0/255.255.0.0 -j ACCEPT意味着它接受来自“111.111.foo.bar”的所有连接,其中“foo”和“bar”是任意 3 位数字。

相关内容