什么是端口敲门以及如何在Linux中进行配置
任何机构都可以在公开服务器上实现的基本最低安全要求是基于源地址的,有时也称为基于主机的安全性。
就是让我们指定的主机或者地址获得访问权限,并阻止其余的访问权限。
攻击者甚至可以通过欺骗源IP地址来攻击基于源地址的防火墙(这会使请求在服务器上显示为允许的源列表之一)。
但是,如果我们希望从世界任何地方访问公用服务器,则这种情况将变得难以实施。
原因是我们不能简单地继续对远程登录SSH端口执行“允许所有地址”操作。
对所有源地址打开像SSH这样的端口,可能会使服务器遭受暴力攻击。
尽管攻击者进行的这种蛮力攻击尝试可能需要花费一些时间才能成功,但是我已经看到这种尝试在运行数周的服务器上进行。
在我见过的一种情况下,我使用的一种架构中的监视服务器正在发出SSH警报。
乍一看,令人困惑的是,警报不太一致,换句话说,警报一直在扑朔迷离。
主要问题是在警报期间,服务器停止响应基本的ssh连接请求(我无法访问服务器)。
警报停止后,我便能够访问服务器,并且令我惊讶的是,我能够从太多的随机源地址中看到许多“登录失败”的尝试。
很明显,这些请求是由某些攻击者运行的一些自动化脚本创建的。
有趣的事实是,一旦我们阻止了源,他们便更改了源,并再次开始了相同的请求模式。
问题是SSH守护程序受到太多请求的攻击,无法处理任何进一步的合法请求。
我要告诉上面的示例的唯一目的是表明以下事实:用暴力手段进行此类登录尝试在当今已经很普遍了。
而且,我们始终需要仔细检查架构上的安全措施。
安全服务器是没有互联网连接的服务器。
或者一台没有网络接口卡的机器被物理锁定。
我怀疑这是否真的安全。
必须使用某种方法,我们可以使用这种方法来保护服务器,以确保没有主体或者不允许源地址访问登录端口。
我们可能会想,如果继续阻止所有源地址0.0.0.0/0,我们自己将如何获得访问权限?
有一种方法可以使用这种方法来达到这种安全级别。
我们将在本教程中对此进行讨论。
我们将首先讨论这种安全性如何工作的一些基础知识,然后在本教程的后面部分,我们将介绍在Linux机器上进行配置的方法。
我们将在本文中讨论的安全主题称为“端口敲门”:一种根据意愿动态打开端口的方法(默认情况下,通过提供某种基于模式的身份验证,所有源地址均已关闭)
名称应说明其真实含义。
它是一种用于向一组封闭端口发送请求模式的方法,该模式的实习生将在服务器上触发事件(触发的事件是我们将执行的必需命令)。
这是我能给最简单的端口敲门定义。
因此,此安全机制背后的想法仅是为服务器提供一种模式,该模式将是随机模式。
现在,正如我之前所说,我们将在服务器上关闭所有网络端口。
更确切地说,我们将在服务器上配置防火墙,默认情况下,它将阻止对所有端口的所有请求。
所有现代软件防火墙都能够根据许多参数阻止请求。
其中一些是网络端口,源端口,流量请求的类型,源IP地址等。
因此,即使我们已将防火墙配置为阻止所有请求,防火墙仍然知道其收到的请求的类型(这就是防火墙的原因能够根据配置的参数阻止请求。
)
端口号范围以1开头,以65535大号结束。
这是一个大数字。
防火墙知道请求是从源地址1.1.1.1到目标端口22的,并且在接收到请求时,它会查看用户定义的规则以对该请求采取操作。
因此,最重要的是,对服务器发出的所有请求都可以由防火墙监视。
监视请求的更好方法是借助数据包捕获工具来分析整个网络流量。
因此,第二个底线是一个数据包捕获工具,它也能够知道请求的类型和种类。
最后要对此进行说明。
无论服务是否在运行,操作系统都会知道它在接口上收到的所有网络请求,它将响应该请求(即使我们在端口22上没有运行SSH守护程序,操作系统仍然会就会知道我们是否将请求发送到端口22)。
内核配置为在接收到每个网络请求时触发中断。
中断是内核使用的一种机制,用于引起CPU的注意来处理它收到的请求。
因此,此安全性的思想是将一系列基于模式的请求发送到多个关闭的端口(这就是所谓的敲门的原因。
),另一个守护程序将监视此请求发送模式,这将触发操作如果请求的模式正确,则由用户定义。
为了进一步简化,让我们以一个系统工程师为例,该系统工程师希望通过SSH获得对远程服务器的远程访问。
管理员将在服务器上具有脚本/守护程序,该脚本/守护程序将监视服务器收到的请求。
现在,系统工程师已预先根据请求模式将服务器配置为触发事件。
如果假设他配置的模式是敲击端口3000、4000、5000。
因此,现在,如果该系统工程师以任意定义的精确模式(3000,4000,5000)从任意位置向这些端口系列发送连接请求,他就可以触发他先前在服务器上配置的事件。
因此,他可以要求服务器打开端口22作为其源地址(他是从中打开端口的)。
是不是太神奇了。
考虑到服务器上可用端口的总数(1-65535),这是一个好主意。
管理员可以配置随机端口号以用作模式身份验证。
但是,有些人可能会争辩说,即使通过蛮力尝试也会损害这种安全性。
但是,如果我们想象要对这种安全性进行蛮力尝试,则攻击者必须首先尝试进行端口组合,然后立即启动端口扫描,以检查触发了什么事件(或者现在打开了哪个端口,以确认模式的成功突破)。
他必须对每个模式进行此操作(首先尝试一个模式,然后扫描ports)。
但是,如果管理员使用4端口模式,则攻击者必须经过65535才能进行4次尝试。
因此,在启用端口敲除的服务器上进行暴力破解也变得相当艰巨。
如果使用更多数量的端口来制作图案,情况将变得更糟。
批评端口安全的批评家认为,可以避免撞墙。
我们将在本文的后面部分对此进行研究。
一旦完成任务,管理员就可以关闭端口。
当以端口敲门的形式发送另一种模式时,关闭端口也不过是服务器触发的另一个事件。
让我们看看如何在Linux中配置此端口敲门,然后我们将讨论批评者提出的更多详细信息和关注点。
我们将在Ubuntu Linux系统中看到Port Knocking的配置。
该配置几乎可以自我解释,并且在大多数发行版中都类似。
如何在Linux中配置端口敲门?
ubuntu存储库中免费提供了适用于Linux的端口终止服务器软件包。
可以使用简单的apt-get命令轻松安装它。
但是,如果我们拥有的其他发行版具有不同的软件包管理器,则需要下载该特定版本的软件包。
否则,从源代码进行安装总是更好。
源码包链接如下。
Knockd源码包
我们也可以从下面的链接中找到基于RPM的软件包的列表。
Knockd RPM软件包
因此,让我们继续并将此端口终止服务器安装在我们的ubuntu机器上。
root@ubuntu-dev:~# apt-get install knockd
上面的命令将在计算机上安装称为“ knockd”的端口断开程序包。
如果仔细查看apt-get命令的最终输出,将会看到类似以下的内容。
* knockd disabled: not starting. To enable it edit /etc/default/knockd
现在,上面的消息表明,默认情况下,knocked是禁用的,我们需要修改/etc/default/knockd中的配置以启动它。
准备好配置后,我们将执行此操作。
我们将要做的是首先配置基于身份验证的端口模式。
现在,我们已经安装了敲除的软件包,我们可以继续,并通过添加默认防火墙规则来禁用到该服务器的所有流量。
此防火墙规则将拒绝所有流向所有端口的流量,包括ICMP。
简而言之,服务器将不响应它收到的任何请求。
root@ubuntu-dev:~# iptables -P INPUT DROP
如前所述,以上iptable规则将丢弃所有传入流量,而与协议无关。
现在,让我们继续编辑已敲除的配置文件,最后,我们将启用敲除服务。
Knockd配置在Linux中非常简单直接。
它提到了一系列端口,客户端试图获得访问权时会将该端口关闭。
如果模式正确,则敲除服务将运行我们在配置文件中提到的命令。
让我们看一下敲除的示例配置,它将在防火墙上添加一个iptable规则,该规则允许ssh从用于敲除的源地址连接到服务器。
让我们看看默认情况下此已敲除的配置文件中包含什么。
文件位置是/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
首先,让我们了解配置文件中每个选项及其参数所指定的内容。
选项:此字段包含已终止服务的配置选项。
上面显示的默认配置文件中提供了一个示例选项。
它告诉使用syslog进行日志记录。
如果要将重定向到的日志消息重定向到syslog以外的其他位置,也可以指定自己的日志文件。
可以通过指定类似以下所示的内容来完成。
logfile = /var/log/knockd.log
OpenSSH:它只是给我们所需的配置一个名称而已,它会根据敲击触发一些动作。
这仅用于根据客户的不同敲门声来区分不同的动作。
顺序:这本身就是自我解释。
它按照我们希望的顺序告诉端口顺序,客户端可以将其用作模式来触发操作。
序列超时:它分配给客户端以完成所需的端口终止序列的总时间。
命令:如果客户端敲除的端口顺序正确,那么将执行的命令就是什么。
在此处添加允许规则,以允许我们在防火墙中使用我们感兴趣的特定服务或者端口(默认情况下,它将阻止所有流量)
TCP标志:这是必须在客户端发出的敲门上设置的标志。
如果在服务器上接收到带有正确模式的敲门声,但是该标志不正确,则该操作将不会触发。
当然,登录服务器的管理员还必须能够在完成任务后关闭SSH端口。
因此,存在用于关闭端口的另一种敲击配置。
管理员可以注销服务器,并将敲除的请求发送到提到的一系列端口,以关闭由先前方法打开的SSH端口。
因此,客户端必须发送服务器要查找的确切tcp标志。
现在,让我们继续以所需的端口号顺序更改配置,然后启用该服务。
我们在敲除的配置中找到的默认配置可以很好地为SSH启用端口敲除。
我永远不建议将端口序列取为3000、4000和5000之类的整数。
采用随机序列的端口总是比较好,这很难猜测。
攻击者可以轻松尝试尝试默认系列的端口,例如7000、8000、9000。
但是,我们仅在显示此图时出于简化的目的而使用端口3000、4000、5000。
因此,我们的最终配置将如下所示。
[options] UseSyslog [openSSH] sequence = 3000,4000,5000 seq_timeout = 5 command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn [closeSSH] sequence = 5000,4000,3000 seq_timeout = 5 command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT tcpflags = syn
现在,让我们继续并启用已终止的服务,以便它将开始。
/etc/default/knockd文件将包含以下内容。
START_KNOCKD=1 # command line options KNOCKD_OPTS="-i eth0"
上面的kicked_opts选项启用该指定接口的敲门操作。
现在,让我们继续,如下所示启动已终止的服务。
root@ubuntu-dev:~# /etc/init.d/knockd start * Starting Port-knock daemon knockd [ OK ]
现在,通过发送将SYN标志设置为端口3000,4000,5000的特征码请求,来测试被删除服务器的这种配置。
如何向服务器发送端口敲门请求?
可以使用在安装敲门程序时获得的客户端命令行工具,将端口敲门请求发送到Linux中的远程服务器。
在客户端,我们只需要像我们之前看到的那样先安装knocked(但是当然只需要在服务器端进行配置)。
一旦成功在客户端上安装了敲除的程序包。
我们可以发出以下命令以使用我们在服务器上配置的端口顺序来终止服务器。
root@localhost:~# knock -v 192.168.0.101 3000 4000 5000 hitting tcp 192.168.0.101:3000 hitting tcp 192.168.0.101:4000 hitting tcp 192.168.0.101:5000
上面的命令所执行的操作是将三个SYN请求发送到端口3000上的远程服务器,然后是4000,然后是5000。
该顺序必须与我们在服务器上配置的顺序相同。
好吧,现在让我们尝试对我们的服务器进行telnet检查端口22是否打开。
root@localhost:~# telnet 192.168.0.101 22 Trying 192.168.0.101... Connected to 192.168.0.101. Escape character is '^]'. SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1.1
哇...。
我们看到了吗,我们现在可以连接到服务器了。
当我们敲掉端口时,我们的服务器已对ssh端口22执行allow规则。
现在已经打开了端口,让我们开始检查syslog文件中的内容。
我们将能够看到我们从客户端以及执行iptable规则的服务器发出的端口命中。
Nov 4 10:31:47 ubuntu-dev knockd: 192.168.0.105: openSSH: Stage 1 Nov 4 10:31:47 ubuntu-dev knockd: 192.168.0.105: openSSH: Stage 2 Nov 4 10:31:47 ubuntu-dev knockd: 192.168.0.105: openSSH: Stage 3 Nov 4 10:31:47 ubuntu-dev knockd: 192.168.0.105: openSSH: OPEN SESAME Nov 4 10:31:47 ubuntu-dev knockd: openSSH: running command: /sbin/iptables -A INPUT -s 192.168.0.105 -p tcp --dport 22 -j ACCEPT
现在,系统日志文件提到服务器已从主机192.168.0.105接收到三个端口命中。
并且按照正确的顺序,它执行iptables命令以仅打开该主机的端口192.168.0.105
那不是很好吗?
现在,如果我们是系统管理员,并且想要一个默认情况下没有打开端口的安全服务器,并且需要从家中,从世界任何地方的办公室登录,则可以使用此端口序列以确切的顺序来为源IP打开ssh端口。
我在实现这种安全层时看到的主要优点是IP地址的动态白名单。
我们可以与所需的系统管理员列表共享端口号序列,以触发服务器上要执行的特定白名单/操作。
尽管似乎将身份验证凭据传递给所需人员,但它与传统的身份验证形式完全不同。
因为大门没有打开,所以所有人都不能进入。
实际上,所有人的大门都是关闭的。
此安全层是增加的一层,可用来打开门以访问特定应用程序提供的其他身份验证方法(基于SSH的密码或者密钥,以及针对webui的webUI密码等)。
许多人认为这种安全层是“默默无闻的安全性”。
这意味着,我们甚至没有让人们知道那里是否正在运行某些东西。
尽管从某种意义上说,一定程度上无法理解端口敲门提供的那种安全性,但是有时我们仍需要继续采取另外的步骤来保护关键服务器。
批评端口敲除的安全性的一个很好的参数是,任何人都可以嗅探数据包,并通过检测以下内容来发现端口敲除正在发生。
如果在嗅探到的数据包中发现了一系列静态SYN请求,并且没有对这些SYN请求发送任何答复,随后是SSH流量,则攻击者可以确定正在进行端口敲除。
如果攻击者发现自己监视的特定服务器上的ssh端口已关闭,并且在对随机端口进行一系列SYN请求后发现其打开,则攻击者可能会对此加倍确定。
下面提到一些有关端口敲门的主要问题。
- 服务端将如何验证将敲除数据包发送到服务器的人是否实际上是被允许发送的人。换句话说,没有方法可以验证客户端。
- 80%的情况下,我们都落后于某种形式的NAT服务器。我们或者位于ISP NAT之后,或者有时位于办公室NAT服务器防火墙之下。这种设计使得发送者一旦发送了正确的敲门声,就应该能够在服务器上将其源IP列入白名单。但是,当我们在NAT框后面时,NAT框的源将列出为白色,这意味着使用同一框进行NAT的其他客户端也可以访问。
还有其他两种相对较少使用的端口爆震实现。
与我们之前看到的端口爆震方法相比,使用这两种方法可以实现更高的隐身性。
如前所述,攻击者可以通过执行数据包嗅探来检测实现端口敲除的方法。
但是,如果使用较少连接的协议(例如UDP和ICMP)来实现此目的,攻击者将很难检测到正在发生的端口敲门动作。
这背后的基本思想是将敲门声整合到正常流量中。
例如,发送带有内部详细信息的DNS请求。
或者发送带有用户名/密码和源地址详细信息等的ICMP请求。
有两种这样的实现方式。
但是,我没有找到可以以可安装或者配置的软件包形式使用的端口爆震的任何此类实现。
请让我知道是否有人知道可以轻松实现的任何此类软件包的可用性。
话虽这么说,一个好的程序员可以轻松地将其背后的思想带入自己的代码中。
让我们概述一下在ICMP或者UDP DNS请求中发送敲门请求的实现方式的思想和背后的思想。
让我们首先讨论在DNS请求中构建敲门模式的第二种方法及其工作方式。
客户端将在请求中发送带有随机域名的DNS请求,其中将包含源IP,目标IP以及域名。
服务器上的程序将监视收到的DNS请求。
该程序将配置为将域名映射到命令。
当找到与命令相关联的域名(由用户定义)时,它将执行该域名(例如,打开源DNS请求的源IP的ssh端口)。
该想法背后的另一个优势是实现简单。
因为客户端执行敲门程序,所以不需要敲门程序。
它可以借助nslookup等常规工具发送请求。
在第二种实现中,服务器将具有一个守护程序,该守护程序将在接收到的ICMP数据包中查找和监视爆震信息。
在这种使用ICMP进行敲门的方法中,客户端首先使用用户名,密码,时间,源地址等进行MD5哈希值。
发送的密码将是一次性密码。
与DNS方法类似,添加优点是可以使用常规ping命令来实现。
同样,此方法有助于实现合理的隐身水平。