feat(security): add configurable security headers middleware
- Add SecurityHeadersMiddleware with HSTS, CSP, X-Frame-Options, X-Content-Type-Options - Add configuration options in app/config.py - Integrate middleware into app/main.py - Add comprehensive tests in tests/test_security_headers.py - Update .env.demo with security header examples - Update docs/DeploymentGuide.md with security headers section and Traefik/Nginx examples - Update docs/ConfigurationGuide.md with detailed configuration reference - Update SECURITY_AUDIT.md to mark security headers implementation complete Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
This commit is contained in:
+230
-2
@@ -244,7 +244,11 @@ ftp = ftplib.FTP() # nosec B321 - Plaintext FTP intentional when configured
|
||||
- ✅ TrustedHostMiddleware configured (restricts valid hosts)
|
||||
- ✅ ProxyHeadersMiddleware for reverse proxy setup (X-Forwarded-* headers)
|
||||
- ✅ SessionMiddleware with strong secret validation
|
||||
- ⏳ **TODO:** Add security headers (HSTS, CSP, X-Frame-Options, X-Content-Type-Options) ([#174](https://github.com/christianlouis/DocuElevate/issues/174))
|
||||
- ✅ **Security headers middleware implemented** - Configurable HSTS, CSP, X-Frame-Options, X-Content-Type-Options ([#174](https://github.com/christianlouis/DocuElevate/issues/174))
|
||||
- Enabled by default for direct deployment
|
||||
- Configurable to disable when reverse proxy handles headers
|
||||
- Individual header control and customization
|
||||
- Documented in DeploymentGuide.md and ConfigurationGuide.md
|
||||
- ⏳ **TODO:** Implement proper CORS configuration (currently not configured) ([#175](https://github.com/christianlouis/DocuElevate/issues/175))
|
||||
- ⏳ **TODO:** Add request logging with sensitive data masking ([#170](https://github.com/christianlouis/DocuElevate/issues/170))
|
||||
|
||||
@@ -258,7 +262,7 @@ ftp = ftplib.FTP() # nosec B321 - Plaintext FTP intentional when configured
|
||||
5. **Implement CSRF protection** - Protect state-changing operations
|
||||
|
||||
### Medium Priority
|
||||
1. **Add security headers** - Improve browser-side security (HSTS, CSP, X-Frame-Options) ([#174](https://github.com/christianlouis/DocuElevate/issues/174))
|
||||
1. ~~**Add security headers**~~ ✅ Implemented - Configurable HSTS, CSP, X-Frame-Options, X-Content-Type-Options middleware
|
||||
2. **Configure CORS properly** - Currently no CORS middleware configured ([#175](https://github.com/christianlouis/DocuElevate/issues/175))
|
||||
3. **Implement audit logging** - Track security-relevant events ([#170](https://github.com/christianlouis/DocuElevate/issues/170))
|
||||
4. ~~**Add file upload size limits**~~ ✅ Implemented - Configurable limits with 1GB default, optional file splitting
|
||||
@@ -565,4 +569,228 @@ All identified path traversal vulnerabilities have been remediated with defense-
|
||||
|
||||
---
|
||||
|
||||
## Security Headers Implementation (2026-02-10)
|
||||
|
||||
**Status:** ✅ COMPLETED
|
||||
**Scope:** HTTP security headers middleware for browser-side security
|
||||
|
||||
### Executive Summary
|
||||
|
||||
Implemented configurable security headers middleware to improve browser-side security in DocuElevate. The implementation supports both direct deployment and reverse proxy scenarios (Traefik, Nginx, etc.), with full documentation and test coverage.
|
||||
|
||||
### Security Headers Implemented
|
||||
|
||||
#### 1. Strict-Transport-Security (HSTS)
|
||||
|
||||
**Purpose:** Forces browsers to use HTTPS for all future requests to the domain.
|
||||
|
||||
**Implementation:**
|
||||
```python
|
||||
# Default configuration
|
||||
SECURITY_HEADER_HSTS_ENABLED=true
|
||||
SECURITY_HEADER_HSTS_VALUE="max-age=31536000; includeSubDomains"
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- Prevents downgrade attacks (forcing HTTPS → HTTP)
|
||||
- Protects against man-in-the-middle attacks
|
||||
- 1-year max-age ensures long-term HTTPS enforcement
|
||||
- `includeSubDomains` extends protection to all subdomains
|
||||
|
||||
**Note:** HSTS only works over HTTPS. For development over HTTP, disable this header.
|
||||
|
||||
#### 2. Content-Security-Policy (CSP)
|
||||
|
||||
**Purpose:** Controls which resources browsers are allowed to load, preventing XSS and code injection attacks.
|
||||
|
||||
**Implementation:**
|
||||
```python
|
||||
# Default configuration (allows Tailwind CSS and inline scripts)
|
||||
SECURITY_HEADER_CSP_VALUE="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self' data:;"
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- Prevents unauthorized script execution
|
||||
- Controls image, font, and style loading
|
||||
- Mitigates XSS attack vectors
|
||||
- Customizable per deployment needs
|
||||
|
||||
**Trade-offs:**
|
||||
- Default policy includes `'unsafe-inline'` for compatibility with Tailwind CSS and inline JavaScript
|
||||
- Stricter policies can be configured using nonces or hashes
|
||||
|
||||
#### 3. X-Frame-Options
|
||||
|
||||
**Purpose:** Prevents the application from being loaded in frames/iframes, protecting against clickjacking attacks.
|
||||
|
||||
**Implementation:**
|
||||
```python
|
||||
# Default configuration (strongest protection)
|
||||
SECURITY_HEADER_X_FRAME_OPTIONS_VALUE="DENY"
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `DENY` - No framing allowed (default, most secure)
|
||||
- `SAMEORIGIN` - Allow framing only from same origin
|
||||
- `ALLOW-FROM uri` - Allow framing from specific origin (deprecated)
|
||||
|
||||
**Benefits:**
|
||||
- Prevents UI redressing attacks
|
||||
- Protects sensitive operations from being obscured
|
||||
- Simple and effective clickjacking protection
|
||||
|
||||
#### 4. X-Content-Type-Options
|
||||
|
||||
**Purpose:** Prevents browsers from MIME-sniffing responses away from declared content-type.
|
||||
|
||||
**Implementation:**
|
||||
```python
|
||||
# Always set to 'nosniff' when enabled
|
||||
SECURITY_HEADER_X_CONTENT_TYPE_OPTIONS_ENABLED=true
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- Prevents MIME confusion attacks
|
||||
- Forces browsers to respect declared content-types
|
||||
- Reduces XSS attack surface
|
||||
|
||||
### Deployment Scenarios
|
||||
|
||||
#### Direct Deployment (No Reverse Proxy)
|
||||
|
||||
Security headers are **enabled by default** for direct deployments:
|
||||
|
||||
```bash
|
||||
# .env configuration
|
||||
SECURITY_HEADERS_ENABLED=true
|
||||
SECURITY_HEADER_HSTS_ENABLED=true
|
||||
SECURITY_HEADER_CSP_ENABLED=true
|
||||
SECURITY_HEADER_X_FRAME_OPTIONS_ENABLED=true
|
||||
SECURITY_HEADER_X_CONTENT_TYPE_OPTIONS_ENABLED=true
|
||||
```
|
||||
|
||||
All headers are added by the application middleware.
|
||||
|
||||
#### Reverse Proxy Deployment (Traefik, Nginx, etc.)
|
||||
|
||||
When deploying behind a reverse proxy that already adds security headers, **disable the middleware** to avoid duplication:
|
||||
|
||||
```bash
|
||||
# .env configuration
|
||||
SECURITY_HEADERS_ENABLED=false
|
||||
```
|
||||
|
||||
**Traefik Example:**
|
||||
```yaml
|
||||
labels:
|
||||
- "traefik.http.middlewares.security-headers.headers.stsSeconds=31536000"
|
||||
- "traefik.http.middlewares.security-headers.headers.contentSecurityPolicy=default-src 'self';"
|
||||
- "traefik.http.middlewares.security-headers.headers.customFrameOptionsValue=DENY"
|
||||
- "traefik.http.middlewares.security-headers.headers.contentTypeNosniff=true"
|
||||
```
|
||||
|
||||
**Nginx Example:**
|
||||
```nginx
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||||
add_header Content-Security-Policy "default-src 'self';" always;
|
||||
add_header X-Frame-Options "DENY" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
```
|
||||
|
||||
### Configuration Options
|
||||
|
||||
All security headers are configurable via environment variables:
|
||||
|
||||
| Setting | Purpose | Default |
|
||||
|---------|---------|---------|
|
||||
| `SECURITY_HEADERS_ENABLED` | Master enable/disable | `true` |
|
||||
| `SECURITY_HEADER_HSTS_ENABLED` | Enable HSTS | `true` |
|
||||
| `SECURITY_HEADER_HSTS_VALUE` | HSTS configuration | `max-age=31536000; includeSubDomains` |
|
||||
| `SECURITY_HEADER_CSP_ENABLED` | Enable CSP | `true` |
|
||||
| `SECURITY_HEADER_CSP_VALUE` | CSP policy | See implementation details |
|
||||
| `SECURITY_HEADER_X_FRAME_OPTIONS_ENABLED` | Enable X-Frame-Options | `true` |
|
||||
| `SECURITY_HEADER_X_FRAME_OPTIONS_VALUE` | Frame options | `DENY` |
|
||||
| `SECURITY_HEADER_X_CONTENT_TYPE_OPTIONS_ENABLED` | Enable X-Content-Type-Options | `true` |
|
||||
|
||||
### Implementation Details
|
||||
|
||||
**Files Modified:**
|
||||
- `app/middleware/security_headers.py` - Security headers middleware implementation
|
||||
- `app/middleware/__init__.py` - Middleware package initialization
|
||||
- `app/config.py` - Configuration settings for security headers
|
||||
- `app/main.py` - Middleware integration into FastAPI application
|
||||
- `.env.demo` - Example configuration with security header settings
|
||||
|
||||
**Documentation:**
|
||||
- `docs/DeploymentGuide.md` - Added comprehensive security headers section with Traefik/Nginx examples
|
||||
- `docs/ConfigurationGuide.md` - Added detailed configuration reference for all header options
|
||||
- `SECURITY_AUDIT.md` - Updated infrastructure security status
|
||||
|
||||
**Tests:**
|
||||
- `tests/test_security_headers.py` - Comprehensive test suite (24 tests)
|
||||
- Unit tests for individual headers
|
||||
- Integration tests for configuration loading
|
||||
- Security tests for header format validation
|
||||
- Tests for both enabled and disabled states
|
||||
|
||||
### Security Benefits
|
||||
|
||||
1. **Defense in Depth:** Multiple layers of browser-side security
|
||||
2. **Flexible Configuration:** Adapts to different deployment scenarios
|
||||
3. **Industry Best Practices:** Follows OWASP security recommendations
|
||||
4. **Easy Deployment:** Works out-of-the-box with sensible defaults
|
||||
5. **Reverse Proxy Compatible:** Can be disabled when proxy handles headers
|
||||
6. **Well Documented:** Comprehensive documentation for all scenarios
|
||||
|
||||
### Testing
|
||||
|
||||
**Running Security Header Tests:**
|
||||
```bash
|
||||
# Run all security header tests
|
||||
pytest tests/test_security_headers.py -v
|
||||
|
||||
# Run security-marked tests only
|
||||
pytest -m security -v
|
||||
|
||||
# Run with coverage
|
||||
pytest tests/test_security_headers.py --cov=app.middleware --cov-report=term-missing
|
||||
```
|
||||
|
||||
**Test Coverage:**
|
||||
- ✅ Headers presence validation
|
||||
- ✅ Header value format validation
|
||||
- ✅ Configuration loading
|
||||
- ✅ Master enable/disable behavior
|
||||
- ✅ Individual header enable/disable
|
||||
- ✅ API endpoint coverage
|
||||
- ✅ Static file coverage
|
||||
|
||||
### Recommendations for Production
|
||||
|
||||
1. **HTTPS Required for HSTS:** Ensure HTTPS is properly configured before enabling HSTS
|
||||
2. **Test CSP Policy:** The default CSP policy allows inline scripts/styles. Test thoroughly before tightening.
|
||||
3. **Monitor Headers:** Use browser developer tools or online checkers to verify headers are applied
|
||||
4. **Reverse Proxy Coordination:** Choose either application or proxy for header management, not both
|
||||
5. **Regular Review:** Review and update CSP policy as application evolves
|
||||
|
||||
### Security Scanner Results
|
||||
|
||||
**Headers Validation:** All security headers pass OWASP recommendations
|
||||
- ✅ HSTS max-age >= 1 year
|
||||
- ✅ CSP includes default-src directive
|
||||
- ✅ X-Frame-Options set to DENY or SAMEORIGIN
|
||||
- ✅ X-Content-Type-Options set to nosniff
|
||||
|
||||
### Conclusion
|
||||
|
||||
Security headers implementation is complete and production-ready. The middleware provides:
|
||||
- ✅ Strong browser-side security by default
|
||||
- ✅ Flexibility for different deployment scenarios
|
||||
- ✅ Comprehensive documentation and test coverage
|
||||
- ✅ Easy configuration and customization
|
||||
|
||||
**Overall Security Impact:** POSITIVE - Significantly improves browser-side security posture with minimal performance overhead.
|
||||
|
||||
---
|
||||
|
||||
**Next Audit Due:** 2026-05-07 (Quarterly)
|
||||
Reference in New Issue
Block a user