Zabezpieczanie Coolify z CrowdSec: Kompletny poradnik 2025

Wprowadzenie

Logo Crowdsec

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.

Zrzut ekranu przedstawiający powiadomienia Discord od Crowdsec

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
Zrzut ekranu przedstawiający panel Crowdsec

Krok 1: Instalacja CrowdSec

Najpierw zainstaluj CrowdSec na serwerze hostującym Coolify:

Bash
apt update
apt upgrade -y
curl -s https://install.crowdsec.net | sudo bash
apt install crowdsec

Zweryfikuj instalację:

Bash
systemctl status crowdsec

Krok 2: Konfiguracja CrowdSec dla Coolify

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

Bash
nano /etc/crowdsec/config.yaml

Zmodyfikuj sekcję api.server.listen_uri:

YAML
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:

Bash
systemctl restart crowdsec

Przetestuj połączenie z proxy Coolify:

Bash
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:

Bash
apt install crowdsec-firewall-bouncer-nftables -y

Zweryfikuj instalację:

Bash
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:

Bash
cscli bouncers add traefik-bouncer

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

Utwórz konfigurację wtyczki CrowdSec dla Traefik:

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

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

Edytuj konfigurację proxy Coolify:

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

Dodaj te argumenty wiersza poleceń do usługi Traefik:

YAML
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.

Bash
      - '--entryPoints.http.forwardedHeaders.insecure=true'
      - '--entryPoints.https.forwardedHeaders.insecure=true'

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

Bash
docker compose up -d

Wskazówki debugowania

Jeśli napotkasz problemy, sprawdź logi Traefik:

Bash
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:

Bash
nano /etc/logrotate.d/traefik
Bash
/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:

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

Przetestuj konfigurację:

Bash
logrotate /etc/logrotate.d/traefik

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

Aby chronić swoje aplikacje Coolify za pomocą CrowdSec:

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

Uruchom ponownie Traefik:

Bash
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:

Bash
cscli collections install crowdsecurity/traefik
systemctl reload crowdsec

Skonfiguruj CrowdSec do analizy logów Traefik:

Bash
nano /etc/crowdsec/acquis.yaml

Dodaj:

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

Uruchom ponownie obie usługi:

Bash
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ń:

Bash
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:

Bash
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ę:

Bash
cscli decisions remove -i TWOJ_TESTOWY_IP

Zaawansowane funkcje

Integracja CAPTCHA

Zrzut ekranu przedstawiający wyzwanie Captcha od Crowdsec

Do zaawansowanego łagodzenia ataków skonfiguruj wyzwania CAPTCHA:

Pobierz szablon CAPTCHA:

Bash
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:

Bash
nano /etc/crowdsec/profiles.yaml
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:

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

Bash
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:

Bash
cscli decisions remove --ip TWOJ_TESTOWY_IP -t captcha

Darmowe 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

Zrzut ekranu przedstawiający powiadomienia Discord od Crowdsec

Utwórz plik konfiguracji powiadomień:

Bash
nano /etc/crowdsec/notifications/discord.yaml
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:

Bash
nano /etc/crowdsec/profiles.yaml

Dodaj do domyślnego profilu:

YAML
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ń:

Bash
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.

Bash
nano /etc/crowdsec/parsers/s02-enrich/whitelists.yaml
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:

Bash
# 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!

Dołącz do newslettera

Subskrybuj po bonusowe treści. Nie przegap nowych artykułów.

    We won’t send you spam. Unsubscribe at any time.

    Zostaw komentarz

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

    Przewijanie do góry