home server 篇五:云“fail2ban” [Crowdsec]
介绍
上篇的fail2ban是在受攻击时才采取行动,如果可以在攻击前就把恶意ip给ban了,岂不是更好。Crowdsec就差不多是这种服务,用户受攻击时上传攻击者的ip到云,然后云再把恶意ip分发给其它用户,理论上该ip就不能再攻击其他使用Crowdsec的用户了,起码是4个小时内。当然在一个ip还没发起攻击前是不会把它当成恶意ip的。
Crowdsec行为和配置都非常像fail2ban,都要监听log,但它是SaaS服务,支持ipv4和ipv6,意味着用户需要和提供商合作提供基本的信息,才能ban恶意IP。所以在自己服务器里的Crowdsec只是个客户端,不算自建服务。
从日志来看,它的确在干活:crowdsecurity/community-blocklist: added 11528 entries, deleted 11502 entries。我没有认真看过官网,翻了几次车连耐心都没了,所以不知道怎么看blocklist,要是某天我动态ip变了,然后不幸的变到blocklist里的其中一个,也不知道怎么办,看日志是7天刷新一次,难道要关容器。算了,被ban的话只ban 4小时,等出问题后再解决吧。我发这些翻车文章的目的就是在钓大佬出来写更详细的教程给我抄,我相信只要铒放的够多就能钓出一个。
安装
要建一个叫acquis.yaml的文件,在后面才需要用。这次拿traefik和authelia做示范。
filenames:
!!- /var/log/traefik/access.log
labels:
!!type: traefik
---
filenames:
!!- /var/log/authelia.log
labels:
!!type: authelia
然后就可以用crowdsec的dockercompose了。
version: '3.0'
services:
!!crowdsec:
!!!!image: crowdsecurity/crowdsec:latest
!!!!container_name: crowdsec
!!!!environment:
!!!!!!PGID: "1000"
!!!!!!TZ: Asia/Shanghai
!!!!volumes:
!!!!!!- /home/用户名/docker/crowdsec/crowdsec:/etc/crowdsec/
!!!!!!- /home/用户名/docker/crowdsec/crowdsec/acquis.yaml:/etc/crowdsec/acquis.yaml
!!!!!!- /home/用户名/docker/crowdsec/data:/var/lib/crowdsec/data/
!!!!!!- /home/用户名/docker/traefik/logs/access.log:/var/log/traefik/access.log:ro
!!!!!!- /home/用户名/docker/authelia/config/authelia.log:/var/log/authelia.log/:ro
!!!!networks:
!!!!!!- traefik_proxy
!!!!restart: unless-stopped
networks:
!!traefik_proxy:
!!!!external: true
建好后用这个在容器里确认crowdsec有好好的在读log。不要理traefik.log,有用的是access.log。
cscli metrics
crowdsec只是搜集信息,要执行操作的话还需要bouncer。Traefik的bouncer是贡献者写的,所以是beta版。https://hub.crowdsec.net/
首先需要在crowdsec里请求BOUNCER的API_KEY,bouncer的名字随便取,例如bouncer-traefik:
cscli bouncers add bouncer-traefik
妥善保管这个API_KEY,弄丢了就要把crowdsec的相关文件全删了再来一遍了。
docker-compose.yml:
version: '3.0'
services:
!!crowdsec:
!!!!image: crowdsecurity/crowdsec:latest
!!!!container_name: crowdsec
!!!!environment:
!!!!!!PGID: "1000"
!!!!!!COLLECTIONS: "crowdsecurity/linux crowdsecurity/traefik LePresidente/authelia-logs LePresidente/authelia-bf"
!!!!!!TZ: Asia/Shanghai
!!!!volumes:
!!!!!!- /home/用户名/docker/crowdsec/crowdsec:/etc/crowdsec/
!!!!!!- /home/用户名/docker/crowdsec/crowdsec/acquis.yaml:/etc/crowdsec/acquis.yaml
!!!!!!- /home/用户名/docker/crowdsec/data:/var/lib/crowdsec/data/
!!!!!!- /home/用户名/docker/traefik/logs:/var/log/traefik/:ro
!!!!!!- /home/用户名/docker/authelia/config/authelia.log:/var/log/authelia.log/:ro
!!!!networks:
!!!!!!- traefik_proxy
!!!!restart: unless-stopped
!!bouncer-traefik:
!!!!image: fbonalair/traefik-crowdsec-bouncer:latest
!!!!container_name: bouncer-traefik
!!!!environment:
!!!!!!CROWDSEC_BOUNCER_API_KEY: 刚刚申请的
!!!!!!CROWDSEC_AGENT_HOST: crowdsec:8080
!!!!!!TZ: Asia/Shanghai
!!!!networks:
!!!!!!- traefik_proxy
!!!!depends_on:
!!!!!!- crowdsec
!!!!restart: unless-stopped
networks:
!!traefik_proxy:
!!!!external: true
Crowdsec的自由度比fail2ban高点,可以用middleware监控需要用的,fail2ban就像看门狗一样,不让进就不让进,crowdsec则像门卫,至少可以控制,所以在要保护的服务的动态配置middleware里加crowdsec-bouncer就行了。在traefik/config里创建个mw-crowdsec.yml:
http:
!!middlewares:
!!!!crowdsec-bouncer:
!!!!!!forwardauth:
!!!!!!!!address: http://bouncer-traefik:8080/api/v1/forwardAuth
!!!!!!!!trustForwardHeader: true
现在就能执行关于ip的操作了。如果想banip用这个,例如我要ban 192.168.0.24。
cscli decisions add --ip 192.168.0.24
然后192.168.0.24访问有对应middleware的服务将会得到forbidden,没有的则正常。
查看有没有ban ip的命令是这个。
cscli decisions list
用这个解ban。
cscli decisions delete --ip 192.168.0.24
好了,就这样了,关于crowdsec的代码我也看不懂,有问题问gayhub去。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
24k纯洁
校验提示文案
24k纯洁
校验提示文案