Files
lenovo-gentoo/Security-Hardening.md

723 lines
14 KiB
Markdown

# Security Hardening Guide
Complete guide for hardening the Gentoo workstation with firewall, intrusion
prevention, and SSH security.
## Overview
This guide covers comprehensive security hardening for a single-user Gentoo
development workstation with a focus on practical security without
over-engineering.
## Table of Contents
- [Security Philosophy](#security-philosophy)
- [Threat Model](#threat-model)
- [Components](#components)
- [Installation](#installation)
- [Firewall Configuration](#firewall-configuration)
- [Intrusion Prevention](#intrusion-prevention)
- [SSH Hardening](#ssh-hardening)
- [Additional Security](#additional-security)
- [Monitoring](#monitoring)
- [Troubleshooting](#troubleshooting)
## Security Philosophy
**Pragmatic security approach**:
1. **Defense in Depth**: Multiple layers of security
2. **Minimal Attack Surface**: Only expose what's necessary
3. **Fail Securely**: Default deny policies
4. **Logging and Monitoring**: Track security events
5. **Maintainability**: Keep it simple and documented
## Threat Model
### Primary Threats
1. **Network attacks**: Port scanning, brute force, exploits
2. **SSH brute force**: Automated login attempts
3. **Malware**: Trojans, backdoors from compromised packages
4. **Physical access**: Limited concern (personal workstation)
### Out of Scope
- Advanced persistent threats (APTs)
- Nation-state actors
- Physical security (trusted environment)
- Multi-user system hardening (single user)
## Components
### 1. nftables Firewall
Modern Linux firewall with:
- Default deny incoming policy
- Allow established connections
- Rate limiting for services
- Connection tracking
- Docker support
### 2. fail2ban
Intrusion prevention system that:
- Monitors SSH login attempts
- Automatically bans malicious IPs
- Integrates with nftables
- Configurable ban times and thresholds
### 3. SSH Hardening
Secure SSH configuration:
- Modern ciphers only
- Key-based authentication
- No root login
- Connection limits
- Logging and monitoring
## Installation
### Prerequisites
```bash
# Install required packages
emerge -av net-firewall/nftables
emerge -av net-analyzer/fail2ban
emerge -av net-misc/openssh
# Ensure SSH is configured and working
rc-service sshd status
```
### Install Security Components
```bash
cd ~/repository/git.hinrichs.dev/alexander/claude/lenovo-gentoo/scripts/security-setup
sudo ./INSTALL.sh
```
**⚠️ CRITICAL**: Keep your current SSH session open until you verify everything
works!
### Installation Steps
The script will:
1. ✅ Install nftables firewall configuration
2. ✅ Install fail2ban jail configuration
3. ✅ Install SSH hardening configuration
4. ✅ Backup all existing configs
5. ✅ Enable services in OpenRC
## Firewall Configuration
### Overview
The nftables firewall uses a default deny policy with explicit allow rules.
**Location**: `/etc/nftables.conf`
### Default Rules
```
INPUT chain (incoming):
- DROP everything by default
- ACCEPT established/related connections
- ACCEPT loopback traffic
- ACCEPT ICMP (rate limited)
- ACCEPT SSH (rate limited, LAN only)
- ACCEPT mDNS (local network discovery)
FORWARD chain:
- DROP everything by default
- ACCEPT established/related (for Docker if needed)
OUTPUT chain:
- ACCEPT everything (workstation outgoing)
```
### Key Features
#### 1. SSH Rate Limiting
Prevents brute force attacks:
```nft
# Max 3 SSH connections per minute per IP
tcp dport 22 ct state new \
add @ratelimit_ssh { ip saddr limit rate 3/minute } accept
```
#### 2. ICMP Rate Limiting
Prevents ping floods:
```nft
# Max 5 pings per second
ip protocol icmp icmp type echo-request limit rate 5/second accept
```
#### 3. Connection Tracking
Tracks connection state for efficient filtering:
```nft
# Allow responses to outgoing connections
ct state established,related accept
# Drop invalid packets
ct state invalid drop
```
### Testing Firewall
```bash
# Test configuration syntax
sudo nft -f /etc/nftables.conf
# View current rules
sudo nft list ruleset
# Start firewall
sudo rc-service nftables start
# Check status
sudo rc-service nftables status
```
### Enable at Boot
```bash
sudo rc-update add nftables default
```
### Customization
#### Allow Additional Ports
Edit `/etc/nftables.conf` and add rules in the `input` chain:
```nft
# Allow HTTP/HTTPS
tcp dport { 80, 443 } accept
# Allow custom application
tcp dport 8080 accept
```
#### Docker Integration
Uncomment Docker rules if using Docker:
```nft
# In forward chain:
iifname "docker0" accept
oifname "docker0" accept
# In nat table:
oifname $lan_interface masquerade
```
#### Block Specific IPs
```nft
# At top of input chain:
ip saddr 1.2.3.4 drop
ip saddr 5.6.7.0/24 drop
```
## Intrusion Prevention
### fail2ban Overview
fail2ban monitors log files and bans IPs with malicious behavior.
**Location**: `/etc/fail2ban/jail.local`
### Default Configuration
```ini
[DEFAULT]
bantime = 1h # Ban duration
findtime = 10m # Time window for maxretry
maxretry = 3 # Failed attempts before ban
[sshd]
enabled = true
port = ssh
maxretry = 3
bantime = 1h
```
### Starting fail2ban
```bash
# Start service
sudo rc-service fail2ban start
# Check status
sudo fail2ban-client status
# Check SSH jail
sudo fail2ban-client status sshd
# Enable at boot
sudo rc-update add fail2ban default
```
### Monitoring
```bash
# View banned IPs
sudo fail2ban-client status sshd
# Unban an IP
sudo fail2ban-client set sshd unbanip 1.2.3.4
# View fail2ban log
sudo tail -f /var/log/fail2ban.log
```
### Customization
#### Adjust Ban Times
Edit `/etc/fail2ban/jail.local`:
```ini
[sshd]
maxretry = 5 # More lenient
bantime = 24h # Longer ban
findtime = 1h # Longer time window
```
#### Add Email Notifications
```ini
[DEFAULT]
destemail = your.email@example.com
sendername = Fail2Ban
action = %(action_mwl)s # Mail with logs
```
#### Whitelist IPs
```ini
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
192.168.1.0/24
10.0.0.0/8
```
## SSH Hardening
### Overview
Hardened SSH configuration with modern ciphers and security best practices.
**Location**: `/etc/ssh/sshd_config.d/hardening.conf`
### Key Security Features
#### 1. Modern Cryptography
```
# Strong key exchange algorithms
KexAlgorithms curve25519-sha256,diffie-hellman-group-exchange-sha256
# Strong ciphers
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
# Strong MACs
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
```
#### 2. Authentication Security
```
PermitRootLogin no # No root login
PasswordAuthentication no # Keys only
MaxAuthTries 3 # Limit attempts
LoginGraceTime 30 # Quick timeout
```
#### 3. Connection Limits
```
MaxSessions 5 # Max concurrent sessions
ClientAliveInterval 300 # 5 min keepalive
ClientAliveCountMax 2 # 2 missed keepalives = disconnect
```
#### 4. Disable Insecure Features
```
X11Forwarding no # No X11
PermitUserEnvironment no # No env manipulation
HostbasedAuthentication no # No host-based auth
IgnoreRhosts yes # Ignore .rhosts
```
### Testing SSH Configuration
```bash
# Test configuration syntax
sudo sshd -t
# Test connection (from another terminal)
ssh alexander@localhost
# View active SSH sessions
who
# View SSH logs
sudo tail -f /var/log/auth.log
```
### Apply SSH Changes
```bash
# Restart SSH service
sudo rc-service sshd restart
# Or reload configuration
sudo kill -HUP $(cat /var/run/sshd.pid)
```
### SSH Key Setup
If not already using SSH keys:
```bash
# Generate ED25519 key (modern, secure)
ssh-keygen -t ed25519 -C "alexander@lenovo-gentoo"
# Or RSA 4096 (wider compatibility)
ssh-keygen -t rsa -b 4096 -C "alexander@lenovo-gentoo"
# Copy to remote host
ssh-copy-id user@remote-host
# Test key-based login
ssh user@remote-host
```
## Additional Security
### 1. System Updates
Keep system updated:
```bash
# Update package database
emerge --sync
# Check for updates
emerge -uDNp @world
# Install updates
emerge -uDN @world
# Check for security advisories
glsa-check -l
```
### 2. Audit Logging
Enable system auditing:
```bash
# Install audit daemon
emerge -av sys-process/audit
# Enable service
rc-update add auditd default
rc-service auditd start
# View audit logs
ausearch -m avc
```
### 3. File Integrity Monitoring
Use AIDE for file integrity:
```bash
# Install AIDE
emerge -av app-forensics/aide
# Initialize database
aide --init
# Check for changes
aide --check
```
### 4. Kernel Hardening
Enable kernel security features in `/etc/sysctl.conf`:
```conf
# Prevent IP spoofing
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# Ignore source routed packets
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# Enable SYN cookies
net.ipv4.tcp_syncookies = 1
# Log martian packets
net.ipv4.conf.all.log_martians = 1
# Disable IPv6 if not needed
# net.ipv6.conf.all.disable_ipv6 = 1
```
Apply changes:
```bash
sudo sysctl -p
```
### 5. Automatic Updates (Optional)
**Note**: Not recommended for Gentoo due to compilation time and potential
breakage. Manual updates preferred.
## Monitoring
### Security Event Monitoring
#### 1. Check SSH Login Attempts
```bash
# Recent successful logins
last -10
# Failed login attempts
sudo grep "Failed password" /var/log/auth.log | tail -20
# All SSH activity today
sudo grep "$(date +%b\ %d)" /var/log/auth.log | grep sshd
```
#### 2. Check Firewall Drops
```bash
# View dropped packets in dmesg
sudo dmesg | grep "nftables-drop"
# View nftables statistics
sudo nft list ruleset -a
```
#### 3. Check fail2ban Bans
```bash
# Current bans
sudo fail2ban-client status sshd
# Ban history
sudo zgrep "Ban " /var/log/fail2ban.log*
```
#### 4. Check Open Ports
```bash
# Listening ports
sudo ss -tlnp
# Or with netstat
sudo netstat -tlnp
```
### Automated Monitoring Script
Create `~/bin/security-check`:
```bash
#!/bin/sh
# Daily security check script
echo "Security Status Report - $(date)"
echo "======================================"
echo ""
echo "SSH Failed Logins (last 24h):"
sudo grep "Failed password" /var/log/auth.log | \
grep "$(date +%b\ %d)" | wc -l
echo ""
echo "fail2ban Banned IPs:"
sudo fail2ban-client status sshd | grep "Banned IP list"
echo ""
echo "Open Ports:"
sudo ss -tlnp | grep LISTEN
echo ""
echo "Firewall Status:"
sudo rc-service nftables status
echo ""
echo "Last 5 Logins:"
last -5
```
Make executable:
```bash
chmod +x ~/bin/security-check
```
Run daily:
```bash
# Add to crontab
crontab -e
# Daily at 9 AM
0 9 * * * ~/bin/security-check | mail -s "Security Report" root
```
## Troubleshooting
### Firewall Blocks Legitimate Traffic
**Problem**: Cannot access services after enabling firewall
**Solution**: Add rules for required services
```bash
# Temporarily stop firewall for testing
sudo rc-service nftables stop
# Test service
# If it works, firewall is blocking it
# Add rule to /etc/nftables.conf
# Restart firewall
sudo rc-service nftables start
```
### Locked Out of SSH
**Problem**: Cannot SSH after hardening
**⚠️ Prevention**: Always keep a session open when testing SSH changes!
**Solution** (requires physical/console access):
```bash
# Via console/physical access
sudo rc-service sshd stop
# Restore backup
sudo cp /etc/ssh/sshd_config.backup.* /etc/ssh/sshd_config
# Start SSH
sudo rc-service sshd start
```
### fail2ban Not Banning
**Problem**: fail2ban doesn't ban attackers
**Check logs**:
```bash
sudo tail -f /var/log/fail2ban.log
```
**Common issues**:
1. Wrong log path in jail.local:
```bash
# Find SSH log location
grep "sshd" /var/log/* 2>/dev/null
```
2. Regex doesn't match log format:
```bash
# Test regex
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
```
3. Service not running:
```bash
sudo rc-service fail2ban restart
```
### False Positives
**Problem**: Legitimate IPs getting banned
**Solution**: Add to whitelist in `/etc/fail2ban/jail.local`:
```ini
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
192.168.2.0/24
10.0.0.0/8
```
### Performance Issues
**Problem**: Firewall causing lag
**Check rules**:
```bash
# Count rules
sudo nft list ruleset | grep -c "rule"
# Check for expensive operations
sudo nft list ruleset -a
```
**Solution**: Optimize rules, reduce logging
## Security Checklist
Daily/Weekly tasks:
- [ ] Check SSH login attempts
- [ ] Review fail2ban bans
- [ ] Check firewall logs
- [ ] Verify services are running
- [ ] Review open ports
Monthly tasks:
- [ ] Update system packages
- [ ] Review firewall rules
- [ ] Check for security advisories
- [ ] Review user accounts
- [ ] Test backup restoration
- [ ] Review logs for anomalies
## Best Practices
1. **Keep Software Updated**: Regular updates prevent exploits
2. **Minimal Services**: Only run what you need
3. **Strong Authentication**: Use keys, not passwords
4. **Monitor Logs**: Regular log review catches issues early
5. **Test Changes**: Always test in safe environment
6. **Document Everything**: Keep notes on configuration changes
7. **Backup Configs**: Before making changes
8. **Defense in Depth**: Multiple security layers
9. **Principle of Least Privilege**: Minimal permissions needed
10. **Stay Informed**: Follow security news and advisories
## See Also
- [Backup-Setup.md](Backup-Setup.md) - Backup system guide
- [USER-GUIDE.md](USER-GUIDE.md) - Quick reference guide
- [CLAUDE.md](CLAUDE.md) - System overview
- `/etc/nftables.conf` - Firewall configuration
- `/etc/fail2ban/jail.local` - fail2ban configuration
- `/etc/ssh/sshd_config.d/hardening.conf` - SSH hardening