#蜜罐
#钓鱼网站
场景
服务器上的业务并不想对所有人开放,只有当对方提供IP信息后才单独对相应的IP进行授权。
像这种小范围的IP授权,如果能获取到对方IP,则可以通过提前写防火墙策略,限制IP访问范围。但如果IP是动态的,比如对方的IP是互联网IP,这时就只能先等对方报自己的IP,再写放行策略。
针对这种场景,有一种特殊的端口放行机制,比如提供三个端口,要求访问者必须按指定顺序进行访问,顺序对了,真实的业务端口才会放行。一旦顺序错误则访问者的IP会被封,有点像玩探宝游戏。
这种应对策略太程序员化了,一般用户很难接受,给用户解释起来也费劲。这里使用另一种思路,提供一个登录页面,当登录成功时则放行访问者IP。
页面效果如下:
看起来是不是像钓鱼网站?这个东西的确可以当蜜罐或钓鱼网站使用,登录成功时会放行IP,登录失败时则会记录访问者的IP、账户和密码,用于反入侵日志分析。
项目地址
为:
https://github.com/hyang0/ip_allow
实现原理
windows 平台使用 netsh 命令,动态添加防火墙策略。Linux 使用 ipset 和 iptables 实现IP准入。前端页面提供用户名密码的验证,后端通过操作防火墙实现放行。
使用步骤
默认使用 80 端口作为服务端口,可以在 app.py
中修改服务端口
if __name__ == '__main__':app.run(debug=False, host='0.0.0.0', port=80)
日志
用户的所有访问日志都存于 ./logs/app.log
中,其中登录成功的日志会单独存于 ./logs/allow.log
中,
登录失败的日志会存于 ./logs/deny.log
中。日志中存储了访问者的 IP|username|password , 可用于蜜罐、 钓鱼、 反入侵等事后分析。
默认密码
系统的默认用户密码为:
# 用户demo数据,请换成自己的用户数据源users = {"admin": "nzDrdSKN9JS5IGhZkwxs","user": "HIAExuX81QWw4KyM8P3W"
}
效果图:
可将代码中的用户数据换成自己的用户数据或更换认证策略。
总结
通过让用户先访问“准入”页面,系统放行后再访问真实业务的场景只适合临时授权。后台应设置好防火墙定时重置策略,防止系统长时间对外暴露。因为访问者IP是动态变化的,一直处于暴露状态会对系统带来入侵风险。
为了应对恶意扫描,可以定期处理 deny 日志,将未授权IP加入黑名单。
原创 生有可恋