通过地址限制特定客户的SSH访问
1. 简介
手头有许多策略来保护我们服务器的管理服务。对特定于管理目的、管理 VPN、日志记录网关和源 IP 过滤的子网进行分段,仅举几例。
在本教程中,我们将讨论其中一些策略。更具体地说,如何通过 IP 地址限制对特定客户端的 SSH 访问。我们将讨论的一些技术对其他服务也很有用。
2. 行政服务注意事项
从安全角度来看,首要准则之一是禁用任何不必要的服务(查看这个非常有趣的NIST 指南 )。这意味着我们应该禁用任何不必要的、非必要的操作系统服务。
但是,系统运行和维护本身需要一些服务。在这种情况下,我们必须评估更窄的可能特权集。这样,我们将尝试将攻击面限制在最低限度。
行政服务由于其重要性,因此应格外小心,因为它们可用于对我们的业务造成非常严重的损害。
3. TCP 包装器
最早出现的阻止或启用服务访问的解决方案之一是 TCP 包装器。它从九十年代初就已经存在,它是最早的基于主机的 ACL(访问控制列表)之一。
它有两种主要的集成模式。这些应用程序可以与它的库libwrap0链接(默认安装在任何主要的 Linux 发行版中),或者它可以使用它的代理实用程序tcpd,它直接或通过一些网络超级服务器守护程序(如*xinetd *或inetd )。
尽管OpenSSH 服务器在 6.7 版 中失去了对 TCP Wrappers 的原生支持,但它仍然可以在许多传统的 Unix 机器上使用。在较新的 OpenSSH 版本中,仍然可以将其与xinetd超级服务器守护进程一起使用。
TCP Wrappers 的主要优点是配置简单。如果我们的版本支持它,我们可以通过调整两个文件来控制它的行为。要拒绝每个主机,我们在/etc/hosts.deny 文件中添加一个通配符:
/etc/hosts.deny
sshd : ALL
现在我们可以通过调整/etc/hosts.allow 文件来启用对特定主机的访问:
/etc/hosts.allow
sshd : 192.168.0.0/24
sshd : 127.0.0.1
sshd : [::1]
sshd : myhost.local.com
当然,如果我们使用不支持 TCP Wrappers 的 OpenSSH 版本(对于 2014 年之后安装或更新的任何系统,这是一个很好的猜测),这将不起作用。
4. 防火墙、IP 过滤器和 IP 表
阻止来自 IP 地址的 SSH 访问的更常用方法是使用 IP 过滤。同样,有两种方法。第一种是使用网络防火墙来保护对服务器的任何管理级别访问。下图显示了它是如何工作的:
正如我们所见,防火墙可以监控 ACL 规则并将其应用于流向它的任何网络流量。然而,这正是它的主要局限所在。如果攻击者找到不受防火墙控制的替代路径,则攻击可能会通过。在图中,虽然客户端 B 和 C 的访问由防火墙调节,但客户端 A 没有,因为它位于服务器的网络中。
这就是为什么应将保护设计为分层的原因。每个保护层一旦被破坏,都可以及时通知问题。通过这样做,细心的管理员可以在威胁造成真正损害之前采取应对措施。
网络防火墙是我们保护措施的重要组成部分——甚至是强制性的。但是,在主机上执行其更重要的规则是很常见的。为此,我们可以使用操作系统的 IP 过滤。例如,Linux 可以使用IP 表 :
iptables -A INPUT -p tcp --dport 22 --source 172.10.1.10 -j ACCEPT # Add SSH access to a single host
iptables -A INPUT -p tcp --dport 22 --source 192.168.1.0/24 -j ACCEPT # Add SSH access to a subnetwork
iptables -A INPUT -p tcp --dport 22 -j DROP # Drop all other sources
IPTables 非常强大。如果它的机器直接连接到两个或多个网络,它可以充当完整的网络防火墙。但它也可以负载平衡流量、重定向和重新映射目标地址和端口,以及模拟网络问题等等。
5. SSH 配置
除了上述选项外,我们可能还想对/etc/sshd_config 文件实施一些安全措施 。
有很多配置可以帮助我们在不同的使用场景中设置合适的安全性。当我们需要有一个 ssh 服务器对 Internet 开放时,最好使用更强的身份验证方法,例如公钥/私钥对。
SSH 守护程序本身可以使用公钥/私钥,以及可插入身份验证模块 (PAM) 系统允许的任何替代方案:Kerberos SSO、多种身份验证因素,包括一次性密码,等等。
最佳解决方案取决于具体的应用场景。除了身份验证之外,验证 SSH 服务器的其他安全配置也很有用。例如:
- 禁用 root 访问权限:PermitRootLogin 是/否
- 禁用隧道和转发:
PermitTunnel yes/no; AllowTcpForwarding yes/no; DisableForwarding; yes/no
- 使用 PAM:
UsePAM yes/no
- 禁用密码验证:PasswordAuthentication no
- 启用基于密钥的身份验证:AuthenticationMethods publickey
- 允许用户和组:AllowUsers / AllowGroups
- 拒绝用户和组:DenyUsers / DenyGroups
- Chroot 用户会话:ChrootDirectory chroot_path
使用 PAM 身份验证(所有主要发行版中的默认设置),我们可以创建许多不同的选项来限制对特定 IP 和用户的访问。**/etc/security/access.conf 文件可以根据 用户/地址对创建访问和拒绝规则,如下所示:
# Allows user foo and members for admins group from the console and the specified IPv6 address and IPv4 subnet
+ : @admins foo : LOCAL 2001:db8:0:101::/64 10.1.1.0/24
# Disallow console logins to all but the shutdown, sync and all other accounts, which are a member of the wheel group.
- : ALL EXCEPT (wheel) shutdown sync : LOCAL
# Block all other users from all other sources
- : ALL : ALL
6. 动态阻塞
**如果我们的防火墙支持阻止来自 IP 的持续尝试,我们必须启用它。**这样,来自同一 IP 的持续尝试将被列入黑名单并被隔离。我们还可以使用 IP Tables 或其他一些软件来获得相同的结果。
首先,为了限制持续的 SSH 尝试,我们可以使用这些 IP 表规则:
# Enable recent rules for incoming SSH
iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource -j ACCEPT
# Rate limit SSH connections 5 (--hitcound) attempts for each 60s (--seconds)
iptables -A INPUT -p tcp -m tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH --rsource -j LOG --log-prefix "SSH_BAN"
# Log the blocked attempts (optional)
iptables -A INPUT -p tcp -m tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH --rsource -j DROP
不幸的是,这种方法并没有只考虑不成功与否。无论如何,它都会阻止连接尝试。如果我们只想考虑失败的尝试,我们必须使用更精细的解决方案。
一种方法是编写一个脚本来持续监控 SSH 守护程序日志文件,并动态创建 IP 表规则,并在隔离期后将其删除。这种方法已经方便地包含在许多开源解决方案中,例如denyhosts 、 fail2ban 和sshguard 。
另一种方法是 PAM 自动黑名单模块*pam_abl *。该模块可以根据失败的身份验证尝试自动将用户和 IP 列入黑名单。一个亮点是,由于它是一个 PAM 模块,因此任何使用它的服务都可以使用它。在 Ubuntu 中,只需安装它:
# First install pam_abl
sudo apt-get install -y libpam-abl
在安装结束时,安装程序应将其添加到*/etc/pam.d/common_auth中的*PAM 堆栈配置 中:
# here are the per-package modules (the "Primary" block)
auth required pam_abl.so config=/etc/security/pam_abl.conf
配置文件*/etc/security/pam_abl.conf将具有用户 (user_rule) 和主机 (host_rule) 的隔离时间,作为各自的默认白名单(永远不会进入黑名单的用户或主机)。命令行实用程序pam_abl*将显示阻止列表的当前内容。它还可以添加或删除主机和用户:
# pam_abl
Failed users:
foo (15)
Blocked based on rule [*/sshd]
Failed hosts:
10.1.1.150 (15)
Not blocking