Table of Contents
- Foundational Hardening: System Updates & Patch Management
- User & Access Control Hardening
- File System Security
- Network Security Hardening
- Kernel Security Mechanisms
- Application Security
- Auditing & Logging
- Additional Hardening Techniques
- Conclusion
- References
1. Foundational Hardening: System Updates & Patch Management
The first line of defense for any Linux system is keeping software up-to-date. Vulnerabilities in the kernel, libraries, or applications are frequently patched by developers, but unpatched systems remain exposed.
Key Practices:
- Automate Updates: Use tools like
apt(Debian/Ubuntu),yum/dnf(RHEL/CentOS), orzypper(SUSE) to automate updates. For example:# Debian/Ubuntu: Enable unattended upgrades sudo apt install unattended-upgrades sudo dpkg-reconfigure -plow unattended-upgrades - Prioritize Critical Patches: Use tools like
canonical-livepatch(Ubuntu) orkpatch/kgraft(RHEL) for kernel live patching, which applies security fixes without rebooting. - Avoid “LTS Only” Complacency: Even Long-Term Support (LTS) releases require regular patching. Verify patch status with:
# Check for pending updates sudo apt list --upgradable # Debian/Ubuntu sudo dnf check-update # RHEL/CentOS
2. User & Access Control Hardening
Unauthorized user access is a leading vector for breaches. Hardening user accounts and access policies minimizes this risk.
2.1 Strong Password Policies
Enforce complex passwords using PAM (Pluggable Authentication Modules), which controls authentication for applications (e.g., login, sudo, ssh).
- Install
libpam-cracklib(Debian/Ubuntu) orpam_cracklib(RHEL/CentOS) to enforce password complexity:# Example /etc/pam.d/common-password (Debian/Ubuntu) password requisite pam_cracklib.so retry=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1minlen=12: Minimum 12 characters.ucredit=-1: Require at least 1 uppercase letter.dcredit=-1: Require at least 1 digit.
2.2 Least Privilege Principle
- Avoid Using
rootDirectly: Restrictrootaccess to emergencies. Usesudofor administrative tasks. - Limit
sudoAccess: Configure/etc/sudoers(viavisudo) to grant granular permissions:# Allow "john" to run only specific commands as root john ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart apache2, /usr/bin/tail /var/log/auth.log - Disable
rootLogin: Block directrootaccess via SSH (see Network Security).
2.3 Account Lockout & Inactive Account Management
- Lock Accounts After Failed Logins: Use
pam_faillockto lock accounts temporarily after repeated failed attempts:# Example /etc/pam.d/common-auth (Debian/Ubuntu) auth required pam_faillock.so preauth silent audit deny=5 unlock_time=300 auth [success=1 default=ignore] pam_unix.so auth [default=die] pam_faillock.so authfail audit deny=5 unlock_time=300deny=5: Lock after 5 failed attempts.unlock_time=300: Unlock after 5 minutes (300 seconds).
- Disable Inactive Accounts: Use
userdelorchageto expire unused accounts:# Expire "olduser" in 30 days sudo chage -E $(date -d "+30 days" +%Y-%m-%d) olduser
3. File System Security
Securing file systems prevents unauthorized access, tampering, or execution of malicious code.
3.1 Standard Permissions & ACLs
- Enforce Strict File/Directory Permissions: Use
chmodandchownto restrict access. For example:# Restrict /etc/passwd to root-only modification sudo chmod 644 /etc/passwd sudo chown root:root /etc/passwd - Use ACLs for Granular Control: Access Control Lists (ACLs) extend standard
ugo(user/group/other) permissions. For example:# Allow user "john" read access to /project/docs (even if he’s not in the group) setfacl -m u:john:r /project/docs # Verify ACLs getfacl /project/docs
3.2 Immutable Files & Directories
Prevent accidental or malicious modification of critical files (e.g., /etc/shadow, /etc/sudoers) using chattr (change file attributes):
# Make /etc/passwd immutable (only root can revert with chattr -i)
sudo chattr +i /etc/passwd
# List attributes
lsattr /etc/passwd
3.3 Secure /tmp & /var/tmp
The /tmp and /var/tmp directories are world-writable and often targeted for attacks. Harden them by:
- Mounting as
tmpfs(in-memory file system) withnoexec,nodev, andnosuidflags in/etc/fstab:# Example /etc/fstab entry tmpfs /tmp tmpfs defaults,noexec,nodev,nosuid,size=2G 0 0 - Using
systemd-tmpfilesto auto-clean/tmpon reboot:# Verify cleanup rules in /usr/lib/tmpfiles.d/tmp.conf
3.4 File Integrity Monitoring (FIM)
Detect unauthorized file changes with tools like AIDE (Advanced Intrusion Detection Environment) or Tripwire:
# Install AIDE
sudo apt install aide # Debian/Ubuntu
# Initialize baseline (store securely offline)
sudo aideinit
# Update baseline after legitimate changes
sudo aide --update
# Check for modifications
sudo aide --check
4. Network Security Hardening
Linux systems are often exposed to networks, making firewall rules and service hardening critical.
4.1 Firewalls: ufw, iptables, & nftables
ufw(Uncomplicated Firewall): A user-friendly frontend foriptables(default on Ubuntu):# Allow SSH (port 22) and HTTP (port 80), deny all else sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw default deny incoming sudo ufw enable # Start on bootnftables: The modern replacement foriptables(used by default in RHEL 8+ and Debian 10+). Example rule to block ICMP (ping):sudo nft add rule inet filter input icmp type echo-request drop
4.2 SSH Hardening
SSH is a primary entry point; secure it by editing /etc/ssh/sshd_config:
# Disable password authentication (use SSH keys instead)
PasswordAuthentication no
# Disable root login
PermitRootLogin no
# Limit users allowed to SSH
AllowUsers john mary
# Use modern ciphers and key exchanges
Ciphers [email protected],[email protected]
KexAlgorithms [email protected],diffie-hellman-group-exchange-sha256
Restart SSH after changes: sudo systemctl restart sshd.
4.3 Disable Unused Services
Stop and disable unnecessary services (e.g., telnet, ftp, cups) to reduce attack surface:
# List running services
sudo systemctl list-unit-files --type=service --state=enabled
# Disable a service (e.g., telnet)
sudo systemctl disable --now telnet
5. Kernel Security Mechanisms
The Linux kernel is the core of the OS; hardening it mitigates low-level attacks like privilege escalation and memory corruption.
5.1 SELinux (Security-Enhanced Linux)
Developed by the NSA, SELinux enforces mandatory access control (MAC) by labeling files, processes, and network ports with “security contexts.”
- Modes:
enforcing: Blocks policy violations (default on RHEL/CentOS).permissive: Logs violations but allows them (use for testing).disabled: No enforcement (avoid this).
- Manage Policies: Use
semanageandsetseboolto customize rules:# Allow Apache to read /data/docs (label with httpd_sys_content_t) sudo semanage fcontext -a -t httpd_sys_content_t "/data/docs(/.*)?" sudo restorecon -Rv /data/docs
5.2 AppArmor
A simpler alternative to SELinux (default on Ubuntu), AppArmor uses profile-based MAC to restrict application behavior.
- Profiles: Stored in
/etc/apparmor.d/(e.g.,usr.sbin.nginxfor Nginx). - Modes:
enforce: Blocks violations.complain: Logs violations (useaa-complain /etc/apparmor.d/usr.sbin.nginx).
- Example: Restrict Nginx from writing to
/tmpby editing its AppArmor profile.
5.3 Kernel Hardening with sysctl
Tweak kernel parameters in /etc/sysctl.conf or /etc/sysctl.d/ to disable risky features:
# /etc/sysctl.d/hardening.conf
net.ipv4.tcp_syncookies = 1 # Mitigate SYN floods
net.ipv4.icmp_echo_ignore_all = 1 # Block ping
kernel.randomize_va_space = 2 # Enable ASLR (Address Space Layout Randomization)
kernel.dmesg_restrict = 1 # Prevent non-root users from reading kernel logs
Apply changes with sudo sysctl -p /etc/sysctl.d/hardening.conf.
5.4 Grsecurity/PaX (Advanced Kernel Hardening)
For high-security environments, Grsecurity (with PaX) adds memory protections like:
- Address Space Layout Randomization (ASLR).
- Executable Space Protection (NX): Blocks execution of stack/heap memory.
- Kernel Stack Protection: Prevents stack overflow attacks.
Note: Grsecurity is now commercial, but community alternatives likelinux-hardened(Arch Linux) exist.
6. Application Security
Applications (e.g., web servers, databases) are frequent targets. Hardening them involves limiting privileges and sandboxing.
6.1 Run Applications as Non-Root
Never run services like Nginx or MySQL as root. Most modern apps (e.g., Apache, PostgreSQL) use a dedicated user/group by default. Verify with:
ps aux | grep nginx # Should show "nginx: worker process" running as "www-data"
6.2 Sandboxing
Isolate applications from the host system using:
chroot: A legacy tool to restrict an app to a directory subtree (limited security).systemd-nspawn: Lightweight containerization for isolating services.- Docker/Podman: Use
--userto run containers as non-root, and--read-onlyto restrict write access:docker run --user 1000:1000 --read-only -d nginx
6.3 Vulnerability Scanning
Scan for outdated or vulnerable packages with tools like:
lynis: A security auditing tool that checks for misconfigurations and vulnerabilities:sudo apt install lynis sudo lynis audit systemClamAV: Antivirus for Linux (detects malware in user uploads or shared directories):sudo apt install clamav sudo freshclam # Update virus definitions sudo clamscan -r /home # Scan /home recursively
7. Auditing & Logging
Auditing tracks system activity, enabling post-incident analysis and real-time threat detection.
7.1 Centralized Logging
Aggregate logs from multiple systems with tools like ELK Stack (Elasticsearch, Logstash, Kibana) or Graylog. For small environments, use rsyslog to forward logs to a central server:
# /etc/rsyslog.conf (on client)
*.* @@logserver.example.com:514 # Forward all logs to logserver via TCP
7.2 auditd: Kernel-Level Auditing
The auditd daemon logs system calls (e.g., file access, process execution) via the Linux Audit Framework. Example rule to monitor /etc/shadow:
# Add rule to /etc/audit/rules.d/audit.rules
-w /etc/shadow -p wa -k shadow_changes # Log write/append events
# Restart auditd
sudo systemctl restart auditd
# Search logs with ausearch
sudo ausearch -k shadow_changes
7.3 Log Retention & Protection
- Store logs on immutable storage (e.g.,
chattr +i /var/log/auth.log). - Comply with regulations like GDPR (7-year retention) or HIPAA (6 years) using
logrotate.
8. Additional Hardening Techniques
8.1 Secure Boot
Prevent unauthorized kernel/bootloader modifications with UEFI Secure Boot, which verifies signatures of boot components. Enable in BIOS/UEFI settings and use tools like sbctl (Linux) to manage keys.
8.2 Disk Encryption
Encrypt data at rest with LUKS (Linux Unified Key Setup) for full-disk encryption or cryptsetup for individual partitions:
# Encrypt a partition (e.g., /dev/sdb1)
sudo cryptsetup luksFormat /dev/sdb1
sudo cryptsetup open /dev/sdb1 encrypted_disk
sudo mkfs.ext4 /dev/mapper/encrypted_disk
8.3 Minimize Attack Surface
- Remove unused packages:
sudo apt autoremove(Debian/Ubuntu) orsudo dnf autoremove(RHEL). - Disable unused kernel modules: Blacklist in
/etc/modprobe.d/blacklist.conf(e.g.,blacklist bluetooth).
9. Conclusion
Linux security hardening is a continuous process, not a one-time task. By combining foundational practices (updates, access control) with advanced mechanisms (SELinux, FIM), you can significantly reduce your system’s vulnerability to attacks. Remember: defense in depth—no single tool or policy guarantees security, but layers of protection minimize risk.