Chinaunix首页 | 论坛 | 博客
  • 博客访问: 306289
  • 博文数量: 34
  • 博客积分: 1944
  • 博客等级: 上尉
  • 技术积分: 400
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-01 23:22
文章分类

全部博文(34)

文章存档

2010年(2)

2009年(4)

2008年(28)

分类: LINUX

2009-10-12 00:36:27

家里的Linux主机平时都开着下载资料。
当然有时候需要远程管理下,所以对internet开着ssh。

所以经常有人尝试来暴力破解,曾改过ssh的port,好多了,不过这只是模糊安全。也装了fail2ban来限制破解的速度。攻击者频繁换IP的话fail2ban也没辙。

这次找到了新的方式:Port Knocking,原理很简单,不过挺有创意的。

一般我们会让iptables开SSH,不过其实我们只需要为要登录的IP开iptable就可以了,平时封锁SSH端口。不过这种动态的开端口如何来实现呢,下面就介绍Port knocking(敲端口):

鸟哥解释的很好
http://linux.vbird.org/linux_security/knockd.php

1.SSHD开22端口,但是被防火墙屏蔽。
2.Port knocking服务端初始化接头暗号(一些端口序列,包含协议和TCP状态)
3.客户端对服务器不同端口进行knock,发送SYN连接或其他。
4.如果这些端口的连接和某些暗号对上了服务器端就会做些预定义操作。ex:为此IP开SSH端口。

Port knocking类似于一次秘密握手协议,比如一种最基本的方式:发送一定序列的UDP、TCP数据包。当运行在主机上的daemon程序捕捉到数据包以后,如果这个序列正确,则开启相应的端口,或者防火墙允许客户端通过。
上面的接头暗号可以是TCP,UDP甚至是ICMP。

的图示比较生动:

默认情况下客户端对服务器的应用不能访问

客户端敲正确的端口序列

服务器端Port Knocking程序打开防火墙

客户端可以访问了


优点:
Port knocking 没监听端口,而且也不需要防火墙先开放这些端口,当有人尝试暴力这些序列时比较容易由IDS软件来检测到。
信息是由一定的端口访问来传输的,而不是网络报文内容,所以不容易被报文嗅探工具截获。

缺点:
不是很方便,需要先knock下,客户端要对这个端口序列的保密工作,
Port Knocking不能用于Web,Mail。


好,现在是实践下的时候了,search了下yum,发现有个叫knockd软件包(port knocking的实现其实很多的)。
根据鸟哥的文章要了下面的配置:
主要思想:
敲对了开端口,敲开门后cmd_timeout超时后再关闭。因为SSH只要在这个时间连接后防火墙关闭SSH端口对已有连接不会有影响。

/etc/knockd.conf

CODE:
[options]
    UseSyslog
[opencloseSSH]
    sequence      = 44440:udp,44442:udp,44441:udp
    seq_timeout   = 30
    tcpflags      = syn,ack
    start_command = /sbin/iptables -I INPUT -s %IP% -p tcp --dport ssh -j ACCEPT
    cmd_timeout   = 300
    stop_command  = /sbin/iptables -D INPUT -s %IP% -p tcp --dport ssh -j ACCEPT

iptable未开放SSH

CODE:
[root@CentOS1 ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

启动port knocking daemon

CODE:
[root@CentOS1 ~]# knockd -D -v
config: new section: 'options'
config: usesyslog
config: new section: 'opencloseSSH'
config: opencloseSSH: sequence: 44440:udp,44442:udp,44441:udp
config: opencloseSSH: seq_timeout: 30
config: tcp flag: SYN
config: tcp flag: ACK
config: opencloseSSH: start_command: /sbin/iptables -I INPUT -s %IP% -p tcp --dport ssh -j ACCEPT
config: opencloseSSH: cmd_timeout: 300
config: opencloseSSH: stop_command: /sbin/iptables -D INPUT -s %IP% -p tcp --dport ssh -j ACCEPT
ethernet interface detected
Local IP: 192.168.1.111
listening on eth0...

客户端来敲下,使用了windows下的程序:

CODE:
C:\>knock.exe 192.168.1.111 44440:udp 44442:udp 44441:udp

服务器端监视到了正确的端口序列,触发动作,开放了SSH端口。

CODE:
2009-09-12 00:27:25: udp: 192.168.1.110:54204 -> 192.168.1.111:44440 60 bytes
192.168.1.110: opencloseSSH: Stage 1
2009-09-12 00:27:25: udp: 192.168.1.110:54205 -> 192.168.1.111:44442 60 bytes
192.168.1.110: opencloseSSH: Stage 2
2009-09-12 00:27:25: udp: 192.168.1.110:54206 -> 192.168.1.111:44441 60 bytes
192.168.1.110: opencloseSSH: Stage 3
192.168.1.110: opencloseSSH: OPEN SESAME
opencloseSSH: running command: /sbin/iptables -I INPUT -s 192.168.1.110 -p tcp --dport ssh -j ACCEPT

iptables中已经加了允许条目。

CODE:
[root@CentOS1 ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  192.168.1.110        0.0.0.0/0           tcp dpt:22
RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

这个时候我的客户端就可以登录了。

超过门敲开后的时间自动关闭。很安全的自动门吧。

CODE:
192.168.1.110: opencloseSSH: command timeout
opencloseSSH: running command: /sbin/iptables -D INPUT -s 192.168.1.110 -p tcp --dport ssh -j ACCEPT

最后附上看到的一篇小诗【】:

QUOTE:
《敲门》

第一次敲门
是敲不开的
除非是大贤大德
乘愿重来的菩萨

第一次进不了门
倒有可能被怪物
跟踪恐吓
甚至抓起来

第二次再来敲门
说明已经通过考验
我会大开柴门
迎你进来
2009-1-5

参考资料:


鸟哥图文并茂的介绍:          
http://linux.vbird.org/linux_security/knockd.php

[ 本帖最后由 可可火山 于 2009-10-12 00:48 编辑 ]



阅读(3305) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~