金钱(警告)
** 状态:** 被贬值
如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议升级或迁移到支持的 Ubuntu 版本:
** 原因:** Ubuntu 12.04 已于 2017 年 4 月 28 日到期(EOL)并且不再收到安全补丁或更新。
** 相反,请参阅:** 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本撰写的指南。
介绍
服务器,根据定义,是作为提供服务和使应用程序和资源可访问的手段实施的,但是,任何连接到互联网的计算机都不可避免地受到恶意用户和脚本的攻击,希望利用安全漏洞。
防火墙存在,应该用来阻止服务不使用的端口的访问,但仍然存在关于您想要访问的服务该做什么的问题,但不想暴露给所有人。
端口敲击是掩盖你在机器上运行的服务的一种方法,它允许你的防火墙保护你的服务,直到你要求通过特定网络流量序列打开一个端口。
在本指南中,我们将讨论如何将端口敲击作为使用knockd
包在Ubuntu 12.04 VPS上隐藏您的SSH大卫的方法。
注: _本教程涵盖IPv4安全. 在Linux中,IPv6安全是与IPv4分开维护的。例如,iptables
只维护IPv4地址的防火墙规则,但它有一个名为ip6tables
的IPv6对应,可以用来维护IPv6网络地址的防火墙规则。
如果您的 VPS 已配置为 IPv6,请记住用相应的工具保护您的 IPv4 和 IPv6 网络接口。 有关 IPv6 工具的更多信息,请参阅本指南: 如何在 Linux VPS 上配置工具使用 IPv6 _
港口打击是如何工作的?
端口敲击通过配置服务来监控防火墙日志或数据包捕获接口进行连接尝试。如果进行特定序列的预定义连接尝试(或敲击
),该服务将修改防火墙规则以打开特定端口上的连接。
这允许你隐藏你的服务,直到你实际上计划使用它们. 这对于像HTTP服务器这样的东西是不实用的,因为你希望连接随时可用。
虽然打击序列可能具有任意的复杂性,但它本身通常不是唯一的一组安全措施,通常服务的安全和身份验证方法会暴露给发出正确的序列的用户。
更有帮助的是,没有对敲击尝试的反馈。入侵者扫描会看到所有常见的端口关闭,如果他们尝试敲击序列,就必须在每个尝试之间检查是否打开一个端口。
为了我们的目的,我们将使用带有Ubuntu 12.04的iptables防火墙,并安装一个名为knockd
的戴蒙来提供端口敲击功能。
配置 IPTables 以阻止大多数流量
在我们到达实际的端口敲击之前,我们需要配置一个基本的防火墙,我们想要锁定大多数东西。
默认情况下,Ubuntu配备了安装的iptables,但是没有默认规则,所以所有的流量都被允许。 为了设计自己的规则,您可以在这里学习如何设置IPtables的防火墙(https://www.digitalocean.com/community/articles/how-to-set-up-a-firewall-using-ip-tables-on-ubuntu-12-04)。
对于我们的目的,我们将使用该指南中的大多数规则。
首先,允许在本地机器上的流量,这意味着接受服务器生成并发送给自己的流量,这允许服务在不被阻止的情况下彼此交谈:
1sudo iptables -A INPUT -i lo -j ACCEPT
此规则附加了一个规则到INPUT
链中,该链处理进入服务器的所有连接,该规则告诉iptables在lo
网络接口上接受所有流量,这是用于内部通信的本地循环接口。
接下来,我们要确保通过键入允许所有已建立的连接和与已建立的连接相关的流量:
1sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
这个规则告诉iptables接受与已经建立的连接相关的流量,这是一个重要的规则,因为一旦我们开始阻止连接,我们不希望我们的当前SSH会话被切断。
接下来,您将想要允许持久的,世界消费的服务. 我的意思是,为需要始终运行和可见的服务添加规则. 例如,如果您有一个网站在标准端口80上提供服务,您想要允许此类流量。
不要将规则添加到我们将使用端口敲击器打开的服务的iptables中,我们会使用敲击的daemon来动态修改我们的规则集,对于我们的教程,我们不会在我们的初始iptables配置中添加我们的SSH服务器。
使用此语法来建立自己的规则:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
在这一点上,我们只增加了接受连接的规则,而不是放弃它们,我们仍然接受一切,我们只是明确了某些类型的流量。
现在,我们将放弃我们没有特别允许的一切。
1sudo iptables -A INPUT -j DROP
未经上述规则处理的任何流量将被删除,您可以通过键入查看您的规则:
1sudo iptables -S
1-P INPUT ACCEPT
2-P FORWARD ACCEPT
3-P OUTPUT ACCEPT
4-A INPUT -i lo -j ACCEPT
5-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
6-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
7-A INPUT -j DROP
正如您所看到的,我们仍然没有接受新的SSH连接的规则。
如果您的连接在这一点上丢失了,您将需要通过右上角的控制台访问
按钮来访问您的服务器:
这是一种直接登录,不使用SSH,因此不会受到您的规则的影响。
一旦你建立了你的iptables规则,使其持久使用iptables-persistent
。
1sudo apt-get install iptables-persistent
接下来,通过键入开始服务:
1sudo service iptables-persistent start
安装 Knockd 服务
我们将使用的端口点击意识服务称为knockd
。我们可以通过简单的键入来安装它:
1sudo apt-get install knockd
这将安装实用程序,但不会默认地启动服务。
这是一个安全预防措施,以防止大卫立即阻止重要流量,您必须配置并明确启用此服务。
设置 Knockd 以使用端口敲击
要配置服务,我们将不得不编辑配置文件。
1sudo nano /etc/knockd.conf
你应该看到一个看起来像这样的文件:
1[options]
2 UseSyslog
3
4[openSSH]
5 sequence = 7000,8000,9000
6 seq_timeout = 5
7 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
8 tcpflags = syn
9
10[closeSSH]
11 sequence = 9000,8000,7000
12 seq_timeout = 5
13 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
14 tcpflags = syn
立即,您应该能够看到有关 knockd 如何工作的一些重要信息,您也应该开始意识到配置并不太复杂。
在选项
部分中,我们看到一个名为UseSyslog
的指令,这告诉knockd它应该使用正常的 syslog 方法记录其信息,这将将日志插入到/var/log/messages
。
如果您想指定不同的日志文件,您可以使用此选项来做到这一点:
LogFile = /path/to/log/file
下面,我们有两个部分. 这些部分的名称可以是任何东西. 它们被用来组合一组规则,将匹配一个单一的事件。
例如,在我们的文件中,我们有一个会打开我们的SSH端口的部分,一个会再次关闭它。
设置敲击模式的参数在这里:
sequence = 7000,8000,9000
这意味着,如果相同的 IP 要求在端口 7000 上连接,则此规则将匹配,接着是直接的端口 8000,接着是端口 9000。
本集中的另外两个参数还控制了活动是否匹配:
1seq_timeout = 5
2tcpflags = syn
第一个选项指定了序列必须完成的时间。
第二个指定了一个旗帜,必须存在于tcp包,以便它们被认为是有效的.我们在这里看到的syn
的值通常用于区分我们想要的包与由SSH等程序创建的背景。
最后,我们看到命令:
1command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
正如部分标签openSSH
所指出的那样,当正确的序列被击中时,本节将打开 SSH 连接的端口。
但是,如果你在 iptables 配置过程中注意,你会看到这个新规则使用-A
选项将这个规则附加到 INPUT 链的尽头。
要解决这种情况,我们需要修改这个命令. 用一个规则代替命令 insert 列表顶部的新规则. 我们通过使用 -I
选项并将位置引用为规则 1:
1command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
通过此更改,将新规则添加到INPUT链的顶部,以接受点击的用户的SSH连接。
第二个SSH部分几乎做同样的事情,但它使用了不同的序列,并从打开连接到SSH的iptables中删除规则。
在实践中,您应该始终将这两个部分的序列更改为基本上是随机的东西,保持默认序列有效地删除端口敲击建立的任何安全性。
在我们进一步配置之前,让我们测试我们的当前设置. 保存和关闭文件。
使用 Knockd 服务
现在我们已经配置了 knockd 以具有有效的规则集,我们可以通过实施我们的daemon来测试它. 请记住,尽管配置是有效的,但在这一点上,除非您更改每个按钮部分的端口序列,否则它是不安全的。
我们需要通过编辑另一个文件来启用该服务。
1sudo nano /etc/default/knockd
我们需要将START_KNOCKD
选项更改为1
,以便启动服务:
START_KNOCKD=1
保存并关闭文件。
现在,我们可以通过键入开始服务:
1sudo service knockd start
这将启动 DAEMON,并允许您通过点击端口序列来更改 iptables 规则集。
港口打击测试
我们现在应该通过我们配置的端口敲击序列来测试我们修改 iptables 规则的能力。
在一个 新终端窗口中,我们可以使用工具来请求这些端口. 如果出现问题,最好保持另一个会话打开。
我们可以使用各种不同的工具来敲击,一些流行的选择是netcat
,nmap
,以及一个专门设计的客户端,适当地称为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阻止。
由于设置了序列时间的参数,我们实际上有非常有限的时间来击中正确的序列,我们将使用一个小型,线性 bash 脚本快速击中这些端口。
从本地机器中,输入这样的命令:
for x in 7000 8000 9000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x server_ip_address; done
在命令中,将三个数字调整为您选择的序列数字,以打开 SSH 端口. 更改 server_ip_address 以反映服务器的地址。
这将在您列出的所有端口上连续调用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 Utility的端口敲击
更简单的方法是使用由knockd
的制造商提供的knockd
实用程序,这是在knockd包中包含的,所以您可以像我们在服务器上一样在我们的客户机上安装它:
1sudo 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 配置为自动关闭连接
现在我们已经确定了我们的端口打击大门正在正常运作,让我们改变一些配置细节,以便更坚固。
再次打开配置文件:
1sudo nano /etc/knockd.conf
我们将利用knockd的能力来建立命令时间,以便将我们的SSH匹配量化为一个规则,这意味着我们完成后不必记得敲门关闭SSH端口。
我们可以评论或删除openSSH
和closeSSH
的部分,我们将用单个部分取代它们,我们将简单地称之为SSH
:
1[options]
2 UseSyslog
3
4[SSH]
在这个新部分中,我们将建立一个序列, tcpflags 和序列时间,就像我们在其他部分中一样。
[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秒,然后再次关闭端口。
保存并关闭文件。
通过重新启动 DAEMON 来执行您的新规则:
1sudo service knockd restart
我们可以使用这个端口敲击规则在指定时间内轻松连接,例如,我们可以使用这个命令轻松连接到我们的服务器:
knock server_ip_address 5438 3428 3280 4479 && ssh root@server_ip_address
我们在防火墙中创建的洞将在10秒内关闭。
结论
虽然港口敲击有时被称为隐藏的安全(隐藏服务而不是实际保护它),但这是一个很好的方式来增加一个额外的保护层,防止随机攻击。
然而,在这些方法面前添加某种类似的端口敲击计划可以大大减少您的服务经历的暴力攻击或入侵尝试的数量。