使用 iptables 进行基于 MAC 过滤的 SSH - 推荐吗?

使用 iptables 进行基于 MAC 过滤的 SSH - 推荐吗?

我在内部网络中有一台服务器(通过 VPN 登录),我从那里通过 SSH 使用 OpenSSH 公钥/私钥身份验证登录到服务器。从安全角度来看,我想通过iptables服务器绑定我的三个使用过的客户端的 MAC 地址,以便只有这些客户端可以使用它登录。

iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source xx:xx:xx:xx:xx:xx -j ACCEPT
iptables -A INPUT -p tcp --destination-port 22 -j DROP

但是,是否建议这样做?我可以使用哪些其他(更好的)方法将 SSH 登录绑定到所使用的客户端?

(如果有人想要请求 2FA,不幸的是 2FA 不可能作为潜在的解决方案。)

谢谢。

答案1

我假设您想要阻止您的 SSH 服务器接受来自不受信任的主机的连接,即使它们提供了有效的用户凭据。这样对吗?

将用户的公钥身份验证与选定的客户端主机联系起来的一种可能的解决方案是通过基于主机的身份验证。通过设置基于主机的身份验证并将AuthenticationMethods参数定义/etc/ssh/sshd_config为:

AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password

或者:

AuthenticationMethods hostbased,publickey

这将指示 SSH 守护进程请求客户端在检查用户密钥或密码之前对它们连接的主机进行身份验证。前一种选择允许基于密码的身份验证,而后者仅限于公钥。由于基于主机的身份验证基于密钥对,因此 SSH 服务器将能够使用动态 IP 地址对客户端进行身份验证。


以下是完整的说明。 SSH 如何执行基于主机的身份验证的文档写在ssh(1)手册页。请注意SSH如何识别用户并检查它是否适用于您的情况。

基于主机的身份验证的工作原理如下:如果用户登录的计算机在远程计算机中列出,/etc/hosts.equiv并且/etc/ssh/shosts.equiv双方用户名相同,或者如果文件~/.rhosts~/.shosts存在于远程计算机上的用户主目录中并且包含一行,其中包含客户端计算机的名称和该计算机上的用户的名称,该用户被视为登录。此外,服务器必须能够验证客户端的主机密钥才能允许登录。此身份验证方法可以弥补由于 IP 欺骗、DNS 欺骗和路由欺骗而导致的安全漏洞。 [管理员注意:/etc/hosts.equiv~/.rhosts和 rlogin/rsh 协议一般来说本质上是不安全的,如果需要安全性,应该禁用。]

要在 OpenSSH 中启用基于主机的身份验证:

# /etc/ssh/sshd_config

HostbasedAuthentication yes
IgnoreUserKnownHosts yes
IgnoreRhosts yes

# AuthenticationMethods hostbased,publickey hostbased,keyboard-interactive hostbased,password
AuthenticationMethods hostbased,publickey
  • HostbasedUsesNameFromPacketOnly yes要执行基于主机的身份验证,您可以通过设置来信任客户端提供的主机名信息/etc/ssh/sshd_config
# /etc/ssh/sshd_config

HostbasedUsesNameFromPacketOnly yes
  • 或者,您也可以配置 SSH 守护进程,通过使用存储在/etc/hosts网络 DNS 服务器的文件或 PTR 记录中的信息解析客户端的 IP 地址来识别主机名:
# /etc/ssh/sshd_config

HostbasedUsesNameFromPacketOnly no
UseDNS yes
# /etc/ssh/shosts.equiv

ssh-client-alpha
ssh-client-bravo
ssh-client-charlie
  • /etc/ssh/ssh_known_hosts列出文件中授权主机的公钥。一个方便的方法是通过ssh-keyscan
[root@ssh-server ~]# ssh-keyscan ssh-client-alpha >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-bravo >> /etc/ssh/ssh_known_hosts
[root@ssh-server ~]# ssh-keyscan ssh-client-charlie >> /etc/ssh/ssh_known_hosts

将 OpenSSH 服务器配置为接受基于主机的身份验证请求后,还必须将客户端配置为请求基于主机的身份验证:

# /etc/ssh/ssh_config

Host *
    HostbasedAuthentication yes
    EnableSSHKeySign yes
  • 确保 SUID/SGID 位ssh-keysign可执行文件授予对主机私钥文件的读取权限:
[root@ssh-client-alpha ~]# find /usr -name ssh-keysign -ls
 16517300    616 -r-xr-sr-x   1  root     ssh_keys   630344 Feb  4 16:01 /usr/libexec/openssh/ssh-keysign

[root@ssh-client-alpha ~]# ls -l /etc/ssh/ssh_host_*key
-rw-r----- 1 root ssh_keys  480 Apr 13 06:51 /etc/ssh/ssh_host_ecdsa_key
-rw-r----- 1 root ssh_keys  387 Apr 13 06:51 /etc/ssh/ssh_host_ed25519_key
-rw-r----- 1 root ssh_keys 2578 Apr 13 06:51 /etc/ssh/ssh_host_rsa_key

相关内容