LemonSec/README.md

313 lines
8.3 KiB
Markdown

# LemonSec 🍋
A comprehensive, security-focused reverse proxy and authentication stack for homelab and small business deployments.
## Architecture
```
Internet → Cloudflare → Traefik → {Authelia → Your Services}
CrowdSec (threat detection)
AdGuard Home (internal DNS)
```
### For TrueNAS Scale Users
If you run Nextcloud on TrueNAS Scale (separate VM), LemonSec acts as the secure gateway:
```
Internet → Cloudflare → Traefik (Proxmox VM) → TrueNAS Nextcloud
Authelia (family SSO)
```
See [SETUP-TRUENAS-NEXTCLOUD.md](SETUP-TRUENAS-NEXTCLOUD.md) for step-by-step guide.
## Components
| Component | Purpose | External | Internal |
|-----------|---------|----------|----------|
| **Traefik** | Reverse Proxy & Load Balancer | ✅ 443/80 | ✅ 8443 |
| **Authelia** | SSO & 2FA Authentication | ✅ auth.lemonlink.eu | ✅ |
| **CrowdSec** | Intrusion Detection/Prevention | ✅ | ✅ |
| **AdGuard Home** | DNS + Ad Blocking | ❌ | ✅ DNS |
| **Redis** | Session Storage | ❌ | ✅ |
## Network Segmentation
### External Network (`traefik-external`)
- **Entry**: Cloudflare (orange cloud)
- **Security**: CrowdSec + Authelia 2FA
- **Examples**: nextcloud.lemonlink.eu, vault.lemonlink.eu
### Internal Network (`traefik-internal`)
- **Entry**: Tailscale/VPN only
- **Security**: Authelia (one_factor on trusted networks)
- **Examples**: traefik.local.lemonlink.eu, portainer.local.lemonlink.eu
## Quick Start
### 🚀 Deploy via Portainer (Recommended for Proxmox)
The easiest way to deploy on Proxmox with Portainer:
1. **Push to Git**:
```bash
git remote add origin https://git.lemonlink.eu/impulsivefps/LemonSec.git
git push -u origin main
```
2. **In Portainer**:
- **Stacks** → **Add Stack****Repository**
- URL: `https://git.lemonlink.eu/impulsivefps/LemonSec`
- Add environment variables from `stack.env`
- **Deploy**
**Full Portainer guide**: [PORTAINER-DEPLOY.md](PORTAINER-DEPLOY.md)
### 🚀 TrueNAS + Nextcloud Quick Start
If your main goal is securing TrueNAS Nextcloud for family:
```bash
# 1. Clone and configure
cd LemonSec
cp .env.example .env
# Edit: Add Cloudflare API, TrueNAS_IP, Nextcloud port
# 2. Setup
./setup.ps1 # or create secrets manually
# 3. Deploy
docker-compose up -d
docker-compose -f docker-compose.yml -f docker-compose.external.yml up -d
# 4. Configure TrueNAS Nextcloud
# Apps → Nextcloud → Add environment variables
# NEXTCLOUD_TRUSTED_DOMAINS=cloud.lemonlink.eu
# OVERWRITEPROTOCOL=https
# TRUSTED_PROXIES=YOUR_PROXMOX_VM_IP
```
**Full guide**: [SETUP-TRUENAS-NEXTCLOUD.md](SETUP-TRUENAS-NEXTCLOUD.md)
### Migrating from Nginx Proxy Manager?
See [MIGRATE-FROM-NPM.md](MIGRATE-FROM-NPM.md) for side-by-side migration guide.
---
### 1. Prerequisites
- Docker & Docker Compose installed
- Domain managed by Cloudflare
- Tailscale installed on server
- Ports 80/443 forwarded to Proxmox server
### 2. Configuration
```bash
# Clone and setup
cd LemonSec
# Copy and edit environment
cp .env.example .env
nano .env
# Run setup script (generates secrets)
./setup.ps1 # On Windows
# or
bash setup.sh # On Linux
```
### 3. Cloudflare Setup
See [CLOUDFLARE.md](docs/CLOUDFLARE.md) for detailed DNS configuration.
Quick checklist:
- [ ] Create API token with DNS:Edit permissions
- [ ] Add A record pointing to your server IP
- [ ] Enable orange cloud (proxy)
- [ ] Set SSL/TLS mode to "Full (strict)"
- [ ] Enable "Always Use HTTPS"
### 4. Deploy
```bash
# Start core services
docker-compose up -d
# Check Traefik is working
docker-compose logs -f traefik
# Generate CrowdSec API key
docker-compose exec crowdsec cscli bouncers add traefik-bouncer
# Add key to .env, then restart
docker-compose up -d
# Setup Authelia users
docker run authelia/authelia:latest authelia crypto hash generate argon2 --password 'YOUR_PASSWORD'
# Add hash to authelia/users_database.yml
```
### 5. Add Your Services
See [examples/](examples/) for service templates.
```yaml
# docker-compose.override.yml or separate file
services:
myapp:
image: myapp:latest
networks:
- services
labels:
- "traefik.enable=true"
- "traefik.http.routers.myapp.rule=Host(`myapp.lemonlink.eu`)"
- "traefik.http.routers.myapp.entrypoints=websecure"
- "traefik.http.routers.myapp.tls.certresolver=letsencrypt"
- "traefik.http.routers.myapp.middlewares=authelia@docker"
```
## Security Features
### 1. Multi-Factor Authentication
- TOTP (Google Authenticator, Authy, etc.)
- WebAuthn/FIDO2 (YubiKey, Windows Hello, etc.)
- Duo Push (with configuration)
### 2. Threat Detection (CrowdSec)
- Real-time log analysis
- Community blocklists
- Automatic IP banning
- Metrics and alerts
### 3. Network Isolation
- Internal services inaccessible from internet
- External services protected by auth
- Docker network segmentation
### 4. TLS/SSL
- Automatic Let's Encrypt certificates
- Wildcard certificates for subdomains
- Modern TLS 1.3 configuration
### 5. Security Headers
- HSTS (1 year)
- CSP (Content Security Policy)
- X-Frame-Options, X-Content-Type-Options
- Referrer-Policy
## Directory Structure
```
LemonSec/
├── docker-compose.yml # Main stack
├── .env # Your secrets (gitignored)
├── .env.example # Template
├── setup.ps1 # Windows setup
├── traefik/
│ ├── traefik.yml # Static config
│ ├── dynamic/ # Dynamic config
│ │ ├── middlewares.yml # Security middlewares
│ │ └── tls.yml # TLS options
│ ├── crowdsec/ # CrowdSec bouncer config
│ └── logs/ # Access logs
├── authelia/
│ ├── configuration.yml # Authelia settings
│ └── users_database.yml # User accounts
├── crowdsec/
│ └── acquis.yaml # Log sources
├── adguard/ # AdGuard data (volumes)
├── monitoring/ # Prometheus/Grafana configs
├── examples/ # Service examples
└── docs/ # Documentation
```
## Common Operations
### View Logs
```bash
# All services
docker-compose logs -f
# Specific service
docker-compose logs -f traefik
# CrowdSec decisions
docker-compose exec crowdsec cscli decisions list
# CrowdSec metrics
docker-compose exec crowdsec cscli metrics
```
### Update
```bash
# Pull latest images
docker-compose pull
# Recreate containers
docker-compose up -d
```
### Backup
```bash
# Backup volumes
docker run --rm -v lemonsec_authelia-data:/data -v $(pwd):/backup alpine tar czf /backup/authelia-backup.tar.gz -C /data .
docker run --rm -v lemonsec_crowdsec-data:/data -v $(pwd):/backup alpine tar czf /backup/crowdsec-backup.tar.gz -C /data .
# Backup configs
tar czf lemonsec-config-backup.tar.gz traefik/ authelia/ crowdsec/ .env
```
### Add User to Authelia
```bash
# Generate password hash
docker run authelia/authelia:latest authelia crypto hash generate argon2 --password 'NEWPASSWORD'
# Edit authelia/users_database.yml
# Add user entry with hash
# Restart authelia
docker-compose restart authelia
```
## Troubleshooting
### Traefik not getting certificates
1. Check Cloudflare API credentials in `.env`
2. Verify DNS records point to your IP
3. Check Traefik logs: `docker-compose logs traefik`
4. Test with staging first: change `certresolver` to `letsencrypt-staging`
### Authelia redirect loops
1. Check `session.domain` matches your domain
2. Verify cookies aren't blocked
3. Check time sync on server: `ntpdate -s time.cloudflare.com`
### CrowdSec blocking legitimate traffic
```bash
# Check decisions
docker-compose exec crowdsec cscli decisions list
# Remove false positive
docker-compose exec crowdsec cscli decisions delete --ip YOUR_IP
# Add whitelist
docker-compose exec crowdsec cscli parsers install crowdsecurity/whitelists
```
## Security Checklist
- [ ] Change all default passwords
- [ ] Enable 2FA for all users
- [ ] Set up email notifications for Authelia
- [ ] Configure CrowdSec notifications
- [ ] Review Cloudflare security settings
- [ ] Enable fail2ban on host (optional)
- [ ] Regular backups
- [ ] Update images monthly
## License
MIT - Use at your own risk. This is a homelab security stack, not enterprise-grade.