如何使用端口碰撞从Ubuntu的攻击者隐藏您的SSH服务

介绍

根据定义,服务器被实现为提供服务和使得应用和资源对用户可访问的手段。然而,连接到互联网的任何计算机都不可避免地成为希望利用安全漏洞的恶意用户和脚本的目标。 存在防火墙,应该用于阻止服务未使用的端口上的访问,但仍然存在关于您想要访问但不想向所有人公开的服务的操作问题。你需要访问,当你需要它,但希望它被封锁否则。 端口碰撞是遮蔽您在计算机上运行的服务的一种方法。它允许防火墙保护您的服务,直到您通过特定的网络流量请求打开端口。 在本指南中,我们将讨论如何实现端口碰撞作为使用在Ubuntu 12.04 VPS妨碍了SSH服务的方法 knockd包。 注: 本教程介绍IPv4的安全性。 在Linux中,IPv6安全性与IPv4分开维护。 例如,“iptables”仅维护IPv4地址的防火墙规则,但它有一个称为“ip6tables”的IPv6对等体,可用于维护IPv6网络地址的防火墙规则。 如果您的VPS配置为IPv6,请记住使用相应的工具保护IPv4和IPv6网络接口。 有关IPv6工具的更多信息,请参阅本指南: 如何配置工具使用IPv6在Linux VPS

端口碰撞如何工作?

端口碰撞通过配置服务来监视防火墙日志或数据包捕获接口以进行连接尝试。如果进行了预定义连接尝试(或“碰撞”)的特定序列,则服务将修改防火墙规则以打开某个端口上的连接。 这允许您保持您的服务隐藏,直到您实际计划使用它们。这对于像HTTP服务器这样的实用不太实用,因为您希望在任何时候都可以使用连接。但它对于仅由已知的合法用户(如SSH)使用的服务非常有用。 虽然碰撞序列可以是任意复杂的,但它本身通常不是唯一的一组安全措施。通常,服务自身的安全和认证方法然后暴露给发出正确序列的用户。这样,端口碰撞增加了一个附加层,用户必须经过该层才能进行常规认证。 甚至更有帮助的是没有关于碰撞尝试的反馈。入侵者扫描将看到所有通常的端口关闭,如果他们尝试碰撞序列,将必须在每次尝试之间检查以查看端口是否被打开。这通常足以劝阻或禁止攻击者。 对于我们而言,我们将使用附带的Ubuntu 12.04的iptables防火墙,并安装一个名为守护进程 knockd提供端口碰撞的功能。

配置IPTables阻止大多数流量

在我们得到实际的端口碰撞之前,我们需要配置一个基本的防火墙。我们想锁定大多数东西。 默认情况下,Ubuntu自带了iptables。但是,没有默认规则,所以允许所有流量。设计自己的一套规则,你可以学习如何 设置使用iptables防火墙在这里。 为了我们的目的,我们将使用该指南中的大多数规则。 首先允许本地机器上的流量。这意味着接受服务器生成并发送给自己的流量。这允许服务彼此通话而不被阻止:
sudo iptables -A INPUT -i lo -j ACCEPT
这将一条规则附加到“INPUT”链。此链处理进入服务器的所有连接。此规则告诉iptables接受“lo”网络接口上的所有流量,这是用于内部通信的本地环回接口。 接下来,我们要确保允许所有已建立的连接和与已建立的连接相关的流量:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
此规则告诉iptables接受与已建立的连接相关联的流量。这是一个重要的,因为一旦我们开始阻止连接,我们不希望我们当前的SSH会话被切断。 接下来,您将需要允许持久的,世界性的服务。我的意思是,为需要总是运行和可见的服务添加规则。例如,如果您在标准端口80上提供了一个网站,则您希望始终允许该流量。 不要为我们将使用port knocker打开的服务添加规则到iptables。我们将使用knocking守护进程来动态修改我们的规则集。对于我们的教程,我们不会在我们的初始iptables配置中添加我们的SSH服务器。 使用此语法来建立自己的规则:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
在这一点上,我们只添加了接受连接的规则,而不是删除它们。我们仍然接受一切,我们刚刚明确了某些类型的流量。 现在,我们将删除我们没有特别允许的一切。添加此规则:
sudo iptables -A INPUT -j DROP
任何未被上述规则处理的流量将被丢弃。您可以通过键入以下内容查看您的规则:
sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
如您所见,我们仍然没有任何规则来接受新的SSH连接。 如果此时您的连接断开,您必须通过点击右上角的“控制台访问”按钮,通过控制面板访问您的服务器: 数字海洋控制台访问 这充当直接登录,不使用SSH,因此不会受您的规则影响。 一旦你建立你的iptables规则,使他们执着与 iptables-persistent 。通过键入以下内容安装:
sudo apt-get install iptables-persistent
然后,通过键入以下内容启动服务:
sudo service iptables-persistent start

安装Knockd服务

我们将使用端口碰撞感知的服务被称为 knockd 。我们可以通过简单的输入:
sudo apt-get install knockd
这将安装该实用程序,但不会默认启动服务。 这是一个安全预防措施,以防止守护程序立即阻止重要的流量。您必须配置并显式启用此服务。

配置碰撞以使用端口碰撞

要配置服务,我们将必须编辑配置文件。使用root权限打开此文件:
sudo nano /etc/knockd.conf
您应该看到如下所示的文件:
[options]
        UseSyslog

[openSSH]
        sequence    = 7000,8000,9000
        seq_timeout = 5
        command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn

[closeSSH]
        sequence    = 9000,8000,7000
        seq_timeout = 5
        command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
        tcpflags    = syn
立即,你应该能够看到一些关于knockd如何工作的重要信息。你也应该开始意识到配置不是太复杂。 在“选项”部分中,我们看到一个名为指令 UseSyslog 。 这告诉knockd它应该使用正常的syslog方法记录其信息。 这将插入到记录 /var/log/messages 。 如果要指定其他日志文件,可以改用以下选项:
LogFile = /path/to/log/file
在下面,我们有两个部分。这些节的名称可以是任何东西。它们用于分组一组将与每个事件匹配的规则。 例如,在我们的文件中,我们有一个部分将打开我们的SSH端口,并且一个将再次关闭它。 设置碰撞模式的参数如下:
sequence    = 7000,8000,9000
这意味着如果相同的IP请求在端口7000上的连接,则直接由端口8000,随后是端口9000,这套规则将匹配。 此集合中的另外两个参数还控制活动是否匹配:
seq_timeout = 5
tcpflags = syn
第一个选项指定序列必须在其中完成的时间量。 第二个指定一个必须存在于tcp数据包中的标志,以便它们被认为是有效的。该值 syn ,我们在这里看到常用来区分,我们从那些像SSH的程序在后台创建所需的数据包。 最后,我们看到命令:
command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
您应该将此识别为iptables规则。由于节标签“openSSH”指出,当命中正确的序列时,此部分将打开用于SSH连接的端口。 但是,如果你是iptables的配置过程中注意,你会看到,这种新规则使用 -A选项这一规则 追加到INPUT链的末端。这将在规则之后放置此规则以删除所有剩余的连接。 要解决这种情况,我们需要修改此命令。与规则替换命令在列表的顶部 插入新的规则。 我们通过这样做 -I选项,并引用位置规则1:
command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
通过此更改,新规则将添加到INPUT链的顶部,以接受来自碰撞的用户的SSH连接。的 %IP%的规则的部分将由取得的可接受爆震的IP地址来代替。 第二个SSH部分执行几乎相同的事情,但它使用不同的顺序,并删除打开到SSH的连接的iptables的规则。我们可以按照这个顺序来弥合我们打开的差距。 在实践中,您应该总是将这两个部分的序列更改为基本随机的序列。保持默认序列有效地删除端口碰撞建立的任何安全性。 在我们进一步配置任何内容之前,让我们测试一下我们当前的设置。保存并关闭文件。

实现Knockd服务

现在我们已经配置了knockd有一个有效的规则集,我们可以通过实现我们的守护进程来测试它。请记住,虽然配置是有效的,但在这一点上,它是不安全的,除非您更改了每个碰撞节的端口序列。 我们需要通过编辑另一个文件来启用服务。使用root权限打开此文件:
sudo nano /etc/default/knockd
我们需要改变 START_KNOCKD选项以启动服务为“1”:
START_KNOCKD=1
保存并关闭文件。 现在,我们可以通过键入以下内容启动服务:
sudo service knockd start
这将启动守护程序,并允许您通过碰撞端口序列来更改iptables规则集。

端口碰撞测试

我们现在应该测试我们通过使用我们配置的端口碰撞序列来修改iptables规则的能力。 在一个 的终端窗口,我们可以使用工具来请求这些端口。最好是保持你的其他会话打开,以防万一有问题。再次,如果你不小心把自己锁在外面,使用控制面板中Droplet页面右上角的“控制台访问”按钮。 我们可以使用各种不同的工具碰撞。一些流行的选择是 netcatnmap ,以及专门设计的客户端调用,适当的, knock 。 我们将使用 nmap在这个例子中,因为它是在默认情况下在大多数Linux发行版和OS X.安装 在我们碰撞之前,让我们确认我们的SSH端口,事实上,目前关闭。键入通常用于连接到服务器的命令:
ssh root@server_ip_address
sh: connect to host server_ip_address port 22: Operation timed out
您应该没有从服务器收到响应,并且SSH客户端应该超时。这是因为我们的SSH守护程序当前被iptables阻止。如果没有自动超时,请键入ctrl-C以结束SSH尝试 由于设置的序列超时参数,我们实际上具有非常有限的时间来命中正确的序列。我们将使用一个小的,在线的bash脚本迅速碰撞这些端口。 从本地计算机,键入如下命令:
for x in 7000 8000 9000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x server_ip_address; done
在命令中,将三个数字调整为您为序列选择的数字以打开SSH端口。更改服务器 的IP地址,以反映您服务器的地址。 这将在列出的所有端口上顺序调用nmap。 一旦完成,您应该能够定期登录SSH:
ssh root@server_ip_address
我们可以通过碰撞我们配置的其他序列重新关闭端口:
for x in 9000 8000 7000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x server_ip_address; done

端口碰撞Knock实用程序

更简单的碰撞的方法是使用的 knock是由的制造商提供的实用 knockd 。这包含在knockd包中,因此您可以像在服务器上一样将它安装在我们的客户端计算机上:
sudo apt-get install knockd
您也可以从磕客户 项目的网站的“下载”部分。有可用的本机OS X和Windows客户端(甚至iOS和Android客户端)。 一旦你安装了knock客户端,你可以通过使用这种语法轻松地执行一个序列:
knock server_ip_address sequence
因此,对于我们的示例,您可以通过键入以下命令来打开SSH端口:
knock server_ip_address 7000 8000 9000
这比所提到的其他方法快得多。 我们可以通过键入以下命令关闭端口:
knock server_ip_address 9000 8000 7000

配置Knockd以自动关闭连接

现在我们已经确定我们的端口碰撞守护进程正常工作,让我们更改一些配置细节以更加健壮。 再次打开配置文件:
sudo nano /etc/knockd.conf
我们将利用knockd的能力建立一个命令超时,以便将我们的SSH匹配压缩为一个规则。这意味着我们不必记得碰撞我们完成后关闭SSH端口。 我们可以注释掉或删除“openSSH”和“closeSSH”部分。我们将用一个单独的部分替换它们,我们将简单地称为“SSH”:
[options]
    UseSyslog

[SSH]
在这个新的部分,我们将建立一个序列,tcpflags和序列超时,就像我们在其他部分。我们还将包括我们用于打开SSH端口的命令:
[options]
    UseSyslog

[SSH]
    sequence = 5438,3428,3280,4479
    tcpflags = syn
    seq_timeout = 15
    start_command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
选择唯一的端口序列。正如你可以看到,在这个例子中,我们使用四个端口。只要他们都可以在指定的时限碰撞我们可以增加端口数量 seq_timeout参数。 该 start_command参数是相同的 command在其他实施例中使用的参数。我们选择使用这个变体只是为了更详细地说明我们正在做什么。 在这之后,我们将添加一些新的参数,将帮助我们关闭端口:
[options]
    UseSyslog

[SSH]
    sequence = 5438,3428,3280,4479
    tcpflags = syn
    seq_timeout = 15
    start_command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
    cmd_timeout = 10
    stop_command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
cmd_timeout是那knockd执行包含在命令前将等待的秒数 stop_command变量。 结果是,当使用正确的序列时,守护程序将打开SSH端口。然后它将等待10秒钟,然后再次关闭端口。 保存并关闭文件。 通过重新启动守护程序来实现新规则:
sudo service knockd restart
我们可以使用此端口碰撞规则在指定的时间内轻松连接。例如,我们可以使用此命令轻松地连接到我们的服务器:
knock server_ip_address 5438 3428 3280 4479 && ssh root@server_ip_address
我们在防火墙中创建的洞将在10秒后关闭。

结论

虽然有时通过晦涩(隐藏服务而不是实际上确保安全)在蔑视的语调中讨论端口碰撞,但是它是添加额外的针对随机攻击的保护层的好方法。 您应始终使用可用的最佳结果的本地工具来保护您的服务。然而,在这些方法之前添加类似端口碰撞方案可以大大减少您的服务遇到的暴力攻击或入侵企图的次数。
作者:Justin Ellingwood
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏