Wprowadzenie
Coolify to doskonała platforma do samodzielnego hostowania aplikacji, ale jak każda usługa dostępna z internetu, wymaga solidnych środków bezpieczeństwa. CrowdSec zapewnia inteligentne, oparte na społeczności rozwiązanie bezpieczeństwa, które może znacząco wzmocnić ochronę Twojej instalacji Coolify przed złośliwym ruchem, atakami brute force i innymi zagrożeniami bezpieczeństwa.
Ten kompleksowy przewodnik przeprowadzi Cię przez konfigurację CrowdSec jako firewalla dla Twojej instalacji Coolify, w tym zaawansowane funkcje takie jak wyzwania CAPTCHA i powiadomienia Discord.
Dlaczego używać CrowdSec z Coolify?
CrowdSec oferuje kilka przewag nad tradycyjnymi rozwiązaniami firewall:
- Inteligencja społeczności: Wykorzystuje wywiad o zagrożeniach pochodzący od tysięcy użytkowników
- Analiza behawioralna: Wykrywa wzorce ataków, a nie tylko blokuje znane złe IP
- Elastyczne środki zaradcze: Obsługuje różne typy odpowiedzi (ban, captcha, ograniczanie częstotliwości)
- Ochrona w czasie rzeczywistym: Bezproblemowo integruje się z Traefik (proxy Coolify)
- Niski poziom fałszywych alarmów: Zaawansowane parsowanie ogranicza blokowanie legalnego ruchu
Krok 1: Instalacja CrowdSec
Najpierw zainstaluj CrowdSec na serwerze hostującym Coolify:
apt update
apt upgrade -y
curl -s https://install.crowdsec.net | sudo bash
apt install crowdsecZweryfikuj instalację:
systemctl status crowdsecKrok 2: Konfiguracja CrowdSec dla Coolify
Ponieważ Coolify używa portu 8080, musimy skonfigurować CrowdSec do użycia innego portu:
nano /etc/crowdsec/config.yamlZmodyfikuj sekcję api.server.listen_uri:
plugin_config:
user: nobody
group: nogroup
api:
client:
insecure_skip_verify: false
credentials_path: /etc/crowdsec/local_api_credentials.yaml
server:
log_level: info
listen_uri: 0.0.0.0:8095 # Zmienione z domyślnego 8080, zablokuj 8095 na firewallu
profiles_path: /etc/crowdsec/profiles.yaml
console_path: /etc/crowdsec/console.yamlWażne: Zmień 127.0.0.1 na 0.0.0.0, aby uniknąć problemów z połączeniem między kontenerami Docker a CrowdSec. Również zmień port na 8095 w local_api_credentials.yaml
Uruchom ponownie CrowdSec:
systemctl restart crowdsecPrzetestuj połączenie z proxy Coolify:
docker exec coolify-proxy wget -qO- http://host.docker.internal:8095/v1/heartbeatUwaga: Odpowiedź 401 Unauthorized też jest OK – oznacza to, że połączenie działa, ale nie jesteśmy uwierzytelnieni, co jest oczekiwane na tym etapie.
Krok 3: Instalacja Firewall Bouncer
W Crowdsec „bouncers” odpowiadają za blokowanie, a „collections” za analizowanie
Zainstaluj bouncer nftables dla ochrony na poziomie systemu:
apt install crowdsec-firewall-bouncer-nftables -yZweryfikuj instalację:
cscli metricsPoszukaj cs-firewall-bouncer w sekcji Local API Bouncers Metrics.
Natomiast warto zaznaczyć, że bouncer nftables może mieć problemy z odczytywaniem adresu IP klienta, jeśli używamy Cloudflare proxy (traefik bouncer nie ma takiego problemu). Więc w przypadku Cloudflare proxy, warto zamienić nftables-bouncer na cloudflare-bouncer
Krok 4: Opcjonalna integracja ze społecznością CrowdSec
Chociaż CrowdSec działa perfekcyjnie w trybie standalone, połączenie z konsolą społeczności zapewnia dodatkowe korzyści:
- Panel internetowy
- Wywiad o zagrożeniach społeczności
- Dane geolokalizacyjne
- Współdzielone listy blokowanych
Aby się zarejestrować (opcjonalnie):
- Zarejestruj się na https://app.crowdsec.net/signup
- Skopiuj komendę rejestracji z konsoli
- Wykonaj:
cscli console enroll XXXXX - Zatwierdź rejestrację w konsoli internetowej
Krok 5: Konfiguracja integracji z Traefik
Wygeneruj klucz API bouncer dla Traefik:
cscli bouncers add traefik-bouncerZapisz wygenerowany klucz – będziesz go potrzebować w następnym kroku.
Utwórz konfigurację wtyczki CrowdSec dla Traefik:
nano /data/coolify/proxy/dynamic/crowdsec-plugin.yamlhttp:
middlewares:
crowdsec:
plugin:
bouncer:
crowdsecMode: live
crowdsecLapiHost: 'host.docker.internal:8095'
crowdsecLapiKey: 'TWOJ_KLUCZ_API_BOUNCER_TUTAJ'
enabled: trueKrok 6: Konfiguracja Proxy Coolify
Znajdź najnowszą wersję wtyczki Traefik bouncer na https://github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin (sprawdź zakładkę releases).
Edytuj konfigurację proxy Coolify:
nano /data/coolify/proxy/docker-compose.ymlDodaj te argumenty wiersza poleceń do usługi Traefik:
name: coolify-proxy
networks:
coolify:
external: true
services:
traefik:
container_name: coolify-proxy
# ... istniejąca konfiguracja ...
command:
# ... istniejące komendy ...
- '--experimental.plugins.bouncer.modulename=github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin'
- '--experimental.plugins.bouncer.version=v1.8.1' # Użyj najnowszej wersji
- '--accesslog=true'
- '--accesslog.format=json'
- '--accesslog.bufferingsize=0'
- '--accesslog.fields.headers.defaultmode=drop'
- '--accesslog.fields.headers.names.User-Agent=keep'
- '--accesslog.filepath=/traefik/access.log'Uwaga: Jeśli używasz Cloudflare, możesz potrzebować dodatkowych etykiet w zależności od konfiguracji. Middleware CrowdSec powinien być kompatybilny z proxy Cloudflare.
- '--entryPoints.http.forwardedHeaders.trustedIPs=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22,2400:cb00::/32,2606:4700::/32,2803:f800::/32,2405:b500::/32,2405:8100::/32,2a06:98c0::/29,2c0f:f248::/32'
- '--entryPoints.https.forwardedHeaders.trustedIPs=<to samo>'Ważne: Po edycji pliku docker-compose.yml zawsze uruchom:
docker compose up -dUwaga: Jeśli używasz IPv6 MUSISZ dodać poniższą sekcję w /etc/docker/daemon.json i po tym zrestartować usługę (sudo systemctl restart docker).
Bez tego traefik będzie ci zwracał w adresie IP klienta, bzdury typu 10.0.1.1.
{
"ip6tables": true,
"experimental" : true,
"userland-proxy": true
}Wskazówki debugowania
Jeśli napotkasz problemy, sprawdź logi Traefik:
docker logs coolify-proxySzukaj błędów związanych z ładowaniem wtyczki lub konfiguracją. Logi pomogą zidentyfikować problemy z konfiguracją wtyczki CrowdSec lub logami dostępu.
Krok 7: Konfiguracja rotacji logów
Niepotrzebne w Coolify 4.5.0
Krok 8: Włączenie CrowdSec dla Twoich aplikacji w Coolify
Aby chronić swoje aplikacje Coolify za pomocą CrowdSec:
- Przejdź do panelu Coolify
- Otwórz swoją stronę/usługę
- Kliknij „Edit compose file”
- Dodaj etykietę middleware CrowdSec:
labels:
- coolify.traefik.middlewares=crowdsec@fileUruchom ponownie Traefik:
cd /data/coolify/proxy
docker compose up -d
docker restart coolify-proxyKrok 9: Konfiguracja analizy logów
Zainstaluj kolekcję Traefik do parsowania logów:
cscli collections install crowdsecurity/traefik
systemctl reload crowdsecSkonfiguruj CrowdSec do analizy logów Traefik:
nano /etc/crowdsec/acquis.yamlDodaj:
---
filenames:
- /data/coolify/proxy/access.log
labels:
type: traefik
log_type: http_access-logUruchom ponownie obie usługi:
docker restart coolify-proxy
systemctl restart crowdsecKrok 10: Testowanie konfiguracji
Przetestuj konfigurację, aby upewnić się, że wszystko działa prawidłowo.
Sprawdź logi dostępu
Monitoruj access.log pod kątem przychodzących żądań:
tail -f /data/coolify/proxy/access.log | jqPrzetestuj blokowanie IP
⚠️ Ważne: Użyj innego urządzenia i sieci (np. telefonu z danymi mobilnymi), aby uniknąć przypadkowego zablokowania siebie!
Z innego urządzenia zanotuj swój adres IP odwiedzając swoją stronę, następnie ręcznie zablokuj ten IP do testów:
cscli decisions add -i TWOJ_TESTOWY_IP -d 10mZweryfikuj ochronę
Spróbuj uzyskać dostęp do strony z zablokowanego IP – powinien zostać odrzucony.
Usuń testową blokadę
Posprzątaj po teście usuwając blokadę:
cscli decisions remove -i TWOJ_TESTOWY_IPZaawansowane funkcje
Integracja CAPTCHA
Do zaawansowanego łagodzenia ataków skonfiguruj wyzwania CAPTCHA:
Pobierz szablon CAPTCHA:
wget https://raw.githubusercontent.com/maxlerebourg/crowdsec-bouncer-traefik-plugin/main/captcha.html -O /data/coolify/proxy/dynamic/captcha.htmlZarejestruj się w hCaptcha na https://www.hcaptcha.com i uzyskaj klucz strony i sekretny klucz.
Skonfiguruj profil CAPTCHA: (cały nowy plik)
nano /etc/crowdsec/profiles.yamlname: captcha_remediation
filters:
- >-
Alert.Remediation == true && Alert.GetScope() == "Ip"
&& Alert.GetScenario() in ["crowdsecurity/http-crawl-non_statics", "crowdsecurity/http-bad-user-agent", "crowdsecurity/http-probing"]
&& GetDecisionsSinceCount(Alert.GetValue(), "24h") < 2
decisions:
- type: captcha
duration: 4h
on_success: break
---
name: default_ip_remediation
filters:
- Alert.Remediation == true && Alert.GetScope() == "Ip"
decisions:
- type: ban
duration: 12h
duration_expr: >-
GetDecisionsCount(Alert.GetValue()) >= 6 ? "168h" : Sprintf('%dh', (GetDecisionsCount(Alert.GetValue()) + 1) * 12)
notifications:
- discord
on_success: break
---
name: default_range_remediation
filters:
- Alert.Remediation == true && Alert.GetScope() == "Range"
decisions:
- type: ban
duration: 12h
notifications:
- discord
on_success: breakZaktualizuj konfigurację bouncera:
nano /data/coolify/proxy/dynamic/crowdsec-plugin.yamlhttp:
middlewares:
crowdsec:
plugin:
bouncer:
crowdsecMode: live
crowdsecLapiHost: 'host.docker.internal:8095'
crowdsecLapiKey: 'TWOJ_KLUCZ_API'
enabled: true
captchaProvider: hcaptcha
captchaSiteKey: TWOJ_KLUCZ_STRONY_HCAPTCHA
captchaSecretKey: TWOJ_SEKRETNY_KLUCZ_HCAPTCHA
captchaHTMLFilePath: /traefik/dynamic/captcha.html
forwardedHeadersTrustedIPs:
# Cloudflare IPv4 — https://www.cloudflare.com/ips-v4
- 173.245.48.0/20
- 103.21.244.0/22
- 103.22.200.0/22
- 103.31.4.0/22
- 141.101.64.0/18
- 108.162.192.0/18
- 190.93.240.0/20
- 188.114.96.0/20
- 197.234.240.0/22
- 198.41.128.0/17
- 162.158.0.0/15
- 104.16.0.0/13
- 104.24.0.0/14
- 172.64.0.0/13
- 131.0.72.0/22
# Cloudflare IPv6 — https://www.cloudflare.com/ips-v6
- 2400:cb00::/32
- 2606:4700::/32
- 2803:f800::/32
- 2405:b500::/32
- 2405:8100::/32
- 2a06:98c0::/29
- 2c0f:f248::/32
clientTrustedIPs:
- 1.2.3.4 # ewentualnie twój lub adresy IP twoich serwerówPrzetestuj funkcjonalność CAPTCHA
⚠️ Ważne: Użyj innego urządzenia i sieci (np. telefonu z danymi mobilnymi), aby samemu siebie nie zbanować!
Dodaj decyzję CAPTCHA dla swojego testowego IP:
cscli decisions add --ip TWOJ_TESTOWY_IP -d 10m -t captchaOdwiedź swoją stronę z tego IP, aby zobaczyć wyzwanie CAPTCHA w akcji.
Usuń testową CAPTCHA po zakończeniu:
cscli decisions remove --ip TWOJ_TESTOWY_IP -t captchaDarmowe bonusowe treści!
Jeśli chcesz odebrać za darmo mój skrypt do automatycznego patchowania takiego serwera z Coolify, zapisz się do mojego newslettera!
Napisałem taki skrypt, żeby robić to szybko i jednym kliknięciem. Po zapisie otrzymasz link do sekcji bonusowych moich artykułów.
Dzięki!
Powiadomienia Discord
Otrzymuj natychmiastowe alerty o zdarzeniach bezpieczeństwa
Utwórz plik konfiguracji powiadomień:
nano /etc/crowdsec/notifications/discord.yamltype: http
name: discord
log_level: info
group_wait: 10m
group_threshold: 15
format: |
{
"embeds": [
{
"title": "🚨 CrowdSec · <YOUR_SERVER_NAME>",
"color": 15158332,
"description": "{{range . -}}{{$a := . -}}{{range .Decisions -}}`{{.Value}}`{{if $a.Source.Cn}} {{$a.Source.Cn}}{{end}} · {{.Type}} {{.Duration}} · {{.Scenario}} · [CTI](https://app.crowdsec.net/cti/{{.Value}})\n{{end -}}{{end -}}",
"footer": { "text": "CrowdSec Security Engine" }
}
]
}
url: URL_TWOJEGO_WEBHOOK_DISCORD
method: POST
headers:
Content-Type: application/jsonWłącz powiadomienia w profilach
Edytuj konfigurację profili:
nano /etc/crowdsec/profiles.yamlDodaj do domyślnego profilu:
name: default_ip_remediation
filters:
- Alert.Remediation == true && Alert.GetScope() == "Ip"
decisions:
- type: ban
duration: 12h
notifications:
- discord
on_success: breakPrzetestuj powiadomienia Discord
Uruchom ponownie CrowdSec i przetestuj system powiadomień:
systemctl restart crowdsec
cscli notifications test discordZapobieganie wykrywania już zablokowanego ruchu
Utwórz parser:
nano /etc/crowdsec/parsers/s02-enrich/local-traefik-already-blocked.yamlname: local/traefik-already-blocked
description: "Drop requests already answered by the Traefik bouncer / ipAllowList"
filter: "evt.Unmarshaled.traefik != nil"
whitelist:
reason: "already blocked at the proxy"
expression:
- "evt.Unmarshaled.traefik.OriginStatus == 0 && evt.Unmarshaled.traefik.DownstreamStatus == 403"Konfiguracja allowlist
Zapobiegnij przypadkowemu blokowaniu normalnego ruchu.
To bardzo ważne, ponieważ czasami CrowdSec może zbanować nasz serwer podczas aktualizacji WordPressa itp.
nano /etc/crowdsec/parsers/s02-enrich/whitelists.yamlname: crowdsecurity/whitelists
description: "Whitelist events from private ipv4 addresses"
whitelist:
reason: "private ipv4/ipv6 ip/ranges"
ip:
- "::1"
- "PUBLICZNE_IP_TWOJEGO_SERWERA" # Dodaj publiczne IP swojego serwera
- "TWOJE_DOMOWE_IP" # Dodaj IP domu/biura jeśli masz statyczne
cidr:
- "127.0.0.0/8"
- "192.168.0.0/16"
- "10.0.0.0/8"
- "172.16.0.0/12"Zapobieganie wykrywania już zablokowanego ruchu
Utwórz parser:
nano /etc/crowdsec/parsers/s02-enrich/local-traefik-already-blocked.yamlname: local/traefik-already-blocked
description: "Drop requests already answered by the Traefik bouncer / ipAllowList"
filter: "evt.Unmarshaled.traefik != nil"
whitelist:
reason: "already blocked at the proxy"
expression:
- "evt.Unmarshaled.traefik.OriginStatus == 0 && evt.Unmarshaled.traefik.DownstreamStatus == 403"I zwiększ pamieć Crowdsec z 7d na 30d
nano /etc/crowdsec/config.yaml(...)
flush:
max_items: 5000
max_age: 30d
(...)Porządki w acquis.yaml
Otwórz acquis.yaml
nano /etc/crowdsec/acquis.yamlI zostaw tylko auth.log (syslog) oraz access.log (traefik)
Monitorowanie
Regularne sprawdzenia
Monitoruj swoją instalację CrowdSec:
# Sprawdź status CrowdSec
systemctl status crowdsec
# Zobacz bieżące decyzje
cscli decisions list
# Sprawdź metryki
cscli metrics
# Zobacz alerty
cscli alerts listAnaliza logów
Monitoruj co wykrywa CrowdSec:
# Najnowsze alerty
cscli alerts list -l 10
# Decyzje według scenariusza
cscli decisions list --json | jq '.[] | .scenario' | sort | uniq -c
# Najczęściej blokowane IP
cscli decisions list --json | jq -r '.[] | .value' | sort | uniq -c | sort -nr | head -10Rozwiązywanie problemów
Częste problemy
Brak połączenia Traefik do CrowdSec:
- Upewnij się, że listen_uri jest ustawione na 0.0.0.0:8095
- Sprawdź reguły firewalla
- Zweryfikuj klucz API bouncer
Brak podejmowanych decyzji przez CrowdSec:
- Sprawdź czy logi Traefik są zapisywane
- Zweryfikuj konfigurację acquis.yaml
- Upewnij się, że Traefik jest poprawnie skonfigurowany
Fałszywe alarmy:
- Dodaj legalne IP do listy dozwolonych adresów
- Dostosuj progi scenariuszy
- Przejrzyj i dostrajaj profile
CAPTCHA nie działa:
- Zweryfikuj poprawność kluczy hCaptcha
- Sprawdź ścieżkę pliku captcha.html
- Upewnij się, że domeny są skonfigurowane w hCaptcha
Podsumowanie
Masz teraz kompleksową konfigurację bezpieczeństwa, która obejmuje:
- Wykrywanie zagrożeń w czasie rzeczywistym poprzez analizę behawioralną CrowdSec
- Dzielenie się inteligencją społeczności i otrzymywanie danych o zagrożeniach
- Elastyczne środki zaradcze z banami, wyzwaniami CAPTCHA i ograniczaniem częstotliwości
- Natychmiastowe powiadomienia przez Discord o zdarzeniach bezpieczeństwa
- Ochrona na poziomie systemu poprzez integrację z firewallem
- Ochrona na poziomie aplikacji poprzez middleware Traefik
- Inteligentna lista dozwolonych zapobiegająca blokowaniu legalnego ruchu
- Kompleksowe logowanie i monitorowanie dla wglądu w bezpieczeństwo
Gotowe! Twoja instancja Coolify jest teraz chroniona przez CrowdSec!







