01 简介
在网络安全演练、攻击案例中,攻击方通过信息收集获取目标可用的信息,将各攻击点连接汇成攻击面,攻击面越广意味着发现潜在漏洞的可能性越大,攻击成功的概率也就越高。因此,通过安全方案最小化暴露面可以有效减少信息系统遭受入侵的概率。本文主要探讨攻击面收敛中通过port knocking手段隐藏ssh服务器的方法,使公共网络上的攻击者更难发现该服务器,达到收敛暴露面,降低安全风险的目的。
02 更改默认 ssh 端口
隐藏 ssh 服务器的第一步是更改默认 ssh 端口。在本文演示案例中shh端口号设置为60636,实际操作中可以使用任意自定义端口号。打开终端并使用以下命令通过 ssh 连接到服务器:
$ ssh -i path-to-identity-file username@server_ip
在服务器上使用vi终端中的命令或任何文本编辑器打开 ssh 配置文件:
$ vi /etc/ssh/sshd_config
现在将默认端口22更新为60636。
操作完成后重新启动 ssh 服务器守护程序,以便将更新应用于新的传入的所有ssh连接。
$ systemctl restart sshd.service
ssh服务器现在将接受并连接端口60636,操作命令如下:
$ ssh -i path-to-identity-file username@server_ip -p 60636
需要注意的是,如果该服务器上配置了防火墙,还应该同步更新防火墙规则,允许端口上的 ssh 60636连接,阻止ssh 22连接。
03 使用knockd实现端口碰撞
端口碰撞是一种在一组预先指定的关闭端口上产生连接请求,从外部打开防火墙上的端口的方法。一旦收到正确的连接请求序列,防火墙规则就会被动态修改,允许发送连接请求的主机通过特定端口进行连接。端口碰撞的主要目的是防止攻击者通过端口扫描来扫描系统中潜在的可利用服务,除非攻击者发送正确的碰撞序列,否则受保护的端口将显示为关闭。
3.1 安装和配置 knockd
为了实现端口碰撞,首先要在linux服务器上安装knockd。运行以下命令进行安装:
$ sudo apt-get install knockd
接下来打开knockd位于/etc/knockd.conf的配置文件:
在配置文件中了解一下默认配置值包含的信息:
●sequence是一组端口号,被视为碰撞序列。
●seq_timeout定义序列的有效期。
●command包含iptables添加规则以允许来自指定 ip 地址的传入 ssh 连接的命令。仅当用户启动有效的碰撞序列时才会执行此命令。
●tcpflags定义碰撞连接中要接受的 tcp 数据包类型。syn在这种情况下分配了一个tcp类型的数据包。
[openssh]块和[closessh]块之间的主要区别在于[closessh]块具有端口号的关闭序列和iptables删除插入[openssh]块中的规则的命令。
下面是参考的最终配置文件。注意,因为默认值 ( 7000, 8000, 9000) 众所周知,所以现已将开放序列值更改为20001, 20002,20003。同样也更新了默认的关闭顺序。除此之外还将端口更改为22,60636,因为已经在上一步中将 ssh 端口更新为此值。另外注意,在该[openssh]块中,iptables命令值从更改-a为-i,表示此iptables规则将打开端口并将成为第一个执行的规则。最后将超时值从5增加到10,因为 5 秒是在碰撞序列后立即启动 ssh 连接的一个小窗口。
完成全部操作后保存更改并退出文件。
3.2 配置 knockd 侦听特定网络接口
knockd监听的网络接口的名称需要指定。在这里使用ip addr命令来检查与服务器关联的网络接口列表,并选择想要knockd监听的接口名称。
这种情况下,eth0是绑定到公共 ip 地址的接口。所以用这个接口来配置knockd。接下来,编辑knockd配置文件。
保存更改并退出文件,立即启动knockd服务:
$ systemctl start knockd
启用knockd服务,以便在下次启动服务器时同步启动该服务。
$ systemctl enable knockd
3.3 在防火墙上阻止端口 60636
为了实现60636动态打开knockd端口的目的,默认情况下将阻止对该端口的访问,使用iptables命令来执行此操作。执行以下命令就不会破坏当前的活动连接:
$ sudo iptables -a input -m conntrack --ctstate established,related -j accept
接下来执行命令,以默认iptables阻止端口上的所有传入 ssh 连接60636:
$ sudo iptables -a input -p tcp --dport 60636 -j reject
现在尝试再次连接到 ssh 服务器,应该会收到“connection refused”响应:
$ ssh -i path-to-identity-file username@server_ip -p 60636ssh: connect to host server_ip port 60636: connection refused
linux 服务器现在配置了knockd,并且 ssh 端口将只开放给可以成功呈现敲击序列的特定 ip。
04 连接 ssh 服务器
目前已经更改了默认的 ssh 端口,实现了只有提供正确的碰撞序列时才打开端口60636的功能,接下来测试一下。
由于已经配置knockd监听tcp syn端口上的数据包20001,20002且20003作为碰撞序列,现在可以使用任意允许启动到这些特定端口的 tcp 连接工具,下面演示具体操作步骤。
4.1 使用碰撞
首先,在客户端计算机中安装knockd。
$ sudo apt-get install knockd
使用如下knock命令执行碰撞序列:
现在可以通过ssh访问连接 linux 服务器:
$ ssh -i path-to-identity-file username@server_ip -p 60636
...
完成 ssh 访问后可以启动关闭序列,如下所示:
$ knock -v server_ip 20003 20002 20001 -d 500
可以查看knockd登录syslog浏览具体信息:
4.2 使用远程登录
使用以下命令启动敲击序列telnet:
收到“connection refused”消息并连接失败,但没关系,因为该端口上禁用了 telnet,我们只想发送在 telnet 连接期间发送的 tcp syn 数据包。完成所有三个序列的 telnet 命令后即可通过 ssh 连接到服务器。
05 参考链接
https://goteleport.com/blog/ssh-port-knocking/
https://www.howtoing.com/how-to-use-port-knocking-to-hide-the-ssh-port-from-attackers-on-ubuntu
- 关键词标签:
- 安全运营 检测与防护能力 网络安全演练 port knocking隐藏ssh服务器