Add Server readme
This commit is contained in:
169
Server/README.md
Normal file
169
Server/README.md
Normal file
@ -0,0 +1,169 @@
|
||||
# Webhook Server
|
||||
|
||||
Secure Flask-based webhook service for receiving and processing security alerts from Particle IoT devices, with enterprise-grade features including authentication, rate limiting, and comprehensive logging.
|
||||
|
||||
## 🎯 Overview
|
||||
|
||||
This webhook service provides:
|
||||
- **Dual Authentication**: HMAC signatures for generic webhooks, Bearer tokens for Particle webhooks
|
||||
- **Security Hardening**: Rate limiting, security headers, input validation
|
||||
- **Enterprise Integration**: Docker containerization, Traefik reverse proxy support
|
||||
- **Monitoring Ready**: Comprehensive logging, health checks, metrics endpoints
|
||||
- **Notification Support**: Email/SMS alerts with rich formatting
|
||||
|
||||
## 🏗️ Architecture
|
||||
|
||||
```
|
||||
Internet ──▶ Traefik ──▶ Webhook Service ──▶ Notifications
|
||||
(SSL) (Docker) (Email/SMS)
|
||||
│
|
||||
├─ Rate Limiting
|
||||
├─ Security Headers
|
||||
├─ Authentication
|
||||
└─ Health Checks
|
||||
```
|
||||
|
||||
### Key Components
|
||||
- **Flask Application**: Lightweight webhook processor
|
||||
- **Gunicorn WSGI Server**: Production-grade application server
|
||||
- **Docker Container**: Isolated, reproducible deployment
|
||||
- **Traefik Integration**: Automatic SSL, load balancing, monitoring
|
||||
- **Health Monitoring**: Built-in health checks and status endpoints
|
||||
|
||||
## 🔐 Security Features
|
||||
|
||||
### Authentication Methods
|
||||
1. **Particle Webhooks**: Bearer token authentication
|
||||
```
|
||||
Authorization: Bearer your-particle-secret
|
||||
User-Agent: ParticleBot/1.0
|
||||
```
|
||||
|
||||
2. **Generic Webhooks**: HMAC-SHA256 signature verification
|
||||
```
|
||||
X-Hub-Signature-256: sha256=computed-hmac-signature
|
||||
```
|
||||
|
||||
### Security Hardening
|
||||
- **Rate Limiting**: 10 requests/minute average, 20 burst
|
||||
- **Security Headers**: XSS protection, content type sniffing prevention
|
||||
- **Input Validation**: JSON schema validation, required field checking
|
||||
- **Non-root Container**: Runs as unprivileged user
|
||||
- **Minimal Attack Surface**: Only required packages installed
|
||||
|
||||
### Network Security
|
||||
- **TLS Termination**: Handled by Traefik reverse proxy
|
||||
- **Internal Networks**: Container-to-container communication only
|
||||
- **No Direct Exposure**: No ports directly exposed to internet
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### Prerequisites
|
||||
- Docker and Docker Compose
|
||||
- Traefik reverse proxy (with external network)
|
||||
- Gmail account with app password
|
||||
- Domain name pointing to your server
|
||||
|
||||
### 1. Clone and Setup
|
||||
```bash
|
||||
# Clone the repository
|
||||
git clone https://github.com/yourusername/security-device-system.git
|
||||
cd security-device-system/webhook-server
|
||||
|
||||
# Copy environment template
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
### 2. Configure Environment
|
||||
```bash
|
||||
# Edit environment variables
|
||||
nano .env
|
||||
|
||||
# Required variables:
|
||||
FLASK_SECRET_KEY=your-flask-secret-key
|
||||
WEBHOOK_SECRET=your-hmac-webhook-secret
|
||||
PARTICLE_WEBHOOK_SECRET=your-particle-bearer-secret
|
||||
SMTP_EMAIL=your-email@gmail.com
|
||||
SMTP_PASSWORD=your-gmail-app-password
|
||||
RECIPIENT_EMAIL=your-phone@carrier.com
|
||||
```
|
||||
|
||||
### 3. Deploy Service
|
||||
```bash
|
||||
# Build and start the service
|
||||
docker compose up -d --build
|
||||
|
||||
# Check service status
|
||||
docker compose ps
|
||||
|
||||
# Monitor logs
|
||||
docker compose logs -f webhook-service
|
||||
```
|
||||
|
||||
### 4. Verify Deployment
|
||||
```bash
|
||||
# Test health endpoint
|
||||
curl https://webhook.yourdomain.com/health
|
||||
|
||||
# Should return:
|
||||
# {"status": "healthy", "timestamp": "2024-01-07T..."}
|
||||
```
|
||||
|
||||
## 📝 Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
| Variable | Description | Example |
|
||||
|----------|-------------|---------|
|
||||
| `FLASK_SECRET_KEY` | Flask session encryption key | `openssl rand -hex 32` |
|
||||
| `WEBHOOK_SECRET` | HMAC secret for generic webhooks | `openssl rand -hex 32` |
|
||||
| `PARTICLE_WEBHOOK_SECRET` | Bearer token for Particle webhooks | `openssl rand -hex 32` |
|
||||
| `SMTP_EMAIL` | Gmail address for notifications | `alerts@yourdomain.com` |
|
||||
| `SMTP_PASSWORD` | Gmail app password (not regular password) | `abcd efgh ijkl mnop` |
|
||||
| `RECIPIENT_EMAIL` | SMS gateway email for notifications | `5551234567@vtext.com` |
|
||||
|
||||
### Generating Secrets
|
||||
```bash
|
||||
# Generate secure random secrets
|
||||
FLASK_SECRET=$(openssl rand -hex 32)
|
||||
WEBHOOK_SECRET=$(openssl rand -hex 32)
|
||||
PARTICLE_SECRET=$(openssl rand -hex 32)
|
||||
|
||||
echo "FLASK_SECRET_KEY=$FLASK_SECRET"
|
||||
echo "WEBHOOK_SECRET=$WEBHOOK_SECRET"
|
||||
echo "PARTICLE_WEBHOOK_SECRET=$PARTICLE_SECRET"
|
||||
```
|
||||
|
||||
### Gmail Setup
|
||||
1. Enable 2-Factor Authentication on your Google account
|
||||
2. Go to [Google App Passwords](https://myaccount.google.com/apppasswords)
|
||||
3. Generate app password for "Webhook Service"
|
||||
4. Use the 16-character password (not your regular password)
|
||||
|
||||
### SMS Gateway Setup
|
||||
Common SMS gateway formats:
|
||||
- **Verizon**: `number@vtext.com`
|
||||
- **AT&T**: `number@txt.att.net`
|
||||
- **T-Mobile**: `number@tmomail.net`
|
||||
- **Sprint**: `number@messaging.sprintpcs.com`
|
||||
|
||||
## 🌐 Traefik Integration
|
||||
|
||||
### Docker Compose Labels
|
||||
```yaml
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.webhook.rule=Host(`webhook.yourdomain.com`)"
|
||||
- "traefik.http.routers.webhook.entrypoints=websecure"
|
||||
- "traefik.http.routers.webhook.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.services.webhook.loadbalancer.server.port=5000"
|
||||
|
||||
# Security middleware
|
||||
- "traefik.http.routers.webhook.middlewares=webhook-headers,webhook-ratelimit"
|
||||
|
||||
# Rate limiting
|
||||
- "traefik.http.middlewares.webhook-ratelimit.ratelimit.average=10"
|
||||
- "traefik.http.middlewares.webhook-ratelimit.ratelimit.burst=20"
|
||||
```
|
||||
|
||||
### External Network
|
||||
Reference in New Issue
Block a user