Skip to main content

HAProxy und CrowdSec

Stichpunkte

Auf dem Webserver

Apache Config
sudo echo "RemoteIPHeader X-Forwarded-For" >> /etc/apache2/apache2.conf
sudo sed -i 's,LogFormat "%h %l %u %t \\"%r\\" %>s %O \\"%{Referer}i\\" \\"%{User-Agent}i\\"" combined,LogFormat "%a %l %u %t \\"%r\\" %>s %O \\"%{Referer}i\\" \\"%{User-Agent}i\\"" combined,g' /etc/apache2/apache2.conf

sudo a2enmod remoteip
sudo systemctl restart apache2

Wichtig ist das, damit Apache2 die richtige Client IP über die option forwardfor aus der Firewall erhält und Loggt

CrowdSec Installation

 

curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt install crowdsec crowdsec-blocklist-mirror crowdsec-firewall-bouncer-iptables

# Der Configuration unter db_config "use_wal: true" hinzufügen
sudo vi /etc/crowdsec/config.yaml

db_config:
  log_level: info
  type: sqlite
  db_path: /var/lib/crowdsec/data/crowdsec.db
  use_wal: true

Für die Blockliste die listen_uri: anassen;
vi /etc/crowdsec/bouncers/crowdsec-blocklist-mirror.yaml

listen_uri: WebserverIP:41412

sudo service crowdsec start

Optional für das Dashboard auf https://www.crowdsec.net/ Kostenlos Registrieren um die ID zu erhalten.

sudo cscli console enroll <id>

Auf der PFSense

Pakete auf der pfsense:

acme, cron, haproxy

Schnittstellen:

Wan, Lan, DMZ (opt1)

Verfahren:

Zertifikat

Dienste -> Acme Certificates -> Account Key
Name: Webserver-Key
ACME-Server: Let's Encrypt Production ACME v2
E-Mail: youre@email.de
-> Create new account key
-> Register ACME account key
-> Speichern

Zum Verifizieren der Domaininhaber gibt es unterschiedliche Methoden, wie z.B. Standalone Webserver.
Ich werde hier DNS mit OVH verwenden, dazu habe ich bei OVH 
- Application Key
- Application Secret
- Consumer Key
erstellt. Endpoint ist bei mir OVH Europe.
Damit erstellt dann ACME einen DNS Eintrag zu deiner Domäne bei OVH, den Lets Encrypt dann abfragen und verifizieren kann.

Dienste -> Acme Certificates -> Certificates
Name: Webserver-Cert
Acme Account: Webserver-Key
Private Key: 2048-bit RSA
Domain SAN list:
Mode: Enable, Domainname=deine.domain.de, Methode= DNS-OVH
(Optional weiterer Eintrag für Wildcard)
Mode: Enable, Domainname=*.deine.domain.de, Methode= DNS-OVH
-> Speichern

HAProxy

Dienste -> HAProxy -> Settings
Enable HAProxy
Maximum Connection = 5000
-> Speichern

Dienste -> HAProxy -> Backend
->Hinzufügen
Name=Webservers

Serverlist Hinzufügen
Mode=Active
Name=Webserver1
ForwardTo=Address+Port
Address=IP des Backendserver
Port=443
Encrypt (SSL)=true
SSL Check=false


Advanced settings
Backend pass thru = option forwardfor 

Wichtig für Crowdsec:
die Option Backend pass thru=option forwardfor, damit das Backend die IP des echten Clients erhält.

->Speichern

Dienste -> HAProxy -> Frontend
Erstmal die http-to-https Weiterleitung
->Hinzufügen

Name=http-to-https
External Address
Listen Adress=WAN
Port=80

Typ=http/https (offloading)

ACL bleibt leer

Aktionen:
Action= http-request redirect
rule=scheme https
-> Speichern

Dann das eigentliche Frontend
-> Hinzufügen
Name=Frei wählbar
External Address
Listen Adress=WAN
Port=443
SSL Offloading=true
Typ=http/https (offloading)

ACL:
Name: WebACL1
Expression= Host Matches
Value=deine.domain.de

Aktionen:
Use Backend
Condition acl names=WebACL1
Backend=Webservers

SSL offloading:
Zertifikat=Webserver-Cert
->Speichern

Firewallregeln

Firewall->Aliase->URLs
Name: Crowdsec_Blocklist
Typ: URL Table (IPs)
URL Table (IPs): http://10.200.4.20:41412/security/blocklist / 1
->Speichern

Firewall->Regeln->WAN
->Hinzufügen
Aktion: Blockieren
Schnittstelle: WAN
Adressfamilie: IPv4+IPv6
Protokoll: Alle
Quelle: Einzelner Host oder Alias, Crowdsec_Blocklist
Ziel: Alle
->Speichern

->Hinzufügen
Aktion: Erlauben
Schnittstelle: WAN
Adressfamilie: IPv4
Protokoll: TCP
Quelle: Alle
Ziel: WAN Address
Bereich der Zielports: HTTPS (443)
->Speichern

->Hinzufügen
Aktion: Erlauben
Schnittstelle: WAN
Adressfamilie: IPv4
Protokoll: TCP
Quelle: Alle
Ziel: WAN Address
Bereich der Zielports: HTTPS (443)
->Speichern

Cronjob für Alias-Table

Normalweise wird die Alias Table-URL nur 1x am Tag abgerufen.
Damit dies aber schneller geht, fügen wir eine Cronjob hinzu, der jede Minute ausgeführt wird.

Dienste -> cron
Minute: *
Stunde: *
Day of the Month: *
Month of the Year: *
Day of the Week: *
Benutzer: root
Command: /usr/bin/nice -n20 /etc/rc.update_urltables now forceupdate

Quellen und nützliches:
https://docs.crowdsec.net/docs/next/getting_started/install_crowdsec/
https://youtu.be/gJLxWWPQ9hU?si=-iVsbRrN5Do4au5U
https://schroederdennis.de/tutorial-howto/crowdsec-auf-proxmox-ve-8-installieren-und-einrichten-howto/
https://goneuland.de/crowdsec-firewall-bouncer-installieren/