Настройка Nginx Proxy Manager + Crowdsec

Что вам понадобится

  • Небольшой опыт использования docker
  • Машина с docker уже настроена для этого руководства я буду использовать экземпляр portainer
  • Домен, уже указывающий на ваш старый экземпляр Nginx proxy manager (я предполагаю, что вы настроили его с помощью базы данных)

Настройка Nginx Proxy Manager

Во-первых, нам нужно будет настроить Nginx Proxy Manager через его docker-compose Я буду использовать форк baudneo, потому что нам все равно нужно будет использовать этот форк позже. Убедитесь, что вы установили для своих паролей к базе данных что-то другое.
Вам также нужно будет выполнить следующее перед запуском docker-compose up -d

mkdir /Nginx-Proxy-Manger
touch /Nginx-Proxy-Manger/crowdsec-openresty-bouncer.conf
# https://hub.docker.com/r/baudneo/nginx-proxy-manager
# https://www.crowdsec.net/blog/crowdsec-with-nginx-proxy-manager
version: "3"
services:
  app:
    # image: 'jc21/nginx-proxy-manager:latest'
    image: 'baudneo/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format :
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      # crowdsec config
      TZ: Europe/Moscow
      ADMIN_PANEL_LOG: "1"
      CROWDSEC_BOUNCER: "1"
      OPENRESTY_DEBUG: "0"

      CROWDSEC_LAPI: "http://crowdsecip:8080/"
      CROWDSEC_KEY: "yourkeyhere"

      DB_MYSQL_HOST: "172.25.0.3"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "Verygoodpassword"
      DB_MYSQL_NAME: "npm"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - /Nginx-Proxy-Manger/data:/data
      - /Nginx-Proxy-Manger/letsencrypt:/etc/letsencrypt
      - /Nginx-Proxy-Manger/crowdsec-openresty-bouncer.conf:/data/crowdsec/crowdsec-openresty-bouncer.conf
    depends_on:
      - db
    networks:
      nginx:
        ipv4_address: 172.25.0.2

  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'Verygoodpassword'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'Verygoodpassword'
    volumes:
      - /Nginx-Proxy-Manger/data/mysql:/var/lib/mysql
    networks:
      nginx:
        ipv4_address: 172.25.0.3

networks:
  nginx:
    ipam:
      driver: default
      config:
        - subnet: 172.25.0.0/16

Теперь запустите docker-compose up -d –force-recreate

Теперь перейдите по ссылке http://dockerhost:81 и войдите в систему

Пароль по умолчанию при первой настройке

Логин: “admin@example.com”
Пароль: “changeme”

Настройка Crowdsec и Метабазы

Теперь нам нужно будет настроить Crowdsecs agent для отслеживания журналов наших прокси-менеджеров Nginx.

Шаг первый выполните следующие команды

nano ./crowdsec/acquis.yaml

Теперь поместите в этот файл следующее

# https://www.reddit.com/r/selfhosted/comments/ujdzwu/how_do_i_install_crowdsec_on_my_nginx_proxy/
# https://hub.crowdsec.net/author/crowdsecurity/collections/nginx-proxy-manager
filenames:
 - /var/logs/default-host_access.log
 - /var/logs/proxy-host-*_access.log
 - /var/logs/proxy-host-*_error.log
labels:
  type: nginx-proxy-manager

Шаг второй отредактируйте / создайте этот файл

nano ./crowdsec/profiles.yaml

теперь поместите в этот файл следующее

name: captcha_remediation
filters:
- Alert.Remediation == true && Alert.GetScope() == "Ip" && Alert.GetScenario() startsWith "crowdsecurity/http-"
decisions:
- type: captcha
  duration: 4h
on_success: break
---

name: default_ip_remediation
#debug: true
filters:
 - Alert.Remediation == true && Alert.GetScope() == "Ip"
decisions:
 - type: ban
   duration: 4h
# notifications:
#   - slack_default  # Set the webhook in /etc/crowdsec/notifications/slack.yaml before enabling this.
#   - splunk_default # Set the splunk url and token in /etc/crowdsec/notifications/splunk.yaml before enabling this.
#   - http_default   # Set the required http parameters in /etc/crowdsec/notifications/http.yaml before enabling this.
#   - email_default  # Set the required email parameters in /etc/crowdsec/notifications/email.yaml before enabling this.
on_success: break

Теперь пришло время для файла docker-compose

version: '3'
# https://github.com/crowdsecurity/example-docker-compose/blob/main/docker-compose.yml

services:
  crowdsec:
    image: crowdsecurity/crowdsec:v1.3.4
    restart: always
    ports:
      - 8080:8080
    environment:
      # список приложений, которые мы хотим установить
      #https://hub.crowdsec.net/author/crowdsecurity/collections/nginx
      COLLECTIONS: "crowdsecurity/linux crowdsecurity/nginx-proxy-manager crowdsecurity/base-http-scenarios"
      #COLLECTIONS: "crowdsecurity/cloudflare-bouncer"
      GID: "${GID-1000}"
      TZ: Europe/Moscow
    volumes:
      - ./crowdsec/acquis.yaml:/etc/crowdsec/acquis.yaml
      - ./crowdsec/profiles.yaml:/etc/crowdsec/profiles.yaml
      - /Nginx-Proxy-Manger/data/logs:/var/logs
      - crowdsec-db:/var/lib/crowdsec/data/
      - crowdsec-config:/etc/crowdsec/
    networks:
      crowdsec:
        ipv4_address: 172.23.0.2

  # метабаза, потому что безопасность — это круто, но дашборды — еще круче
  dashboard:
    # мы используем собственный Dockerfile, чтобы в метабазе появлялись предварительно настроенные информационные панели.
    build: ./crowdsec/dashboard
    restart: always
    ports:
      - 3000:3000
    environment:
      MB_DB_FILE: /data/metabase.db
      MGID: "${GID-1000}"
      TZ: Australia/Perth
    depends_on:
      - 'crowdsec'
    volumes:
      - crowdsec-db:/metabase-data/
    networks:
      crowdsec:
        ipv4_address: 172.23.0.3

volumes:
  logs:
  crowdsec-db:
  crowdsec-config:

networks:
  crowdsec:
    ipam:
      driver: default
      config:
        - subnet: 172.23.0.0/24

Создайте файл docker для панели мониторинга

mkdir ./crowdsec/dashboard
nano ./crowdsec/dashboard/Dockerfile

Вставьте в него следующее

FROM metabase/metabase
RUN mkdir /data/ && wget https://crowdsec-statics-assets.s3-eu-west-1.amazonaws.com/metabase_sqlite.zip && unzip metabase_sqlite.zip -d /data/

Теперь запустите docker-compose up -d –force-recreate

Проверьте, что агент правильно понимает журналы, с помощью следующей команды. Убедитесь, что он проанализировал несколько строк.

docker exec crowdsec cscli metrics

Настройка Nginx Proxy Manager bouncer с помощью Crowdsec

Вам нужно будет получить ключ API от вашего локального агента, для этого нужно будет выполнить следующую команду. Убедитесь, что вы поместили этот ключ в безопасное место, потому что нет способа найти ключ после первоначальной генерации.

docker exec crowdsec cscli bouncers add npm-proxy

Теперь мы собираемся взять этот ключ и добавить его в docker-compose Nginx proxy manager, изменив следующее в вашем файле docker-compose.

Вам также нужно будет добавить IP-адрес вашего агента crowdsec, это будет http://dockerhostip:8080/

CROWDSEC_LAPI: "http://crowdsecip:8080/" CROWDSEC_KEY: "yourkeyhere"

Вам также нужно будет отредактировать следующий файл /Nginx-Proxy-Manger/crowdsec-openresty-bouncer.conf и ввести в него следующее вместе с секретным ключом reCAPTCHA и ключом сайта, который вы можете создать здесь .

ENABLED=true
API_URL=http://dockerhostip:8080
API_KEY=API-Key-Here
CACHE_EXPIRATION=1
# bounce for all type of remediation that the bouncer can receive from the local API
BOUNCING_ON_TYPE=all
FALLBACK_REMEDIATION=ban
REQUEST_TIMEOUT=3000
UPDATE_FREQUENCY=10
# live or stream
MODE=live
# exclude the bouncing on those location
EXCLUDE_LOCATION=
#those apply for "ban" action
# /!\ REDIRECT_LOCATION and RET_CODE can't be used together. REDIRECT_LOCATION take priority over RET_CODE
BAN_TEMPLATE_PATH=/crowdsec/templates/ban.html
REDIRECT_LOCATION=
RET_CODE=
#those apply for "captcha" action
# ReCaptcha Secret Key
SECRET_KEY= ReCaptchaSecretkeyhere
# Recaptcha Site key
SITE_KEY=RecaptchaSitekeyhere
CAPTCHA_TEMPLATE_PATH=/crowdsec/templates/captcha.html
CAPTCHA_EXPIRATION=3600

Теперь запустите docker-compose up -d –force-recreate

Тестирование

Чтобы проверить, что всё было правильно настроено, мы запретим себе делать это, выполнив следующие команды:

# To ban docker exec crowdsec cscli decisions add --ip 192.168.0.101

# To unban docker exec crowdsec cscli decisions add --ip 192.168.0.101