按名称(而非 IP)限制对特定客户端的 SSH 访问

按名称(而非 IP)限制对特定客户端的 SSH 访问

我最近将我的一台服务器迁移到了 RHEL8 同等版本,这意味着 (i) 留下 tcp_wrappers(因为 openssh 不再针对 libwrap 进行编译),(ii) 不再能够轻松灵活地简单地调整hosts.deny和hosts.allow ,以及 (iii) 开始与防火墙之类的东西搏斗。

然而,对于这个特定的盒子,安全要求非常简单:

  1. 让 sshd 侦听备用端口(例如 1234)。

  2. 有 2 个“远程”用户(服务器上的用户 ID 为“fred”和“barney”)。

  3. 用户“fred”居住在阳光明媚的加利福尼亚州,并使用 ISP,他的 IP 是在每个连接上动态分配的。 “巴尼”住在潮湿的德克萨斯州——同样的 DHCP 故事。

  4. 他们的 ISP 会以一定的频率改变 IP 块,因此我通常在 Hosts.allow 文件中使用带有通配符的 ISP 名称。例如

    sshd : .calif.isp.net : ALLOW
    sshd : .texas.isp.com : ALLOW
    

(分别代表“fred”和“barney”)。

  1. 似乎很难 - >不可能在firewalld中按名称进行过滤,但是......我相当确定我可以(理论上)调整 sshd_config 来处理这类事情。

理论上......但我不确定如何调整 sshd 配置文件来做到这一点。我已经设置了允许用户限制我自己(例如,“wilma”,使用来自佛蒙特州的 ISP - .vermont.com)、“fred”和“barney”

 AllowUsers wilma fred barney

但这只是一层洋葱。我们使用密码验证,所以我的猜测(我希望有人能够确认或纠正)是(i)首先关闭密码身份验证,

 PasswordAuthentication no

然后 (ii) 将以下内容添加到 sshd 配置文件的底部:

 Match Address *.calif.isp.net, *.texas.isp.com, *.vermont.com
   PasswordAuthentication yes

这(即使是远程)正确吗?而且,如果正确的话,是否有更有效的方法来列出匹配的地址?在我的示例中,只有 3 个,但假设我有 300 个,而不是 3 个。有没有办法将所有这些地址放在某个“块”中(称之为“友好”),然后简单地使用类似

 Match Address friendly
   PasswordAuthentication yes

提前谢谢了。

答案1

您的假设是正确的

PasswordAuthentication no

Match Address *.calif.isp.net, *.texas.isp.com, *.vermont.com
  PasswordAuthentication yes

没有这个概念,不过,所以这是一个friendly

但考虑到这个规模(300 个 ISP?公路战士?),您可能会开始考虑使用 2FA 或类似方式设置 VPN,并强制 ssh 通过它,并在 ssh 配置上更加放松。

相关内容