作者:空調救我命
介紹
上篇的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去。