From 277a06864c97b09ae9287ed541e9a5dc1604480d Mon Sep 17 00:00:00 2001 From: Graham McIntire Date: Wed, 4 Feb 2026 16:58:42 -0600 Subject: [PATCH] doc cleanup --- docs/PANGOLIN_SECURITY.md | 340 -------------------------------------- docs/security-analysis.md | 216 ------------------------ 2 files changed, 556 deletions(-) delete mode 100644 docs/PANGOLIN_SECURITY.md delete mode 100644 docs/security-analysis.md diff --git a/docs/PANGOLIN_SECURITY.md b/docs/PANGOLIN_SECURITY.md deleted file mode 100644 index d22d8e3f..00000000 --- a/docs/PANGOLIN_SECURITY.md +++ /dev/null @@ -1,340 +0,0 @@ -# Pangolin Security Rules for Towerops - -This document describes the security rules applied at the Pangolin edge proxy layer to protect Towerops from common web attacks. - -## Overview - -Pangolin acts as a security layer before traffic reaches the application server, filtering out: -- SQL injection attempts -- Cross-site scripting (XSS) -- Path traversal attacks -- Malicious bots and scanners -- Common exploit attempts -- Information disclosure vulnerabilities - -## Applying the Rules - -### Method 1: Pangolin CLI - -```bash -# Upload rules to your Pangolin instance -pangolin rules upload pangolin-security-rules.toml - -# Verify rules are active -pangolin rules list - -# Test rules without blocking -pangolin rules test --dry-run -``` - -### Method 2: Pangolin Web UI - -1. Log into your Pangolin dashboard -2. Navigate to **Security > Rules** -3. Click **Import Rules** -4. Upload `pangolin-security-rules.toml` -5. Review and activate - -### Method 3: GitOps / Infrastructure as Code - -Add to your Terraform/Pulumi configuration: - -```hcl -resource "pangolin_security_rules" "towerops" { - source = file("${path.module}/pangolin-security-rules.toml") - enabled = true -} -``` - -## Rule Categories - -### 1. SQL Injection Protection - -Blocks attempts to: -- Use UNION queries to extract data -- Use OR/AND conditions to bypass authentication -- Query information_schema -- Use SQL comments to manipulate queries - -**Example blocked requests:** -``` -/api/users?id=1' OR '1'='1 -/search?q=test' UNION SELECT * FROM users-- -``` - -### 2. XSS Protection - -Blocks attempts to inject JavaScript via: -- ` -/comment?text= -``` - -### 3. Path Traversal Protection - -Prevents attackers from accessing files outside the web root: -- Directory traversal sequences (../) -- Absolute path references (/etc/, C:\) -- Encoded traversal attempts - -**Example blocked requests:** -``` -/download?file=../../../../etc/passwd -/api/files?path=/etc/shadow -``` - -### 4. Common Exploit Paths - -Blocks requests to paths that don't exist in Towerops but are commonly targeted: -- WordPress admin panels -- PHPMyAdmin -- cPanel interfaces -- Generic admin paths - -**Example blocked requests:** -``` -/wp-admin/ -/phpmyadmin/ -/admin/login.php -``` - -### 5. Malicious Bot Detection - -Blocks known security scanners and malicious crawlers: -- Nikto, Nessus, Nmap -- SQLMap, Metasploit -- Aggressive scrapers -- Empty User-Agent headers - -**Allowed bots:** -- Monitoring services (UptimeRobot, Pingdom) -- Towerops agents (legitimate traffic) - -### 6. Shell Injection Protection - -Prevents command injection attempts: -- Shell metacharacters (|, ;, `) -- Command substitution -- ShellShock vulnerability - -**Example blocked requests:** -``` -/api/run?cmd=ls | grep password -/execute?command=`cat /etc/passwd` -``` - -### 7. File Upload Exploits - -Blocks malicious file extensions and double-extension tricks: -- PHP, ASP, JSP executable files -- Files disguised with double extensions -- Shell scripts - -**Example blocked requests:** -``` -/upload?file=shell.php -/api/files/avatar.jpg.php -``` - -### 8. Information Disclosure - -Prevents access to sensitive files: -- `.git` and `.svn` directories -- `.env` environment files -- Backup files (.bak, .old, ~) -- Configuration files - -**Example blocked requests:** -``` -/.git/config -/.env -/config.php.bak -``` - -### 9. Protocol Attacks - -Blocks obsolete or dangerous HTTP methods: -- HTTP/0.9 (obsolete since 1996) -- TRACE method (XST attacks) -- TRACK method - -### 10. Known Exploits - -Protects against recent vulnerabilities: -- Log4Shell (CVE-2021-44228) -- SSRF attempts -- XXE (XML External Entity) - -## Monitoring and Tuning - -### View Blocked Requests - -```bash -# Real-time log streaming -pangolin logs stream --filter action=block - -# Export blocked requests to CSV -pangolin logs export --action block --days 7 > blocked.csv -``` - -### False Positives - -If legitimate traffic is being blocked: - -1. **Identify the rule:** -```bash -pangolin logs show -``` - -2. **Create an exception:** -```toml -[[rules]] -name = "Allow Specific Pattern" -match.url.path = "/your-endpoint" -action = "allow" -priority = 1000 # Higher priority = evaluated first -``` - -3. **Or disable the specific rule:** -```bash -pangolin rules disable "Block SQL Injection - UNION" -``` - -### Performance Impact - -These rules are evaluated at the edge with minimal latency: -- Regex matching: ~0.1-0.5ms per request -- Header inspection: ~0.05ms per request -- Total overhead: < 1ms per request - -## Testing - -### Test Individual Rules - -```bash -# Test SQL injection protection -curl "https://towerops.net/api/users?id=1' OR '1'='1" -# Should return: 403 Forbidden - -# Test path traversal protection -curl "https://towerops.net/files?path=../../etc/passwd" -# Should return: 403 Forbidden - -# Test legitimate request -curl "https://towerops.net/health" -# Should return: 200 OK -``` - -### Load Testing with Rules - -```bash -# Ensure rules don't impact performance -ab -n 10000 -c 100 https://towerops.net/health -``` - -## Security Best Practices - -1. **Keep Rules Updated**: Review and update rules quarterly -2. **Monitor Logs**: Set up alerts for high block rates -3. **Test Changes**: Use dry-run mode before activating new rules -4. **Layer Defense**: Don't rely solely on Pangolin - application-level validation is still required -5. **Regular Audits**: Review blocked requests monthly for patterns - -## Rate Limiting (Optional) - -If you have Pangolin Pro, uncomment the rate limiting rules in the config: - -```toml -[[rules]] -name = "Rate Limit - General" -match.all = true -action = "rate_limit" -rate_limit.requests = 100 -rate_limit.window = "1m" -rate_limit.by = "ip" -``` - -Recommended limits: -- **General traffic**: 100 req/min per IP -- **Login endpoints**: 10 req/min per IP -- **API endpoints**: 1000 req/min per token - -## Geo-Blocking (Optional) - -Block traffic from specific countries if needed: - -```toml -[[rules]] -name = "Block High-Risk Countries" -match.geo.country_code = ["CN", "RU", "KP"] -action = "block" -log = false -``` - -**Warning**: Only use geo-blocking if you're certain you have no legitimate users in those regions. - -## Troubleshooting - -### Rules Not Working - -1. **Verify rules are loaded:** -```bash -pangolin rules list | grep "Block SQL" -``` - -2. **Check rule syntax:** -```bash -pangolin rules validate pangolin-security-rules.toml -``` - -3. **Ensure Pangolin is in path:** -```bash -# Check traffic is flowing through Pangolin -pangolin status -``` - -### High Block Rate - -If you're seeing unexpectedly high block rates: - -1. **Analyze top blocked patterns:** -```bash -pangolin analytics blocked --top 10 -``` - -2. **Check for scanning activity:** -```bash -pangolin logs stream --filter action=block | grep -E "(nikto|nmap)" -``` - -3. **Temporarily disable aggressive rules:** -```bash -pangolin rules disable "Block Scrapers and Crawlers" -``` - -## Compliance - -These rules help meet security requirements for: -- **OWASP Top 10**: Addresses injection, XSS, SSRF, XXE -- **PCI DSS**: Provides web application firewall (WAF) capabilities -- **SOC 2**: Demonstrates security controls and logging -- **ISO 27001**: Shows defense-in-depth implementation - -## Support - -- **Pangolin Documentation**: https://docs.pangolin.net/ -- **Rule Examples**: https://github.com/pangolin/rules-examples -- **Community Forum**: https://community.pangolin.net/ - -## Changelog - -- **2026-01-15**: Initial rule set created - - 30+ security rules covering OWASP Top 10 - - Bot and scanner detection - - Protocol attack prevention - - Information disclosure protection diff --git a/docs/security-analysis.md b/docs/security-analysis.md deleted file mode 100644 index 0b3d6bf6..00000000 --- a/docs/security-analysis.md +++ /dev/null @@ -1,216 +0,0 @@ -# Security Analysis and Mitigations - -This document tracks Sobelow security findings and the mitigations applied to address them. - -## Summary - -As of 2026-02-01, the following high-confidence security issues have been addressed: - -- ✅ **Config.CSP**: Content-Security-Policy headers configured -- ✅ **Config.HTTPS**: HTTPS enforcement enabled in production -- ✅ **Traversal.FileModule**: Directory traversal protections added to MIB controller -- ⚠️ **Vendored Libraries**: Low-risk warnings in SnmpKit (vendored library) - ---- - -## Fixed Issues - -### 1. Config.CSP: Missing Content-Security-Policy (FIXED) - -**Severity**: High -**Location**: `lib/towerops_web/router.ex:19` -**Status**: ✅ Fixed - -**Mitigation**: -Added Content-Security-Policy headers to the `:browser` pipeline with LiveView-compatible settings: - -```elixir -plug :put_secure_browser_headers, %{ - "content-security-policy" => - "default-src 'self'; " <> - "script-src 'self' 'unsafe-inline' 'unsafe-eval'; " <> - "style-src 'self' 'unsafe-inline'; " <> - "img-src 'self' data: https:; " <> - "font-src 'self' data:; " <> - "connect-src 'self' ws: wss:; " <> - "frame-ancestors 'none';" -} -``` - -**Note**: `'unsafe-inline'` for scripts is required for Phoenix LiveView to function. This is a documented requirement for LiveView applications. - ---- - -### 2. Config.HTTPS: HTTPS Not Enabled (FIXED) - -**Severity**: High -**Location**: `config/prod.exs` -**Status**: ✅ Fixed - -**Mitigation**: -Configured `force_ssl` in production endpoint configuration (`config/runtime.exs`): - -```elixir -config :towerops, ToweropsWeb.Endpoint, - force_ssl: [ - hsts: true, - rewrite_on: [:x_forwarded_host, :x_forwarded_port, :x_forwarded_proto] - ] -``` - -**Security Benefits**: -- Automatically redirects HTTP → HTTPS -- Enables HSTS (HTTP Strict Transport Security) -- Respects X-Forwarded-* headers from reverse proxy (Traefik) - ---- - -### 3. Traversal.FileModule: Directory Traversal in MIB Controller (FIXED) - -**Severity**: High -**Locations**: -- `lib/towerops_web/controllers/api/v1/mib_controller.ex:119` (File.rm_rf) -- `lib/towerops_web/controllers/api/v1/mib_controller.ex:229` (File.cp) - -**Status**: ✅ Fixed - -**Mitigation**: -Added comprehensive input validation to prevent directory traversal attacks: - -#### Vendor Name Validation -```elixir -defp validate_vendor_name(vendor) when is_binary(vendor) do - # Reject path traversal characters - if String.contains?(vendor, [".", "/", "\\", ":"]) do - {:error, "Invalid vendor name: cannot contain path separators or dots"} - else - # Only allow alphanumeric, hyphen, underscore - if vendor =~ ~r/^[a-zA-Z0-9_-]+$/ do - :ok - else - {:error, "Invalid vendor name: must contain only letters, numbers, hyphens, and underscores"} - end - end -end -``` - -#### Filename Validation -```elixir -defp validate_filename(filename) when is_binary(filename) do - # Reject directory traversal sequences - if String.contains?(filename, ["..", "/", "\\"]) or String.starts_with?(filename, ".") do - {:error, "Invalid filename: cannot contain path separators or parent directory references"} - else - :ok - end -end -``` - -**Additional Protections**: -- All vendor names validated before path construction -- Filenames sanitized with `Path.basename/1` -- Superuser-only API access required for all MIB management endpoints -- All operations logged for audit trail - ---- - -## Remaining Low-Risk Findings - -### Vendored Library Warnings (SnmpKit) - -**Severity**: Low Confidence -**Status**: ⚠️ Accepted Risk - -The following warnings are in the vendored `SnmpKit` library (`lib/snmpkit/`): - -#### Misc.BinToTerm: Unsafe `binary_to_term` -- **Location**: `lib/snmpkit/snmp_lib/mib/compiler.ex:203` -- **Risk Level**: Medium-High -- **Reason**: Used for loading compiled MIB files from trusted sources only -- **Mitigation**: MIB files are only loaded from the application's `priv/mibs/` directory, which is controlled by administrators. No user-provided binary data is deserialized. - -#### DOS.StringToAtom / DOS.ListToAtom -- **Locations**: Multiple files in `lib/snmpkit/snmp_lib/` and `lib/snmpkit/snmp_mgr/` -- **Risk Level**: Low -- **Reason**: SNMP MIB parsing and tokenization -- **Mitigation**: MIB files are from trusted vendor sources and validated before processing. Atom creation is bounded by the finite set of SNMP OID names in standard MIBs. - -#### Traversal.FileModule -- **Locations**: MIB parser and compiler files -- **Risk Level**: Low -- **Reason**: MIB file reading from trusted directories -- **Mitigation**: File paths are constructed from application-controlled base directories (`priv/mibs/`). User input does not directly influence file paths. - -#### SQL.Query: SQL injection -- **Locations**: `lib/towerops/monitoring.ex` (multiple functions) -- **Risk Level**: Very Low (False Positive) -- **Reason**: Uses parameterized queries with string interpolation only for table/column names -- **Mitigation**: Table names are hardcoded constants, not user input. All user values use proper `$1`, `$2` parameter binding. - ---- - -## Ignored Low-Confidence Warnings - -The following warnings have been reviewed and determined to be false positives: - -### XSS.Raw in API Documentation -- **Location**: `lib/towerops_web/controllers/api_docs_html/index.html.heex` -- **Reason**: Uses `raw(~S"""...""")` to display static code examples in API documentation -- **Risk**: None - all content is static, developer-authored code examples -- **No Action Required** - ---- - -## Security Best Practices - -### File Upload Security -1. ✅ Validate all filenames and vendor names -2. ✅ Use `Path.basename/1` to strip directory components -3. ✅ Restrict operations to predefined base directories -4. ✅ Require superuser authentication for file management -5. ✅ Log all file operations for audit trail - -### HTTPS Configuration -1. ✅ Force SSL with HSTS enabled -2. ✅ Respect X-Forwarded-* headers from reverse proxy -3. ✅ Use secure cipher suites (default Phoenix configuration) - -### Content Security Policy -1. ✅ Default to 'self' for all resources -2. ✅ Allow WebSocket connections for LiveView -3. ✅ Prevent framing with `frame-ancestors 'none'` -4. ⚠️ Allow `'unsafe-inline'` scripts (required for LiveView) - ---- - -## Testing Recommendations - -### Manual Security Testing -- [ ] Test MIB upload with path traversal attempts (`../../../etc/passwd`) -- [ ] Verify HTTPS redirect in production environment -- [ ] Test CSP headers don't break LiveView functionality -- [ ] Verify file upload restrictions (filename validation) - -### Automated Testing -- Run `mix sobelow` regularly in CI/CD pipeline -- Monitor for new security vulnerabilities in dependencies -- Use Dialyzer for type safety checks - ---- - -## Future Improvements - -1. **Stricter CSP**: Explore using nonces for scripts instead of `'unsafe-inline'` (requires LiveView 1.0+) -2. **File Upload Limits**: Add file size limits for MIB uploads -3. **Rate Limiting**: Implement rate limiting on API endpoints -4. **Security Headers**: Add additional security headers (Permissions-Policy, etc.) -5. **Dependency Scanning**: Set up automated dependency vulnerability scanning - ---- - -## References - -- [Sobelow Security Guide](https://github.com/paraxialio/sobelow_guide) -- [Phoenix Security Best Practices](https://hexdocs.pm/phoenix/security.html) -- [OWASP Top 10](https://owasp.org/www-project-top-ten/) -- [Content Security Policy Reference](https://content-security-policy.com/)