diff --git a/README.md b/README.md index d65ee2c..b24e5bc 100644 --- a/README.md +++ b/README.md @@ -286,6 +286,7 @@ The aims is to provide a ready-to-run recipes that you can just copy, paste and - [change-detection](apps/other/change-detection.md) - [Cockpit](apps/other/cockpit.md) - [Code server](apps/other/code.md) +- [Crowdsec](apps/other/crowdsec.md) - [Firefox](apps/other/firefox.md) - [Firefox sync server](apps/other/firefox-sync.md) - [LanguageTool server](apps/other/language-tool.md) diff --git a/apps/other/crowdsec.md b/apps/other/crowdsec.md new file mode 100644 index 0000000..ea577df --- /dev/null +++ b/apps/other/crowdsec.md @@ -0,0 +1,150 @@ +# Crowdsec + +It's basically a self-hosted crowd-based firewall. +Setup is a bit cumbersome but (probably) well worth it :-) + +
+ +- [Homepage](https://www.crowdsec.net) +- [Github repo](https://github.com/crowdsecurity/crowdsec) +- [Docker Hub](https://hub.docker.com/r/crowdsecurity/crowdsec) +- [Crowdsec Hub](https://hub.crowdsec.net) +- [Traefik bouncer](https://github.com/fbonalair/traefik-crowdsec-bouncer) +- [Collections](https://hub.crowdsec.net/browse/#collections) + + + +## How does that work +- There are 2 parts of the solution: analyser & bouncer +- Crowdsec container (below) just basically analyses your server logs +- Bouncer container (below) uses the analysis to bounce off the potential attacks + +## Local Setup +This describes how to setup crowdsec with traefik bouncer. There are other bouncers you can use (if you don't use traefik). + +1. Create 2 files with the following content (`acquis.yml` and `docker-compose.yml`). Remember to update the paths to your logs in `docker-compose.yml`! +2. Start the containers (`docker compose up -d`) +3. Wait a minute or so (until it finishes installing collections), you can follow the logs to see what's going on (`docker compose logs -f`) +4. Add bouncer to the crowdsec instance: + ```sh + docker exec crowdsec cscli bouncers add traefik-bouncer + ``` +5. Copy the API key printed in the command output and paste it back in the `docker-compose.yml` in the bouncer config (`CROWDSEC_BOUNCER_API_KEY`) +6. Restart the containers +7. That's it. + +## Online console +Unless you want to have an online console, than do this as well: +1. Register at https://app.crowdsec.net/ +2. Enroll your instance, with the API key from there, e.g.: + ```sh + docker exec crowdsec cscli console enroll cl8m56qpu00060vlcwgj898z0 + ``` + +## Traefik middleware +1. Add traefik middleweare in the dynamic config, e.g. + ```toml + [http.middlewares.crowdsec.forwardauth] + address = "http://:3300/api/v1/forwardAuth" + ``` +2. Use this middleware in your services, e.g. + ```toml + [http.routers.authelia] + rule ="Host(`login.domain.com`)" + service = "authelia" + tls = { } + middlewares = [ "crowdsec" ] + ``` + + +## acquis.yml +```yml +--- +filenames: + - /logs/auth.log + - /logs/syslog + - /logs/kern.log +labels: + type: syslog + +--- +filenames: + - /logs/apache2/*.log + - /logs/*httpd*.log + - /logs/httpd/*log +labels: + type: apache2 + +--- +filenames: + - /logs/nginx/*.log +labels: + type: nginx + +--- +filenames: + - /logs/authelia.log +labels: + type: authelia + +--- +filenames: + - /logs/traefik/*.log +labels: + type: traefik +``` + +## docker-compose.yml +```yml +--- +services: + crowdsec: + image: crowdsecurity/crowdsec + container_name: crowdsec + restart: unless-stopped + environment: + - GID="${GID-1000}" + - COLLECTIONS=crowdsecurity/linux crowdsecurity/iptables crowdsecurity/apache2 crowdsecurity/sshd crowdsecurity/traefik LePresidente/authelia crowdsecurity/nginx crowdsecurity/base-http-scenarios + volumes: + - /var/log/auth.log:/logs/auth.log:ro + - /var/log/syslog.log:/logs/syslog.log:ro + - /var/log/kern.log:/logs/kern.log:ro + - /var/log/apache:/logs/apache:ro + - /var/log/httpd:/logs/httpd:ro + - /var/log/authelia.log:/logs/authelia.log:ro + - /var/log/traefik/logs:/logs/traefik:ro + + - ./acquis.yml:/etc/crowdsec/acquis.yaml + - ./data:/var/lib/crowdsec/data/ + - ./config:/etc/crowdsec/ + + bouncer: + image: fbonalair/traefik-crowdsec-bouncer + container_name: crowdsec-bouncer + restart: unless-stopped + environment: + - PORT=8090 + - CROWDSEC_BOUNCER_API_KEY=changeme + - CROWDSEC_AGENT_HOST=crowdsec:8080 + ports: + - 3300:8090 +``` + + +## Useful commands + +1. List installed items +```sh +docker exec crowdsec cscli scenarios list +docker exec crowdsec cscli collections list +docker exec crowdsec cscli parsers list +``` + +2. Block/unblock an ip +```sh +docker exec crowdsec cscli decisions add --ip 192.168.1.1 +docker exec crowdsec cscli decisions remove --ip 192.168.1.1 +docker exec crowdsec cscli decisions list +docker exec crowdsec cscli decisions help # display help on decisions command +docker exec crowdsec cscli decisions add --help # display help on add command +```