SSH Configuration Hardening
SSH represents your server's most exposed attack surface. Default configurations invite brute force attempts and credential stuffing attacks.
Start by editing /etc/ssh/sshd_config with these essential changes:
Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
ClientAliveInterval 300
ClientAliveCountMax 2
Protocol 2
Generate strong SSH keys using Ed25519 encryption instead of older RSA:
ssh-keygen -t ed25519 -b 4096 -f ~/.ssh/production_key
The Ed25519 algorithm provides better security with smaller key sizes. Most production environments see a 70% reduction in SSH-based attack attempts after implementing key-based authentication.
Firewall Rules and Network Access Controls
Configure UFW (Uncomplicated Firewall) to restrict inbound traffic to essential services only. Default-deny policies prevent unauthorized access attempts.
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp comment 'SSH'
ufw allow 80/tcp comment 'HTTP'
ufw allow 443/tcp comment 'HTTPS'
ufw --force enable
For database servers, restrict MySQL or PostgreSQL access to specific application servers:
ufw allow from 10.0.1.100 to any port 3306 comment 'MySQL from app server'
Hostperl VPS hosting includes pre-configured firewall templates that implement these security controls by default.
Intrusion Detection with Fail2ban
Fail2ban monitors log files for suspicious activity and automatically blocks IP addresses showing malicious behavior patterns.
Install and configure fail2ban with custom jail settings:
apt update && apt install fail2ban -y
Create /etc/fail2ban/jail.local with production-ready settings:
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 3
backend = systemd
[sshd]
enabled = true
port = 2222
logpath = /var/log/auth.log
maxretry = 3
bantime = 7200
Monitor fail2ban status and banned IPs:
fail2ban-client status
fail2ban-client status sshd
Production servers typically see 85% fewer successful intrusion attempts after implementing fail2ban with custom rules.
File System Security and Access Controls
Set proper file permissions and access controls across your system. Many security breaches start with overly permissive file access.
Set secure default permissions for new files and directories:
echo "umask 027" >> /etc/profile
echo "umask 027" >> /etc/bash.bashrc
Secure critical system directories:
chmod 700 /root
chmod 755 /home
chown root:root /etc/passwd /etc/shadow /etc/group
chmod 644 /etc/passwd /etc/group
chmod 640 /etc/shadow
Configure separate mount points with security options for different partitions:
/dev/sda2 /home ext4 defaults,nodev,nosuid 0 2
/dev/sda3 /tmp ext4 defaults,nodev,nosuid,noexec 0 2
/dev/sda4 /var ext4 defaults,nodev 0 2
The noexec option prevents execution of binaries from temporary directories, blocking many malware installation attempts.
System Updates and Patch Management
Automated security updates prevent exploitation of known vulnerabilities. Configure unattended-upgrades for security patches:
apt install unattended-upgrades -y
dpkg-reconfigure -plow unattended-upgrades
Edit /etc/apt/apt.conf.d/20auto-upgrades:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";
For mission-critical systems, use a staged patching approach. Test updates on development environments before production deployment.
Regular patching reduces vulnerability windows by an average of 65% compared to manual update schedules. Learn more about systematic approaches in our guide to server patch management strategy for VPS fleets.
Logging and Audit Configuration
Comprehensive logging provides visibility into system activities and security events. Configure rsyslog for centralized log collection:
# Edit /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$UDPServerAddress 127.0.0.1
# Log authentication events
auth,authpriv.* /var/log/auth.log
# Log system events
*.info;mail.none;authpriv.none;cron.none /var/log/messages
Enable auditd for detailed system call monitoring:
apt install auditd audispd-plugins -y
systemctl enable auditd
Configure audit rules in /etc/audit/rules.d/audit.rules:
# Monitor file access
-w /etc/passwd -p wa -k passwd_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/ssh/sshd_config -p wa -k ssh_config
# Monitor privilege escalation
-w /bin/su -p x -k privilege_escalation
-w /usr/bin/sudo -p x -k privilege_escalation
Restart auditd and verify configuration:
service auditd restart
auditctl -l
Set up log rotation to prevent disk space issues:
# Edit /etc/logrotate.d/rsyslog
/var/log/auth.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 syslog adm
}
Service Minimization and Hardening
Disable unnecessary services to reduce your attack surface. Each running service represents a potential entry point.
List all running services:
systemctl list-units --type=service --state=running
Disable common unnecessary services:
systemctl disable cups
systemctl disable avahi-daemon
systemctl disable bluetooth
systemctl stop cups avahi-daemon bluetooth
For remaining services, apply specific hardening configurations. Apache hardening example:
# In /etc/apache2/apache2.conf
ServerTokens Prod
ServerSignature Off
Timeout 60
KeepAliveTimeout 2
Nginx security headers configuration:
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
User Account Security
Strong user account policies and privilege separation prevent most successful attacks that exploit weak user credentials or excessive privileges.
Create dedicated service accounts for applications:
useradd -r -s /bin/false -M -d /nonexistent webapp
usermod -L webapp # Lock password login
Configure password policies in /etc/login.defs:
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
PASS_MIN_LEN 12
Install and configure libpam-pwquality for password complexity:
apt install libpam-pwquality -y
Edit /etc/pam.d/common-password:
password requisite pam_pwquality.so retry=3 minlen=12 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
Configure sudo access with specific command restrictions. For detailed privilege management, reference our production container security best practices.
Network Security Monitoring
Deploy network monitoring tools to detect suspicious traffic patterns and potential intrusions.
Install and configure netstat monitoring:
netstat -tulpn | grep LISTEN
Use ss command for more detailed socket information:
ss -tlpn | grep :80
Configure iptables logging for dropped packets:
iptables -A INPUT -j LOG --log-prefix "DROPPED: " --log-level 4
iptables -A INPUT -j DROP
Monitor network connections with continuous logging:
#!/bin/bash
# Network monitoring script
while true; do
ss -tuln >> /var/log/network_connections.log
sleep 300
done
For comprehensive monitoring across multiple servers, integrate with centralized systems covered in our log shipping architecture guide.
Hostperl managed VPS hosting includes pre-hardened server configurations with these security controls already in place. Our team handles ongoing security updates and monitoring, so you can focus on your applications rather than infrastructure security.
Frequently Asked Questions
How often should I update my Linux server hardening checklist configuration?
Review your hardening configuration quarterly and update it immediately after major security advisories. Monitor security mailing lists for your distributions and apply critical patches within 48 hours.
What's the biggest security mistake in server hardening?
Leaving default SSH configurations unchanged. Most successful server compromises start with weak SSH security. Always disable root login, use key-based authentication, and change the default port.
Should I install antivirus software on Linux servers?
Antivirus isn't necessary for most Linux servers. Focus on proper hardening, regular updates, and intrusion detection instead. The security controls in this guide provide better protection than traditional antivirus.
How do I test if my server hardening is effective?
Run vulnerability scans using tools like Nmap, OpenVAS, or Lynis. Test SSH access restrictions, verify firewall rules block unexpected traffic, and check that fail2ban responds to repeated failed attempts.
Can automated hardening scripts replace manual configuration?
Automated scripts help with initial setup, but manual review and customization are essential. Each environment has unique requirements that generic scripts can't address. Use automation as a starting point, not a complete solution.

