Zabezpieczanie Coolify z CrowdSec: Kompletny przewodnik

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 crowdsec

Zweryfikuj instalację:

systemctl status crowdsec

Krok 2: Konfiguracja CrowdSec dla Coolify

Ponieważ Coolify używa portu 8080, musimy skonfigurować CrowdSec do użycia innego portu:

nano /etc/crowdsec/config.yaml

Zmodyfikuj 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
profiles_path: /etc/crowdsec/profiles.yaml
console_path: /etc/crowdsec/console.yaml

Ważne: Zmień 127.0.0.1 na 0.0.0.0, aby uniknąć problemów z połączeniem między kontenerami Docker a CrowdSec.

Uruchom ponownie CrowdSec:

systemctl restart crowdsec

Przetestuj połączenie z proxy Coolify:

docker exec coolify-proxy wget -qO- http://host.docker.internal:8095/v1/heartbeat

Uwaga: 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 -y

Zweryfikuj instalację:

cscli metrics

Poszukaj 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):

  1. Zarejestruj się na https://app.crowdsec.net/signup
  2. Skopiuj komendę rejestracji z konsoli
  3. Wykonaj: cscli console enroll XXXXX
  4. Zatwierdź rejestrację w konsoli internetowej

Krok 5: Konfiguracja integracji z Traefik

Wygeneruj klucz API bouncer dla Traefik:

cscli bouncers add traefik-bouncer

Zapisz wygenerowany klucz – będziesz go potrzebować w następnym kroku.

Utwórz konfigurację wtyczki CrowdSec dla Traefik:

nano /data/coolify/proxy/dynamic/crowdsec-plugin.yaml
http:
middlewares:
crowdsec:
plugin:
bouncer:
crowdsecMode: live
crowdsecLapiHost: 'host.docker.internal:8095'
crowdsecLapiKey: 'TWOJ_KLUCZ_API_BOUNCER_TUTAJ'
enabled: true

Krok 6: Konfiguracja Proxy Coolify

Znajdź najnowszą wersję wtyczki Traefik bouncer na https://github.com/maxlerebourg/crowdsec-bouncer-traefik-plugin (sprawdź zakładkę releases).

Utwórz katalog dla access-logs:

mkdir -p /data/coolify/proxy/accesslogs/

Edytuj konfigurację proxy Coolify:

nano /data/coolify/proxy/docker-compose.yml

Dodaj 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.4.2' # 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/accesslogs/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.insecure=true'
- '--entryPoints.https.forwardedHeaders.insecure=true'

Ważne: Po edycji pliku docker-compose.yml zawsze uruchom:

docker compose up -d

Wskazówki debugowania

Jeśli napotkasz problemy, sprawdź logi Traefik:

docker logs coolify-proxy

Szukaj 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

Aby zapobiec zbyt dużemu wzrostowi logów dostępu, skonfiguruj rotację logów:

nano /etc/logrotate.d/traefik
/data/coolify/proxy/accesslogs/access.log {
  size 10M
  rotate 5
  missingok
  notifempty
  extension .log
  maxage 14
  postrotate
    docker kill --signal="USR1" coolify-proxy
  endscript
}

Ta konfiguracja:

  • Rotuje logi gdy osiągną 10MB
  • Przechowuje 5 rotowanych plików
  • Usuwa logi starsze niż 14 dni
  • Sygnalizuje Traefik ponowne otwarcie plików logów po rotacji

Przenieś logrotate z codziennego na godzinne uruchamianie:

mv /etc/cron.daily/logrotate /etc/cron.hourly/
systemctl restart cron

Przetestuj konfigurację:

logrotate /etc/logrotate.d/traefik

Krok 8: Włączenie CrowdSec dla Twoich aplikacji w Coolify

Aby chronić swoje aplikacje Coolify za pomocą CrowdSec:

  1. Przejdź do panelu Coolify
  2. Otwórz swoją stronę/usługę
  3. Kliknij „Edit compose file”
  4. Dodaj etykietę middleware CrowdSec:
labels:
- coolify.traefik.middlewares=crowdsec@file

Uruchom ponownie Traefik:

cd /data/coolify/proxy
docker compose up -d
docker restart coolify-proxy

Krok 9: Konfiguracja analizy logów

Zainstaluj kolekcję Traefik do parsowania logów:

cscli collections install crowdsecurity/traefik
systemctl reload crowdsec

Skonfiguruj CrowdSec do analizy logów Traefik:

nano /etc/crowdsec/acquis.yaml

Dodaj:

---
filenames:
- /data/coolify/proxy/accesslogs/access.log
labels:
type: traefik

Uruchom ponownie obie usługi:

docker restart coolify-proxy
systemctl restart crowdsec

Krok 10: Testowanie konfiguracji

Przetestuj konfigurację, aby upewnić się, że wszystko działa prawidłowo.

Sprawdź logi dostępu

Monitoruj /data/coolify/proxy/accesslogs/access.log pod kątem przychodzących żądań:

tail -f /data/coolify/proxy/accesslogs/access.log | jq

Przetestuj 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 10m

Zweryfikuj 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_IP

Zaawansowane 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.html

Zarejestruj się w hCaptcha na https://www.hcaptcha.com i uzyskaj klucz strony i sekretny klucz.

Skonfiguruj profil CAPTCHA:

nano /etc/crowdsec/profiles.yaml
name: captcha_remediation
filters:
- Alert.Remediation == true && Alert.GetScope() == "Ip" && Alert.GetScenario() contains "http" && GetDecisionsSinceCount(Alert.GetValue(), "24h") <= 3
decisions:
- type: captcha
duration: 4h

notifications:
- discord
on_success: break
---

Zaktualizuj konfigurację bouncera:

nano /data/coolify/proxy/dynamic/crowdsec-plugin.yaml
http:
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

Przetestuj 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 captcha

Odwiedź 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 captcha

Powiadomienia Discord

Otrzymuj natychmiastowe alerty o zdarzeniach bezpieczeństwa

Utwórz plik konfiguracji powiadomień:

nano /etc/crowdsec/notifications/discord.yaml
type: http
name: discord
log_level: info
format: |
{
"embeds": [
{
"title": "🚨 CrowdSec Security Alert",
"color": 15158332,
"description": "{{range . -}}{{$alert := . -}}{{range .Decisions -}}**IP**: `{{.Value}}`\n**Action**: {{.Type}}\n**Duration**: {{.Duration}}\n**Scenario**: {{.Scenario}}\n\n🔍 **Quick Analysis:**\n [Whois](https://www.whois.com/whois/{{.Value}}) | [Shodan](https://www.shodan.io/host/{{.Value}}) | [AbuseIPDB](https://www.abuseipdb.com/check/{{.Value}}) | [VirusTotal](https://www.virustotal.com/gui/ip-address/{{.Value}})\n\n{{end -}}{{end -}}",
"footer": {
"text": "CrowdSec Security Engine"
}
}
]
}
url: URL_TWOJEGO_WEBHOOK_DISCORD
method: POST
headers:
Content-Type: application/json

Włącz powiadomienia w profilach

Edytuj konfigurację profili:

nano /etc/crowdsec/profiles.yaml

Dodaj do domyślnego profilu:

name: default_ip_remediation
filters:
- Alert.Remediation == true && Alert.GetScope() == "Ip"
decisions:
- type: ban
duration: 12h
notifications:
- discord
on_success: break

Przetestuj powiadomienia Discord

Uruchom ponownie CrowdSec i przetestuj system powiadomień:

systemctl restart crowdsec
cscli notifications test discord

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.yaml
name: 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"

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 list

Analiza logów

Monitoruj co wykrywa CrowdSec:

bash# 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 -10

Rozwią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!

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry