- Document critical security vulnerabilities found - Provide step-by-step hardening procedures - Include SSL certificate recovery from git history - Add SSH hardening with Mosh compatibility - Document VPN setup with WireGuard - Create implementation checklists and status tracking
12 KiB
Homelab Security Hardening Guide
Overview
This document tracks the security hardening process for the homelab infrastructure. Based on security audit findings, we've identified critical vulnerabilities that need immediate attention.
Critical Security Issues (IMMEDIATE ACTION REQUIRED)
🚨 Port Exposure Vulnerabilities
- qBittorrent: Currently binding to
0.0.0.0:6881(exposed to all interfaces) - Gitea: Currently binding to
0.0.0.0:3000and0.0.0.0:2223 - Portainer: Docker management interface exposed on port 9000
Status: 🔴 NOT ADDRESSED Priority: CRITICAL Impact: Services accessible from internet without authentication
🚨 Missing Intrusion Prevention
- fail2ban: Not installed or running
- Firewall: UFW/iptables not properly configured
Status: 🔴 NOT ADDRESSED Priority: CRITICAL Impact: No protection against brute force attacks
🚨 SSL/TLS Missing
- HTTPS: SSL certificates were previously configured but may have been lost
- Let's Encrypt: Configuration exists in git history but needs restoration
- Git History: Found SSL config in commit
2cd1d87with Let's Encrypt certificates
Status: 🟡 PARTIALLY ADDRESSED (config exists, needs deployment) Priority: CRITICAL Impact: All traffic unencrypted, vulnerable to MITM attacks
Recovery Steps:
# Restore SSL configuration from git
git show 2cd1d87:config/nginx/homelab.conf > config/nginx/homelab-ssl.conf
# Install certbot and get certificates
sudo pacman -S certbot certbot-nginx
sudo certbot --nginx -d ak-homelab.duckdns.org
# Deploy SSL-enabled nginx config
sudo cp config/nginx/homelab-ssl.conf /etc/nginx/sites-available/homelab
sudo nginx -t && sudo systemctl reload nginx
Security Scripts Available
✅ Container Hardening (scripts/harden-containers.sh)
- Docker daemon configuration hardening
- Resource limits and security profiles
- Custom seccomp profiles
- Container security monitoring scripts
Status: 🟡 READY TO DEPLOY Next Step: Run script and deploy hardened templates
✅ Credential Security (scripts/secure-credentials.sh)
- Secure credential storage in
/opt/homelab/secrets/ - Docker secrets implementation
- Password generation utilities
- Access audit tools
Status: 🟡 READY TO DEPLOY Next Step: Run script and migrate existing credentials
✅ Security Audit (scripts/security-audit.sh)
- Comprehensive system security assessment
- Credential exposure detection
- Service analysis and user audit
- Log analysis capabilities
Status: 🟡 READY TO USE Next Step: Run initial audit to establish baseline
✅ Fail2ban Setup (scripts/setup-fail2ban.sh)
- SSH protection (port 2222)
- Nginx rate limiting and bot protection
- Custom filters for homelab services
- Attack analysis and monitoring tools
Status: 🟡 READY TO DEPLOY Next Step: Install and configure fail2ban
✅ SSL Security (scripts/ssl-security-audit.sh)
- SSL/TLS configuration hardening
- Certificate monitoring and renewal
- Security headers implementation
- SSL testing and validation tools
Status: 🟡 READY TO DEPLOY Next Step: Set up Let's Encrypt certificates first
Implementation Plan
Phase 1: Critical Security Fixes (Do NOW)
1. Fix Port Exposure
# Bind services to localhost only
sudo docker update --publish-add "127.0.0.1:8080:8080" qbittorrent
sudo docker update --publish-rm "0.0.0.0:8080:8080" qbittorrent
sudo docker update --publish-add "127.0.0.1:3000:3000" gitea
sudo docker update --publish-rm "0.0.0.0:3000:3000" gitea
sudo docker update --publish-add "127.0.0.1:2223:22" gitea
sudo docker update --publish-rm "0.0.0.0:2223:22" gitea
2. Install Fail2ban
sudo -A ./scripts/setup-fail2ban.sh
3. Configure Basic Firewall
sudo ufw enable
sudo ufw allow 2222/tcp # SSH
sudo ufw allow 80/tcp # HTTP (temporary)
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow 60000:61000/udp # Mosh UDP ports
sudo ufw --force reload
4. SSH Hardening with Mosh Support
# Install Mosh for mobile SSH
sudo pacman -S mosh
# Edit /etc/ssh/sshd_config
sudo nano /etc/ssh/sshd_config
# Add these security settings:
# Port 2222 (already done)
# PermitRootLogin no
# PasswordAuthentication no # DISABLE AFTER KEY SETUP
# PubkeyAuthentication yes
# AllowUsers hoborg
# ClientAliveInterval 300
# ClientAliveCountMax 2
# MaxAuthTries 3
# Test SSH key authentication first
ssh-copy-id -i ~/.ssh/id_ed25519.pub hoborg@ak-homelab.duckdns.org -p 2222
# Then disable password authentication
# PasswordAuthentication no
# Restart SSH
sudo systemctl restart sshd
# Test Mosh connectivity
mosh hoborg@ak-homelab.duckdns.org --ssh="ssh -p 2222"
4. Set Up SSL Certificates
sudo pacman -S certbot certbot-nginx
sudo certbot --nginx -d ak-homelab.duckdns.org
Phase 2: Container Security
1. Harden Docker Configuration
sudo -A ./scripts/harden-containers.sh
2. Deploy Hardened Container Templates
sudo -A /opt/docker/monitoring/deploy-hardened-containers.sh
3. Secure Credentials
sudo -A ./scripts/secure-credentials.sh
/opt/homelab/secrets/generate-passwords.sh
Phase 3: SSH Hardening
1. Set Up SSH Security Keys
- Generate SSH keys on management devices
- Add public keys to
~/.ssh/authorized_keys - Test key-based authentication
2. Disable Password Authentication
# Edit /etc/ssh/sshd_config
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no
# Ensure Mosh compatibility
# Mosh uses UDP ports 60000-61000
sudo ufw allow 60000:61000/udp
# Restart SSH
sudo systemctl restart sshd
3. Test Mosh Connectivity
# Install mosh if not present
sudo pacman -S mosh
# Test connection
mosh user@ak-homelab.duckdns.org --ssh="ssh -p 2222"
Phase 4: Monitoring & Alerting
1. Set Up System Monitoring
sudo -A ./scripts/setup-netdata.sh
sudo -A ./scripts/setup-glances.sh
2. Configure SSL Monitoring
sudo -A ./scripts/ssl-security-audit.sh
sudo systemctl enable ssl-monitor.timer
3. Set Up Regular Security Audits
# Add to cron for weekly audits
echo "0 2 * * 1 sudo -A /home/hoborg/homelab/scripts/security-audit.sh" | sudo tee -a /etc/cron.d/homelab-security
Phase 5: VPN Setup (WireGuard)
1. Install WireGuard
sudo pacman -S wireguard-tools
2. Generate Server Keys
# Generate server keys
wg genkey | tee server_private.key | wg pubkey > server_public.key
# Generate client keys (on client device)
wg genkey | tee client_private.key | wg pubkey > client_public.key
3. Server Configuration (/etc/wireguard/wg0.conf)
[Interface]
PrivateKey = <SERVER_PRIVATE_KEY>
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o enp4s0 -j MASQUERADE
[Peer]
PublicKey = <CLIENT_PUBLIC_KEY>
AllowedIPs = 10.0.0.2/32
4. Client Configuration
[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 10.0.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = ak-homelab.duckdns.org:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
5. Enable VPN Service
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
# Update firewall
sudo ufw allow 51820/udp
sudo ufw reload
6. Router Port Forwarding
- Forward UDP port 51820 to homelab server
- Update DuckDNS to include VPN endpoint
7. Test VPN Connectivity
# On client: Check VPN status
wg show
# Test homelab access through VPN
ssh hoborg@10.0.0.1 -p 2222
curl https://ak-homelab.duckdns.org
Security Checklist
Network Security
- Ports bound to localhost only
- Firewall configured and enabled
- Fail2ban installed and running
- VPN server configured
- SSH hardened (keys only, custom port)
SSL/TLS Security
- Let's Encrypt certificates installed
- SSL configuration hardened
- HSTS headers configured
- Certificate monitoring active
- Perfect Forward Secrecy enabled
Container Security
- Docker daemon hardened
- Containers run as non-root users
- Resource limits applied
- Security profiles enabled
- No privileged containers
Credential Security
- Credentials moved to secure location
- Docker secrets implemented
- Strong passwords generated
- Access logging enabled
Monitoring & Alerting
- System monitoring active (Netdata/Glances)
- Security event monitoring
- Log analysis configured
- Automated alerts set up
Testing Procedures
Security Testing
- Port Scanning:
nmap -sV ak-homelab.duckdns.org - SSL Testing:
sslscan ak-homelab.duckdns.org - Container Security:
/opt/docker/monitoring/container-security-check.sh - Fail2ban Status:
fail2ban-client status
Functionality Testing
- SSH Access: Test key-based and password authentication
- Mosh Connectivity: Test mobile SSH sessions
- VPN Access: Test remote connectivity
- Service Access: Verify all services work through Nginx proxy
- SSL Redirect: Ensure HTTP redirects to HTTPS
Emergency Procedures
Security Incident Response
- Isolate: Disconnect affected systems from network
- Assess: Run security audit to identify compromise
- Contain: Block malicious IPs, change credentials
- Recover: Restore from clean backups
- Learn: Update procedures based on incident
Backup Security
- Encrypt backups
- Store offsite securely
- Test restoration procedures
- Include configuration backups
Previous AI Agent Recommendations
From CLAUDE.md (Voice Assistant Setup)
- ✅ Voice server configured for Claude Code
- ✅ Piper TTS integration working
- ✅ Mosh compatibility considerations noted
From Git History Analysis
- SSL Configuration: Found complete Let's Encrypt setup in commit
2cd1d87 - WebDAV Support: Advanced nginx configuration with security headers
- Service Architecture: Well-documented reverse proxy setup
From network-security.md
- ✅ SSH port changed to 2222
- ✅ Router port forwarding updated
- ✅ Mosh configured (ISP UDP blocking noted)
- ✅ WireGuard VPN documentation complete
- ✅ fail2ban configuration documented
- ✅ UFW firewall setup documented
Current Status Assessment
✅ Completed Items
- SSH port hardening (2222)
- Router port forwarding updates
- Voice assistant integration
- Network security documentation
- VPN setup documentation
🔴 Critical Issues (Immediate Action Required)
- Port exposure vulnerabilities
- Missing fail2ban installation
- SSL certificate restoration needed
- SSH password authentication still enabled
🟡 Partially Complete
- SSL configuration exists in git (needs deployment)
- Security scripts created (need execution)
- VPN documentation complete (needs implementation)
Next Steps Priority
- IMMEDIATE: Fix port exposure and install fail2ban
- HIGH: Restore SSL certificates from git history
- MEDIUM: Execute security hardening scripts
- MEDIUM: Set up SSH key authentication and disable passwords
- LOW: Implement WireGuard VPN
- LOW: Set up monitoring and alerting
References
Security Resources
- Docker Security Best Practices
- OWASP Docker Security Cheat Sheet
- Mozilla SSL Configuration Generator
- WireGuard Documentation
- Let's Encrypt Certbot
Tools Used
- fail2ban: Intrusion prevention
- UFW: Firewall management
- certbot: SSL certificate management
- Docker: Container security features
- Netdata/Glances: System monitoring
Status Updates
2025-09-12: Initial Assessment
- Identified critical port exposure vulnerabilities
- Found missing fail2ban and SSL certificates
- Created comprehensive hardening plan
- Documented all security scripts and their purposes
Next Update: [Date]
- [Progress made]
- [Issues resolved]
- [Next steps]
Last Updated: 2025-09-12
Security Status: 🔴 CRITICAL - Immediate action required
SSL Recovery: Configuration found in git history (commit 2cd1d87)
VPN Ready: Complete WireGuard setup documentation available
SSH Status: Port hardened, password auth needs disabling