Перейти к содержимому

Безопасность

SSL, аутентификация и защита n8n в production

  • HTTPS включён
  • Encryption key установлен
  • Аутентификация настроена
  • Firewall настроен
  • Credentials зашифрованы
  • Регулярные бэкапы
  1. Установите certbot

    Окно терминала
    sudo apt install certbot python3-certbot-nginx
  2. Получите сертификат

    Окно терминала
    sudo certbot --nginx -d n8n.example.com
  3. Настройте nginx

    server {
    listen 443 ssl http2;
    server_name n8n.example.com;
    ssl_certificate /etc/letsencrypt/live/n8n.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/n8n.example.com/privkey.pem;
    # Современные SSL настройки
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;
    # HSTS
    add_header Strict-Transport-Security "max-age=31536000" always;
    location / {
    proxy_pass http://localhost:5678;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }
    }
  4. Автопродление

    Окно терминала
    sudo certbot renew --dry-run

Используйте Full (strict) SSL mode:

  1. Cloudflare → Origin Server → SSL/TLS
  2. Encryption mode: Full (strict)
  3. Создайте Origin Certificate
Окно терминала
# Linux/Mac
openssl rand -hex 32
# Или
head -c 32 /dev/urandom | base64
.env
N8N_ENCRYPTION_KEY=your_32_char_key_here_xxxxxxxxxxxxxx

Встроенная система пользователей:

Окно терминала
# Включена по умолчанию в новых версиях

Возможности:

  • Регистрация пользователей
  • Роли (owner, admin, member)
  • Приглашения по email
Окно терминала
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=secure_password
РольПрава
OwnerПолный доступ
AdminУправление пользователями, workflows
MemberРабота с workflow (ограниченно)
  • Owner может шарить workflows
  • Member видит только shared workflows
  • Credentials шарятся отдельно
Окно терминала
# Разрешить только HTTPS
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# Заблокировать прямой доступ к n8n
sudo iptables -A INPUT -p tcp --dport 5678 -s 127.0.0.1 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5678 -j DROP
Окно терминала
sudo ufw allow 443/tcp
sudo ufw allow 80/tcp
sudo ufw deny 5678/tcp

В Webhook ноде:

  • Header Auth — проверка заголовка
  • Basic Auth — логин/пароль
  • JWT — валидация токена

Через nginx:

location /webhook/ {
allow 1.2.3.4; # Allowed IP
deny all;
proxy_pass http://localhost:5678;
}
Окно терминала
# Случайный path
WEBHOOK_URL=https://n8n.example.com/webhook-xxxx-random-path/

Credentials шифруются с помощью N8N_ENCRYPTION_KEY:

  • AES-256-GCM
  • Ключ не покидает сервер
  1. Минимальные права — создавайте API ключи с минимальными правами
  2. Ротация — регулярно меняйте credentials
  3. Аудит — отслеживайте использование

n8n уже работает под user node, но проверьте:

services:
n8n:
user: "1000:1000"
security_opt:
- no-new-privileges:true
services:
n8n:
read_only: true
tmpfs:
- /tmp
volumes:
- n8n_data:/home/node/.n8n
networks:
frontend:
backend:
services:
n8n:
networks:
- frontend
- backend
postgres:
networks:
- backend # Только внутренняя сеть
Окно терминала
N8N_LOG_LEVEL=info
N8N_LOG_OUTPUT=file
N8N_LOG_FILE_LOCATION=/var/log/n8n/n8n.log

Отслеживайте:

  • Логины пользователей
  • Изменения workflows
  • Создание credentials
  • Активации workflows
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self'" always;
# Rate limit zone
limit_req_zone $binary_remote_addr zone=n8n:10m rate=10r/s;
server {
location / {
limit_req zone=n8n burst=20 nodelay;
proxy_pass http://localhost:5678;
}
}
location /webhook/ {
limit_req zone=n8n burst=5;
proxy_pass http://localhost:5678;
}
Окно терминала
# Бэкап с шифрованием
pg_dump -U n8n n8n | gzip | \
gpg --symmetric --cipher-algo AES256 > backup.sql.gz.gpg
# Восстановление
gpg --decrypt backup.sql.gz.gpg | gunzip | \
psql -U n8n n8n
  • Отдельное хранилище (S3, GCS)
  • Encryption at rest
  • Access logging