tadg.ie
Home Poetry Artwork Blog Tech Snips Plays
Setup & Harden a Linux Server in 2026

Setup & Harden a Linux Server in 2026

Taḋg Paul · 29 Jan 2026

ssh in to the box …

ssh root@192.0.0.1

system updates …

Debian based systems

apt update && apt upgrade

Fedora

sudo dnf upgrade

you are probably going to want a decent editor

## fedora ##
dnf install -y neovim
# or
dnf install -y helix

## debian based ##
sudo apt install -y neovim
# or
add-apt-repository ppa:maveonair/helix-editor
apt update
apt install -y helix

set hosts

edit /etc/hostname or

hostnamectl set-hostname my-host-name

edit /etc/hosts with public IP and FQDN (fully qualified domain name)

for IPv4:

127.0.0.1	localhost.localdomain localhost
203.0.113.10	example-hostname.example.com example-hostname

and IPv6:

127.0.0.1	localhost.localdomain localhost
203.0.113.10	example-hostname.example.com example-hostname
2600:3c01::a123:b456:c789:d012	example-hostname.example.com example-hostname

add a limited user account

useradd example_user
passwd example_user
usermod --append --groups wheel,sudo example_user

get rid of annoying password requests for sudo

export VISUAL=nvim
# or export VISUAL=hx
# ...
visudo

or edit /etc/sudoers but be careful you can f**k your access if you make a syntax error and have to nuke the box

add:

%wheel ALL = (ALL) NOPASSWD:ALL

logout/login as new user

exit

and then

ssh example_user@example-hostname.example.com

Harden SSH access

grant access to new limited user

if you don't have an ssh key, generate one on local machine run:

ssh-keygen -t ed25519 -C "user@domain.tld"

then on compute instance:

mkdir -p /home/USERNAME/.ssh

upload your ssh key - from your local system run

Linux:

ssh-copy-id example_user@192.0.2.17

macOS:

install ssh-copy-id from homebrew then as above, or:

scp ~/.ssh/id_rsa.pub example_user@203.0.113.10:/home/USERNAME/.ssh/authorized_keys

Windows:

scp C:\Users\MyUserName\.ssh/id_rsa.pub example_user@192.0.2.17:~/.ssh/authorized_keys

check permissions on ssh directory:

chmod -R 700 /home/USERNAME/.ssh/

disallow root login via ssh

file /etc/ssh/sshd_config

# Authentication:
...
PermitRootLogin no

disable password authentication

same /etc/ssh/sshd_config file:

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no

restart ssh daemon

systemctl restart ssh
# could be sshd on older systems
# on non-systemd, use: service sshd restart

fail2ban

ban IP addresses that make repeated failed authentication requests

apt install -y fail2ban
# fedora:
dnf install -y fail2ban

configure it

.local files will override the default .conf files provided

cd /etc/fail2ban
cp fail2ban.conf fail2ban.local
cp jail.conf jail.local

jail.local: in CentOS or Fedora need to change backend from auto to systemd

backend = systemd

enable it

systemctl enable --now fail2ban

firewall

apt install -y ufw

CLI config

ufw allow ssh
ufw allow 22
ufw deny 25
ufw allow 80/tcp
ufw allow http/tcp
ufw allow 443/tcp
ufw allow https/tcp

more config

To allow connections from an IP address:

sudo ufw allow from 198.51.100.0

To allow connections from a specific subnet:

sudo ufw allow from 198.51.100.0/24

To allow a specific IP address/port combination:

sudo ufw allow from 198.51.100.0 to any port 22 proto tcp

proto tcp can be removed or switched to proto udp depending upon your needs, and all instances of allow can be changed to deny as needed.

Although simple rules can be added through the command line, there may be a time when more advanced or specific rules need to be added or removed. Prior to running the rules input through the terminal, UFW will run a file, before.rules, that allows loopback, ping, and DHCP. To add to alter these rules edit the /etc/ufw/before.rules file. A before6.rules file is also located in the same directory for IPv6.

An after.rule and an after6.rule file also exists to add any rules that would need to be added after UFW runs your command-line-added rules.

An additional configuration file is located at /etc/default/ufw. From here IPv6 can be disabled or enabled, default rules can be set, and UFW can be set to manage built-in firewall chains.

enable

ufw enable

intrusion detection - OSSEC

Linode OSSEC guide

Remove unused network-facing services

determine running services

sudo ss -atpu

where

-a: all listening and non-listening
-t: TCP sockets
-p: show processes
-u: UDP sockets
  • tech

Setup & Harden a Linux Server in 2026

Taḋg Paul · 29 Jan 2026
Table of contents:
  • ssh in to the box …
  • system updates …
    • Debian based systems
    • Fedora
  • you are probably going to want a decent editor
  • set hosts
    • edit /etc/hostname or
  • add a limited user account
  • get rid of annoying password requests for sudo
  • logout/login as new user
    • and then
  • Harden SSH access
    • grant access to new limited user
    • disallow root login via ssh
    • disable password authentication
    • restart ssh daemon
  • fail2ban
    • ban IP addresses that make repeated failed authentication requests
    • configure it
    • enable it
  • firewall
    • CLI config
    • enable
  • intrusion detection - OSSEC
    • Linode OSSEC guide
  • Remove unused network-facing services
    • determine running services

Related articles

  • A file renaming tool for humans tech-snips
  • Image manipulation from the command line tech-snips
  • Watch Youtube with Auto-Translated Captions tech-snips
  • Bulk delete bookmarks in Microsoft Word tech-snips
  • Firefox: disable autofill in forms tech-snips
© Taḋg Paul