This guide lists essential considerations to harden (enhance) a Linux server to reduce the attack surface, reduce the impact or protect the system against human error, and manage users and privileges.
Preparation
- Plan and the logical and physical diagrams that represents the infrastructure and its systems,
- Create a Software Bill of Material (SBOM) per server and link to the ports,
- Represent graphically (with illustrations) and document all relationship between applications and services on the network,
Planning
- Enumerate the layers of communication to apply Defense-in-Depth,
- Define an Entry Point for the network and deploy the resources in High-Availability to prevent single point of failure,
- Frequently the network entry point will have:
- One primarily firewall between the internet and the DMZ,
- And another firewall between the DMZ and the private network.
- Make the firewall rules as much restrictive as possible,
- Use VLANs and ACLs whenever applicable,
- In case of physical infrastructures use consider using dedicated data links in the Core Network,
- And Port Security for the Transport and Access Networks when possible,
- Strategically define where in the network the IDS/IPS shall be located and what will be protected (Network-Bases Protection),
- End points also must have up to date anti-virus, anti-malware, and firewall rules accordingly (Host-Based Protection),
- Avoid or eliminate the usage of Legacy services such as Telnet, FTP, RSH, HTTP, etc. They are all non-encrypted services.
- If it is unenviable tunnel the traffic over encrypted or dedicated sniff-proof means.
Hardening points to target
- Hardware
- Restrict physical access and to servers and network devices with locks, alarms, or cameras if necessary,
- Prefer UEFI (uses GPT) over BIOS (uses MBR),
- Enable TPM 2.0 when possible.
- BIOS
- Create password to access the BIOS/UEFI menus.
- Operating System
- Bootloader
- Limit the access to the bootloader configuration and to the boot volume (desirable read-only for /boot),
- Use password for groups or users in GRUB to limit the boot options such as kernel versions of multi operating system boot.
- Kernel
- Customize the Kernel compilation to only load the drivers for the used pieces of hardware,
- Hide process from other users (only root should be able of seen all processes),
- Isolate processes resources with Control Groups and Namespaces,
- Enable SELinux, AppArmor, and Exec Shield,
- Always choose LTS version of the desires distribution and update it regularly (consider unattended upgrades),
- Remove orphan (unused) packets and unused resources such as X11, Firewire, IPv6,
- Consider disabling Ctrl+Alt+Delete if not needed,
- Reserve disk space for a SWAP partition,
- Encrypt volumes that store sensitive data,
- Disable root login or disable completely the root account,
- Granularly assign what each user can or cannot execute with sudo and configure notifications,
- Bootloader
- Services
- Leverage system and application level containerization (LXD and Docker, respectively),
- Periodically list and audit the listening ports,
- Apply all best practices to the SSH service:
- Dot not allow empty passwords (preferably no passwords at all) nor root login,
- Require SSH-Keys and a secondary factor such as OTP mobile app [Link] or USB/NFC Hardware Key [Link],
- Only allow certain users or groups or use restrictive rules to allow connections that Match an specific pattern,
- Ans always use Fail2Ban in combination with most of your publicly facing services [Link].
- Administration
- Centralize the logs in a Log Server,
- Configure LogWatch and LogCheck to monitor the logs and send reports periodically,
- Disable and remove unused or unnecessary services,
- Allow/Deny the users that should use cron or not,
- Define a reasonable timeout for the for the shells,
- Find and disable SUID and GUID permission files,
- Use PAM (Pluggable Authentication Modules) to enforce Strong Passwords (length, complexity, reusability, etc) and Password Age parameters,
- Configure Kerberos when possible,
- Validate the UIDs periodically and identify users with empty password,
- Stablish policies to lock inactive users.
- Users
- Assign privileges to Groups instead Users, even if the user is the only member of the group,
- Use a directory service or manage the users with automation tools such as Ansible.
Desired State
- Encryption in Transit,
- Encryption in Rest,
- Restrict read and write with Least Privilege Access Control,
- Per Files,
- Per Directory,
- Per Volumes.