Что вам понадобится
- Небольшой опыт использования 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