下午好
在以前的
出版物中,我谈到了如何轻松自然地在数据库中的Mikrotik路由器上配置网络流量元数据的集合。
现在该教导我们的服务器对接收到的数据进行基本分析并发送回命令。
目的:动态控制Mikrotik防火墙规则,以通过密码猜测来抑制网络攻击。
意思是:使用rsyslogd v8,crond,mariadb DBMS和Mikrotik路由器本身进行全新的Linux发行。
机制:使用分配的任务,在数据库中执行SQL查询以获取累积和更新的流量数据,并返回传出IP地址的列表,由Crown启动的bash脚本生成Mikrotik命令,并使用ssh连接为现有的阻止规则补充地址列表。
这将与保护开放的TCP端口有关。 这些端口可以是进入Mikrotik并转发到本地网络的端口。
首先,我们指出可能存在的弱点:
- ssh,telnet,web,winbox路由器的控制协议
- 邮件服务smtp,pop,imap
- 外部提供的任何Web服务
- 远程桌面MS RDP,VNC等
- 您还有其他选择
编写SQL查询以搜索暴力我们组织的终端服务器通过非优先端口对外开放。
在DNAT Mikrotik中,我通过添加前缀RDP_DNAT打开了必要规则的记录。 通过此前缀,我们将搜索:
MariaDB [traflog]> select src,dport,count(dport) as ' ' from traffic where datetime>now() - interval 1 day and logpref='RDP_DNAT' group by src having count(dport)>50; +
该请求显示ip地址(攻击即将来临),与之建立连接的端口(端口号已更改)以及连接尝试次数(按src进行初步分组并选择线路),从当前时刻开始,过去的尝试次数超过50次。
以我为例,可以安全地禁止使用这些地址,因为与“好的”客户端的连接数量较少,每天从一个IP到5到10个之间。
该请求可以正常,快速地运行,但是有点长。 为了进一步使用,我建议提出一个观点,该观点将来会减少:
MariaDB [traflog]> create or replace view rdp_brute_day as select src, dport, count(dport) from traffic where datetime>now() - interval 1 day and logpref='RDP_DNAT' group by src having count(dport)>50; Query OK, 0 rows affected (0.23 sec)
让我们检查一下视图是如何工作的:
MariaDB [traflog]> select src,count(dport) from rdp_brute_day; +
太好了
我们通过dsa密钥添加具有授权的用户Mikrotik在linux控制台中,我们生成dsa密钥,该密钥是由我从根目录创建的,将在代表用户启动计划任务的用户下:
root@monix:~
不需要密码。 我们以任何可能的方式将公钥/root/.ssh/id_dsa.pub复制到Mikrotik。 我使用cat命令将其导出,将其从腻子窗口中复制到文本文件中,保存并拖动到winbox文件窗口中。
我不知道为什么,但是在通过winbox界面进行以下操作时,出现了问题。 通过ssh从服务器连接时,Mikrotik也要求我提供密码。 在删除创建的用户并通过控制台执行所有操作之后,dsa连接开始工作。 大致按照
此处的描述进行。
通常,我使用dsa密钥收到了没有密码的欢迎条目,并运行了验证命令:
root@monix:/
好啊
编写bash脚本脚本并不复杂:
mikrotik_cmd_list(){ brute_src_list=$(mysql --skip-column-names traflog -e 'select src from rdp_brute_day') for src in $brute_src_list do echo "ip firewall address-list add address=$src list=rdp_banlist timeout=1d" done } mikrotik_cmd_list | ssh -T rsyslogger@192.168.0.230
为了在同一个ssh连接中传输所有命令,我需要描述函数mikrotik_cmd_list(),在该函数中,首先执行一个请求,将IP地址保存到brute_src_list变量中,然后在循环中,此变量依次为Mikrotik生成命令。 调用函数后,输出通过管道路由到ssh。
不要忘记关闭除root以外的所有人的脚本访问权限,并使文件可执行。
脚本生成的命令会将IP地址添加到rdp_banlist 1天,此后将其从列表本身中删除。 如果要永久保留它,请删除超时选项。
向防火墙添加规则对于如何使用rdp_banlist,我提出了两个选择:
选项一:将带有感叹号的rdp_banlist添加到带有前缀RDP_DNAT的NAT规则中。
add action=dst-nat chain=dstnat comment="..." dst-address=1.2.3.4 dst-port=12345 log=yes log-prefix=RDP_DNAT protocol=tcp src-address-list=\ !rdp_banlist to-addresses=192.168.200.181 to-ports=3389
这样的东西。 也就是说,除了rdp_banlist中的内容外,我们都其他所有内容。
在此选项中,有加号和减号。
优点是连接将立即停止。
缺点是该IP将不再进入traflog数据库,并且一天之后,当黑名单中的存储超时已过去时,它将再次开始废弃。
选项二:将带有感叹号的rdp_banlist添加到前向链的防火墙规则中,在该规则中,我们允许流量通过TCP 3389,这与第一种方法类似。
add action=accept chain=forward comment="..." dst-port=3389 log=yes log-prefix=ACCEPT_RDP protocol=tcp src-address-list=\ !rdp_banlist to-ports=3389
这样的东西。 除黑名单中的内容外,我们允许所有内容。
还有一个加号和减号。
再加上 前缀为RDP_DNAT的日志将继续在traflog数据库中流式传输,由此我们可以确定攻击的迹象。 结果,当继续进行暴力破解的特定主机的禁止超时到期时,它将在下一次计划的任务启动后再次添加到禁止列表中。
缺点是它将继续填充在DSTNAT表中,并为每个连接创建一个新记录,尽管是临时的。
总的来说,这个决定是你的,我都选择了:)(实际上,在这种情况下只有第一个起作用),因为第二个是较早打开的,并且机制根据列表stage1,stage2,stage3中的顺序条目而有所不同,黑名单...好吧,你明白了。 这是一个古老但不太可靠的技巧,它可以轻松禁止“好”客户,同时跳过礼貌地计算超时阶段1的“坏”客户。
计划作业crontab仍然可以将分配的任务添加到crontab中:
root@monix:/root
这样的记录将在12分钟内每小时运行一次脚本。
我必须承认,我今天刚刚完成这项工作,并且很有可能出现问题。 根据情况,我将补充并纠正错误。 我想在新年假期
喝酒以睡个好觉,这就是为什么我急于完成。
仅此而已。
谢谢大家的关注和新年快乐!
参考文献:
MySQL文档Mikrotik防火墙文档感谢Andrey Smirnov关于dsa连接的
文章 。