关于linux:芝麻开门-Portknocking

1次阅读

共计 4015 个字符,预计需要花费 11 分钟才能阅读完成。

端口 22),而后暴力破解。

避免 SSH 端口被暴力破解个别有以下几种形式
1. 批改默认端口 22 为其它端口
2. 禁止明码登陆,只容许密钥登陆或者应用 PAM 模块开启二次认证
3. 应用 ipfailban 屏蔽暴力登陆的 IP

除了以上几种做法,还有一种平安加固的伎俩叫 port knocking。如字面意思,相似‘敲门’,只是这里敲的是‘端口’,而且须要依照程序‘敲’端口。如果敲击规定匹配,则能够让防火墙实时更改策略。从而达到开关防火墙的目标。

简略的做法是装置 knockd。knockd 是一种端口试探服务器工具。它侦听以太网或其余可用接口上的所有流量,期待非凡序列的端口命中 (port-hit)。telnet 或 Putty 等客户软件通过向服务器上的端口发送 TCP 或数据包来启动端口命中。
官网:https://zeroflux.org/projects…

装置

并没有 yum 源,所以只能本人编译装置

wget http://www.zeroflux.org/proj/knock/files/knock-0.8.tar.gz
yum install  libpcap-devel
yum  install autoconf
autoreconf -fi
./configure --prefix=/usr/local
make
sudo make install
cp knockd.conf /etc/
knockd -V

启动服务

knockd -i ens192 -d -v

配置 knockd 服务

应用默认的配置文件

cat /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

配置文件里有两个参数:

sequence: 依照程序顺次拜访端口,command 执行的条件。比方这里是顺次拜访 7000, 8000, 9000 端口,默认应用 TCP 拜访。
command: 当 knockd 监测到 sequence 端口拜访实现,而后执行此处 command,这里为通过 iptables 开启敞开 ssh 内部拜访。

结构 knock sequence

  1. 间接手工结构

关上 SSH iptables

telnet  <target> 7000
telnet  <target> 8000
telnet  <target> 9000

敞开 SSH iptables

telnet  <target> 9000
telnet  <target> 8000
telnet  <target> 7000
  1. 应用 knock 程序

    开启
    knock  <target>  7000 8000 9000
    敞开
    knock  <target>  9000 8000 7000
  2. NC 或者 Nmap

    Open:
    nc -z <target> 7000 8000 9000
    Close:
    nc -z <target> 9000 8000 7000
    
    for x in  7000 8000 9000; do nmap -Pn --host_timeout 201 --max-retries 0 -p $x  <target> ; done

    个别状况到这里就完了。但如果只是 cv 大法的话,就没必要写这篇文章了。

这里有坑

依照默认配置,我认为这样敲门 knock -v 10.180.249.61 7000 8000 9000 应该是牵强附会的,后果它给我来了这个

[root@manager knock-0.8]#  knockd -i ens192 -v
listening on ens192...
10.180.205.102: openSSH: Stage 1
10.180.205.102: openSSH: Stage 1
10.180.205.102: openSSH: Stage 1
10.180.205.102: openSSH: Stage 2
10.180.205.102: closeSSH: Stage 1
10.180.205.102: closeSSH: Stage 1
10.180.205.102: closeSSH: Stage 1
10.180.205.102: closeSSH: Stage 2
10.180.205.102: openSSH: Stage 1
10.180.205.102: openSSH: Stage 1
10.180.205.102: openSSH: Stage 1

咦,它把敲门信号当成关门信号了,好吧,我把敲门端口和关门端口全副设置成不同的端口,然而,仍然是莫名微妙的输入,并不是我预料中的 Stage 1,Stage 2,Stage 3,command 这样的执行日志。能收到第一个和第二个信号,然而第三个信号无论如何都收不到。莫非前人欺我?

改成敲门,关门只接管两个信号

PS C:\Windows> telnet 10.180.249.61 7000
正在连接 10.180.249.61... 无奈关上到主机的连贯。在端口 7000: 连贯失败
PS C:\Windows> telnet 10.180.249.61 8000
正在连接 10.180.249.61... 无奈关上到主机的连贯。在端口 8000: 连贯失败

[root@manager knock-0.8]#  knockd -i ens192 -v
listening on ens192...
10.180.205.102: openSSH: Stage 1
10.180.205.102: openSSH: Stage 1
10.180.205.102: openSSH: Stage 1
10.180.205.102: openSSH: Stage 2
10.180.205.102: openSSH: OPEN SESAME
openSSH: running command: /usr/sbin/iptables -A INPUT -s 10.180.205.102 -p tcp --dport 22 -j ACCEPT

[root@manager ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  10.180.205.102       anywhere             tcp dpt:ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

也就是说,knock 只能接管两个敲门信号,超过两个就会导致敲不开门,关不了门。这是一个 bug 吗?

概率是因为 ip 包达到服务器的工夫有可能是乱序的,这会导致敲门失败,如果遇到只看到 open/closeSSH: Stage 1 或者 open/closeSSH: Stage 2,看不到 opencloseSSH: Stage 3 的状况,能够多试几次,或者手工顺次执行。如果还是不行,倡议查看端口是否被占用。如果最初仍然不行,论断还是属于 knockd 对 tcp 信号处理的 bug,不倡议配置超出两个的敲门信号。

至于 iptables 的利用就不再细数了。另外,为了在重启的过程保留和复原 iptables 设置,咱们能够在 knockd 命令中减少相应的 iptables-save 和 iptables-restore 操作。

看来 knock 还是有肯定局限性。有没有其它工具呢。knock 官网也举荐了代替工具 doorman 和 pasmal。

简略间接不依赖三方工具实现 Port-knocking

还有更简略的吗?间接用 iptables 就能搞定,先在服务器增加两条策略

iptables \
  -i eth0 \
  -t raw --append PREROUTING \
  -p tcp --dport 8080 --syn \
  -m recent --name knocked ! --rcheck --seconds 600 \
  -j DROP

iptables \
  -i eth0 \
  -t raw --append PREROUTING \
  -p udp --dport 30000 \
  -m string --string "OpenSesame" --algo bm \
  -m recent --name knocked --set \
  -j DROP

而后测试下

[root@manager ~]# yum install -y socat
[root@manager ~]# curl -i   --connect-timeout 5 http://146.56.248.195:8080/hello
curl: (28) Connection timed out after 5001 milliseconds
[root@manager ~]# echo "OpenSesame" | socat - udp4-datagram:146.56.248.195:30000
[root@manager ~]# curl -i   --connect-timeout 5 http://146.56.248.195:8080/hello
HTTP/1.1 200 OK
Date: Tue, 27 Jul 2021 02:38:47 GMT
Content-Type: text/plain
Content-Length: 21
Connection: keep-alive
Expires: Tue, 27 Jul 2021 02:38:46 GMT
Cache-Control: no-cache
content-type: text/html

<h1>Hello World!</h1>[root@manager ~]#

会敲门了,置信关门也会了。

Port-knocking 并不能作为一种独立的平安进攻措施,因为它属于 security by obscurity。多种策略组合,能力进步零碎的安全性

正文完
 0