Complete Linux Server Security Hardening Guide 2026: Enterprise Best Practices
π― Key Takeaways
- Introduction to Linux Server Security Hardening
- Why Linux Security Hardening Matters
- Security Hardening Checklist Overview
- 1. Initial Server Configuration
- 2. User Account Security
π Table of Contents
- Introduction to Linux Server Security Hardening
- Why Linux Security Hardening Matters
- Security Hardening Checklist Overview
- 1. Initial Server Configuration
- 2. User Account Security
- 3. SSH Hardening
- 4. Firewall Configuration
- 5. Kernel Hardening with sysctl
- 6. SELinux/AppArmor Configuration
- 7. Service and Package Management
- 8. File System Security
- 9. Automated Security Updates
- 10. Intrusion Detection with AIDE
- 11. Centralized Logging and Monitoring
- 12. Two-Factor Authentication
- Security Compliance Frameworks
- Ongoing Security Maintenance
- Automated Security Hardening Script
- Conclusion
Introduction to Linux Server Security Hardening
In 2026, server breaches cost businesses an average of $4.45 million per incident. Linux servers, while inherently more secure than many alternatives, are not immune to attacks. Proper security hardening is essential for protecting sensitive data, maintaining compliance, and preventing costly breaches.
π Table of Contents
- Introduction to Linux Server Security Hardening
- Why Linux Security Hardening Matters
- Security Hardening Checklist Overview
- 1. Initial Server Configuration
- Update System Packages
- Set Strong Hostname
- Configure Timezone
- 2. User Account Security
- Create Admin User (Never Use Root Directly)
- Disable Root Login
- Enforce Strong Password Policy
- Configure Password Aging
- 3. SSH Hardening
- Generate SSH Key Pair (On Your Local Machine)
- SSH Server Configuration
- Implement Fail2Ban
- 4. Firewall Configuration
- UFW Firewall (Ubuntu/Debian)
- Firewalld (Rocky Linux/RHEL)
- Advanced: IP Whitelisting
- 5. Kernel Hardening with sysctl
- 6. SELinux/AppArmor Configuration
- SELinux (Rocky Linux/RHEL)
- AppArmor (Ubuntu/Debian)
- 7. Service and Package Management
- Remove Unnecessary Packages
- Disable Unused Services
- 8. File System Security
- Secure /tmp Partition
- Set Proper File Permissions
- Enable File System Auditing
- 9. Automated Security Updates
- Ubuntu/Debian – Unattended Upgrades
- Rocky Linux/RHEL – dnf-automatic
- 10. Intrusion Detection with AIDE
- 11. Centralized Logging and Monitoring
- Install and Configure rsyslog
- Install Log Monitoring (Logwatch)
- 12. Two-Factor Authentication
- Security Compliance Frameworks
- CIS Benchmark Compliance
- OpenSCAP for RHEL-based Systems
- Ongoing Security Maintenance
- Weekly Tasks
- Monthly Tasks
- Quarterly Tasks
- Automated Security Hardening Script
- Conclusion
This comprehensive guide covers enterprise-grade security hardening techniques for Linux servers, from initial deployment through ongoing maintenance. Whether you’re securing a single VPS or managing hundreds of cloud instances, these practices will significantly improve your security posture.
Why Linux Security Hardening Matters
Default Linux installations are designed for ease of use, not maximum security. Security hardening involves:
- Reducing attack surface: Disable unnecessary services and ports
- Implementing defense in depth: Multiple layers of security controls
- Principle of least privilege: Minimal permissions required for operation
- Compliance requirements: Meet PCI-DSS, HIPAA, SOC 2 standards
- Zero-trust architecture: Verify everything, trust nothing
Security Hardening Checklist Overview
We’ll cover these critical areas:
- Initial server configuration
- User account and authentication security
- SSH hardening
- Firewall configuration
- Kernel hardening and sysctl
- SELinux/AppArmor mandatory access controls
- Service and package management
- File system security
- Audit logging and monitoring
- Automated security updates
- Intrusion detection systems
- Regular security audits
1. Initial Server Configuration
Update System Packages
Always start with a fully patched system:
# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y
# Rocky Linux/RHEL
sudo dnf update -y
# Reboot if kernel updated
sudo reboot
Set Strong Hostname
sudo hostnamectl set-hostname secure-prod-web-01
echo "127.0.1.1 secure-prod-web-01" | sudo tee -a /etc/hosts
Configure Timezone
sudo timedatectl set-timezone UTC
sudo timedatectl set-ntp true
2. User Account Security
Create Admin User (Never Use Root Directly)
# Create new admin user
sudo adduser secadmin
# Add to sudo/wheel group
sudo usermod -aG sudo secadmin # Ubuntu/Debian
sudo usermod -aG wheel secadmin # Rocky Linux/RHEL
# Set strong password
sudo passwd secadmin
Disable Root Login
# Lock root account
sudo passwd -l root
# Alternative: Set no password
sudo passwd -d root
Enforce Strong Password Policy
Install and configure PAM password quality module:
# Ubuntu/Debian
sudo apt install libpam-pwquality
# Rocky Linux/RHEL
sudo dnf install libpwquality
# Configure password requirements
sudo vi /etc/security/pwquality.conf
Add these settings:
minlen = 14
dcredit = -1
ucredit = -1
ocredit = -1
lcredit = -1
difok = 3
maxrepeat = 3
Configure Password Aging
sudo vi /etc/login.defs
# Set these values
PASS_MAX_DAYS 90
PASS_MIN_DAYS 1
PASS_WARN_AGE 7
3. SSH Hardening
SSH is the primary attack vector. Harden it aggressively.
Generate SSH Key Pair (On Your Local Machine)
ssh-keygen -t ed25519 -C "admin@company.com"
# Or for RSA: ssh-keygen -t rsa -b 4096
# Copy public key to server
ssh-copy-id -i ~/.ssh/id_ed25519.pub secadmin@server_ip
SSH Server Configuration
sudo vi /etc/ssh/sshd_config
Apply these hardening settings:
# Disable root login
PermitRootLogin no
# Disable password authentication (use keys only)
PasswordAuthentication no
ChallengeResponseAuthentication no
PubkeyAuthentication yes
# Change default port (security through obscurity)
Port 2222
# Limit user access
AllowUsers secadmin deployer
# Disable empty passwords
PermitEmptyPasswords no
# Disable X11 forwarding if not needed
X11Forwarding no
# Use strong ciphers only
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512
# Set login grace time
LoginGraceTime 30
# Maximum authentication attempts
MaxAuthTries 3
# Maximum sessions per connection
MaxSessions 2
# Client timeout
ClientAliveInterval 300
ClientAliveCountMax 2
# Log level
LogLevel VERBOSE
Restart SSH after changes:
sudo systemctl restart sshd
# Test SSH from another terminal before closing current session!
ssh -p 2222 secadmin@server_ip
Implement Fail2Ban
Automatically ban IPs with failed login attempts:
# Install fail2ban
sudo apt install fail2ban # Ubuntu/Debian
sudo dnf install fail2ban # Rocky Linux/RHEL
# Create local configuration
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local
Configure SSH jail:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
# Start fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Check status
sudo fail2ban-client status sshd
4. Firewall Configuration
UFW Firewall (Ubuntu/Debian)
# Install UFW
sudo apt install ufw
# Default policies
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Allow SSH (custom port)
sudo ufw allow 2222/tcp
# Allow HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Enable firewall
sudo ufw enable
# Check status
sudo ufw status verbose
Firewalld (Rocky Linux/RHEL)
# Install firewalld
sudo dnf install firewalld
# Start and enable
sudo systemctl enable firewalld
sudo systemctl start firewalld
# Set default zone
sudo firewall-cmd --set-default-zone=public
# Add services/ports
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# Reload rules
sudo firewall-cmd --reload
# Check configuration
sudo firewall-cmd --list-all
Advanced: IP Whitelisting
# Only allow SSH from specific IPs
sudo ufw delete allow 2222/tcp
sudo ufw allow from 203.0.113.0/24 to any port 2222 proto tcp
5. Kernel Hardening with sysctl
Tune kernel parameters for security:
sudo vi /etc/sysctl.d/99-security.conf
Add these critical settings:
# Disable IP forwarding
net.ipv4.ip_forward = 0
# Disable packet redirects
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# Ignore ICMP pings
net.ipv4.icmp_echo_ignore_all = 1
# Ignore source routed packets
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# Log martian packets
net.ipv4.conf.all.log_martians = 1
# Enable SYN flood protection
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
# Protect against TCP time-wait attacks
net.ipv4.tcp_rfc1337 = 1
# Enable reverse path filtering
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Disable IPv6 if not used
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
# Kernel pointer hiding
kernel.kptr_restrict = 2
# Restrict dmesg access
kernel.dmesg_restrict = 1
# Restrict perf events
kernel.perf_event_paranoid = 3
# Core dump restrictions
kernel.core_uses_pid = 1
fs.suid_dumpable = 0
# Address space layout randomization
kernel.randomize_va_space = 2
Apply settings:
sudo sysctl -p /etc/sysctl.d/99-security.conf
6. SELinux/AppArmor Configuration
SELinux (Rocky Linux/RHEL)
Never disable SELinux in production. Fix policies instead:
# Check SELinux status
sestatus
# Ensure it's enforcing
sudo setenforce 1
sudo vi /etc/selinux/config
# Set: SELINUX=enforcing
# Install tools
sudo dnf install policycoreutils-python-utils setroubleshoot-server
# Check for denials
sudo ausearch -m avc -ts recent
# Generate policy fixes
sudo ausearch -m avc -ts recent | audit2allow -M mypolicy
sudo semodule -i mypolicy.pp
AppArmor (Ubuntu/Debian)
# Check AppArmor status
sudo aa-status
# Install utilities
sudo apt install apparmor-utils
# Set profile to enforce mode
sudo aa-enforce /etc/apparmor.d/usr.sbin.apache2
# Reload profiles
sudo systemctl reload apparmor
7. Service and Package Management
Remove Unnecessary Packages
# List installed packages
dpkg -l | grep '^ii' # Debian/Ubuntu
rpm -qa # Rocky Linux/RHEL
# Remove unused services
sudo apt remove telnet ftp rsh-client # Ubuntu/Debian
sudo dnf remove telnet ftp # Rocky Linux/RHEL
Disable Unused Services
# List all services
systemctl list-unit-files --type=service
# Disable unused services
sudo systemctl disable cups # Printing
sudo systemctl disable avahi-daemon # Zeroconf
sudo systemctl disable bluetooth # Bluetooth
8. File System Security
Secure /tmp Partition
Mount /tmp with noexec, nosuid, nodev:
sudo vi /etc/fstab
# Add or modify /tmp line
tmpfs /tmp tmpfs defaults,noexec,nosuid,nodev,size=2G 0 0
# Remount
sudo mount -o remount /tmp
Set Proper File Permissions
# Secure sensitive files
sudo chmod 644 /etc/passwd
sudo chmod 000 /etc/shadow
sudo chmod 644 /etc/group
sudo chmod 000 /etc/gshadow
sudo chmod 600 /boot/grub/grub.cfg
# Find world-writable files
sudo find / -xdev -type f -perm -0002 -ls
# Find files without owner
sudo find / -xdev -nouser -o -nogroup -ls
Enable File System Auditing
# Install auditd
sudo apt install auditd # Ubuntu/Debian
sudo dnf install audit # Rocky Linux/RHEL
# Start service
sudo systemctl enable auditd
sudo systemctl start auditd
# Add audit rules
sudo vi /etc/audit/rules.d/audit.rules
Example audit rules:
# Monitor /etc/passwd changes
-w /etc/passwd -p wa -k passwd_changes
# Monitor sudo usage
-w /etc/sudoers -p wa -k sudoers_changes
# Monitor authentication logs
-w /var/log/auth.log -p wa -k auth_logs
# Monitor network configuration changes
-w /etc/network/ -p wa -k network_changes
# Monitor SSH configuration
-w /etc/ssh/sshd_config -p wa -k sshd_config_changes
Reload audit rules:
sudo augenrules --load
9. Automated Security Updates
Ubuntu/Debian – Unattended Upgrades
# Install unattended-upgrades
sudo apt install unattended-upgrades apt-listchanges
# Configure
sudo dpkg-reconfigure unattended-upgrades
# Edit configuration
sudo vi /etc/apt/apt.conf.d/50unattended-upgrades
Enable automatic security updates:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"${distro_id}ESMApps:${distro_codename}-apps-security";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::MinimalSteps "true";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:00";
Rocky Linux/RHEL – dnf-automatic
# Install dnf-automatic
sudo dnf install dnf-automatic
# Configure
sudo vi /etc/dnf/automatic.conf
# Set:
apply_updates = yes
download_updates = yes
# Enable timer
sudo systemctl enable dnf-automatic.timer
sudo systemctl start dnf-automatic.timer
10. Intrusion Detection with AIDE
AIDE (Advanced Intrusion Detection Environment) monitors file integrity:
# Install AIDE
sudo apt install aide aide-common # Ubuntu/Debian
sudo dnf install aide # Rocky Linux/RHEL
# Initialize database (takes several minutes)
sudo aideinit
# Copy database to production location
sudo cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db
# Check for changes
sudo aide --check
# Create daily cron job
sudo vi /etc/cron.daily/aide
#!/bin/bash
/usr/bin/aide --check | mail -s "AIDE Report" admin@company.com
sudo chmod +x /etc/cron.daily/aide
11. Centralized Logging and Monitoring
Install and Configure rsyslog
# rsyslog usually pre-installed
sudo systemctl status rsyslog
# Configure remote logging
sudo vi /etc/rsyslog.d/50-remote.conf
# Add:
*.* @@log-server.company.com:514
# Restart rsyslog
sudo systemctl restart rsyslog
Install Log Monitoring (Logwatch)
# Install logwatch
sudo apt install logwatch # Ubuntu/Debian
sudo dnf install logwatch # Rocky Linux/RHEL
# Run manual report
sudo logwatch --detail High --range today
# Configure daily email reports
sudo vi /etc/cron.daily/00logwatch
#!/bin/bash
/usr/sbin/logwatch --output mail --mailto admin@company.com --detail high
12. Two-Factor Authentication
Add 2FA to SSH logins:
# Install Google Authenticator
sudo apt install libpam-google-authenticator # Ubuntu/Debian
sudo dnf install google-authenticator # Rocky Linux/RHEL
# Configure for user
google-authenticator
# Edit PAM configuration
sudo vi /etc/pam.d/sshd
# Add at the top:
auth required pam_google_authenticator.so
# Edit SSH config
sudo vi /etc/ssh/sshd_config
# Set:
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
# Restart SSH
sudo systemctl restart sshd
Security Compliance Frameworks
CIS Benchmark Compliance
Use automated tools to check CIS compliance:
# Install Lynis security audit tool
sudo apt install lynis # Ubuntu/Debian
sudo dnf install lynis # Rocky Linux/RHEL
# Run security audit
sudo lynis audit system
# Review report
cat /var/log/lynis.log
OpenSCAP for RHEL-based Systems
# Install OpenSCAP
sudo dnf install openscap-scanner scap-security-guide
# Run security scan
sudo oscap xccdf eval --profile xccdf_org.ssgproject.content_profile_pci-dss --results-arf /tmp/scan-results.xml --report /tmp/scan-report.html /usr/share/xml/scap/ssg/content/ssg-rl9-ds.xml
# View report
firefox /tmp/scan-report.html
Ongoing Security Maintenance
Weekly Tasks
- Review failed login attempts
- Check system logs for anomalies
- Verify backup integrity
- Review firewall logs
Monthly Tasks
- Update security patches
- Review user accounts and permissions
- Run vulnerability scans
- Test disaster recovery procedures
- Review AIDE integrity reports
Quarterly Tasks
- Full security audit
- Penetration testing
- Update documentation
- Security awareness training
- Review and update incident response plan
Automated Security Hardening Script
Here’s a basic automated hardening script for Ubuntu/Debian:
#!/bin/bash
# Basic Linux Server Hardening Script
# Update system
apt update && apt upgrade -y
# Install essential security packages
apt install -y fail2ban ufw aide logwatch unattended-upgrades
# Configure UFW firewall
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp
ufw --force enable
# Install and configure fail2ban
systemctl enable fail2ban
systemctl start fail2ban
# Enable automatic security updates
dpkg-reconfigure -plow unattended-upgrades
# Set password quality requirements
apt install -y libpam-pwquality
# Lock root account
passwd -l root
echo "Basic hardening complete. Review /var/log/hardening.log"
Conclusion
Linux server security hardening is not a one-time task but an ongoing process. By implementing these enterprise-grade security measures, you significantly reduce your attack surface and improve your overall security posture.
Priority implementation order:
- SSH hardening and key-based authentication
- Firewall configuration
- Automatic security updates
- Fail2ban installation
- User account security
- Kernel hardening (sysctl)
- SELinux/AppArmor enforcement
- Audit logging and monitoring
Remember: Security is a journey, not a destination. Stay updated on emerging threats, regularly audit your systems, and continuously improve your security practices.
Secure your Linux servers today and protect your infrastructure from the 99% of automated attacks that target insecure default configurations!
Was this article helpful?
About Ramesh Sundararamaiah
Red Hat Certified Architect
Expert in Linux system administration, DevOps automation, and cloud infrastructure. Specializing in Red Hat Enterprise Linux, CentOS, Ubuntu, Docker, Ansible, and enterprise IT solutions.