Secure Linux Server From Hackers

Every server is vulnerable from hackers especially if you have not taken any action to prevent this from happening. So what can you do to protect yourself from a hacker?

Enable Automatic Updates

Most servers are hacked because they did not have any security updates. To update manually you first check your repositories for updates by running the following command as the root user.

    apt update

To upgrade you run the command

    apt upgrade

To install updates automatically you run:

    apt install unattended-upgrades

to setup automatic upgrades you run:

    dpkg-reconfigure --priority=low unattended-upgrades

Limited User Account

The root user has the ability to make damaging changes to your linux system. So lets limit the user account. As the root user run the following command:

    adduser <username>

Then add user to the sudo group

    usermod -aG sudo <username>

SSH Keys

We will create an authentication key-pair and save it to the associated user:

    mkdir ~/.ssh && chmod 700 ~/.ssh

On your users machine run the following command to generate the key pair

    ssh-keygen -b 4096

the copy the public key to the server

Windows:

    scp $env:USERPROFILE/.ssh/id_rsa.pub <username>@<server-address>:<path-to-authorized-keys>

Linux:

    ssh-copy-id <username>@<server-address>

MacOS:

    scp ~/.ssh/id_rsa.pub <username>@<server-address>:<path-to-authorized-keys>

Harden SSH

We will stop the use of password to login to our server. We edit the file /etc/ssh/sshd_config

First copy the file to a backup

    sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

Then edit the file

    sudo nano /etc/ssh/sshd_config

update the contents to:

    #       $OpenBSD: sshd_config,v 1.103 2018/04/09 20:41:22 tj Exp $

    # This is the sshd server system-wide configuration file.  See
    # sshd_config(5) for more information.

    # This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin

    # The strategy used for options in the default sshd_config shipped with
    # OpenSSH is to specify options with their default value where
    # possible, but leave them commented.  Uncommented options override the
    # default value.

    Include /etc/ssh/sshd_config.d/*.conf

    Port 35020
    #AddressFamily any
    #ListenAddress 0.0.0.0
    #ListenAddress ::

    #HostKey /etc/ssh/ssh_host_rsa_key
    #HostKey /etc/ssh/ssh_host_ecdsa_key
    #HostKey /etc/ssh/ssh_host_ed25519_key

    # Ciphers and keying
    #RekeyLimit default none

    # Logging
    #SyslogFacility AUTH
    #LogLevel INFO

    # Authentication:

    #LoginGraceTime 2m
    PermitRootLogin no
    #StrictModes yes
    MaxAuthTries 4
    #MaxSessions 10

    #PubkeyAuthentication yes

    # Expect .ssh/authorized_keys2 to be disregarded by default in future.
    #AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2

    #AuthorizedPrincipalsFile none

    #AuthorizedKeysCommand none
    #AuthorizedKeysCommandUser nobody

    # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
    #HostbasedAuthentication no
    # Change to yes if you don't trust ~/.ssh/known_hosts for
    # HostbasedAuthentication
    #IgnoreUserKnownHosts no
    # Don't read the user's ~/.rhosts and ~/.shosts files
    #IgnoreRhosts yes

    # To disable tunneled clear text passwords, change to no here!
    PasswordAuthentication no
    PermitEmptyPasswords no

    # Change to yes to enable challenge-response passwords (beware issues with
    # some PAM modules and threads)
    ChallengeResponseAuthentication no

    # Kerberos options
    #KerberosAuthentication no
    #KerberosOrLocalPasswd yes
    #KerberosTicketCleanup yes
    #KerberosGetAFSToken no

    # GSSAPI options
    #GSSAPIAuthentication no
    #GSSAPICleanupCredentials yes
    #GSSAPIStrictAcceptorCheck yes
    #GSSAPIKeyExchange no

    # Set this to 'yes' to enable PAM authentication, account processing,
    # and session processing. If this is enabled, PAM authentication will
    # be allowed through the ChallengeResponseAuthentication and
    # PasswordAuthentication.  Depending on your PAM configuration,
    # PAM authentication via ChallengeResponseAuthentication may bypass
    # the setting of "PermitRootLogin without-password".
    # If you just want the PAM account and session checks to run without
    # PAM authentication, then enable this but set PasswordAuthentication
    # and ChallengeResponseAuthentication to 'no'.
    UsePAM yes

    #AllowAgentForwarding yes
    #AllowTcpForwarding yes
    #GatewayPorts no
    X11Forwarding yes
    #X11DisplayOffset 10
    #X11UseLocalhost yes
    #PermitTTY yes
    PrintMotd no
    #PrintLastLog yes
    #TCPKeepAlive yes
    #PermitUserEnvironment no
    #Compression delayed
    ClientAliveInterval 300
    #ClientAliveCountMax 3
    #UseDNS no
    #PidFile /var/run/sshd.pid
    #MaxStartups 10:30:100
    #PermitTunnel no
    #ChrootDirectory none
    #VersionAddendum none

    # no default banner path
    #Banner none

    # Allow client to pass locale environment variables
    AcceptEnv LANG LC_*

    # override default of no subsystems
    Subsystem sftp  /usr/lib/openssh/sftp-server

    # Example of overriding settings on a per-user basis
    #Match User anoncvs
    #       X11Forwarding no
    #       AllowTcpForwarding no
    #       PermitTTY no
    #       ForceCommand cvs server

    #Permitted users
    AllowUsers user1 user2 user3

    #SSH protocal to use
    Protocol 2

Restart the ssh service:

    sudo service restart ssh

Firewall

Check which ports are being used by the server:

    sudo ss -tupln

Then, check if your firewall is active:

    sudo ufw status

Allow the port that is enabled:

    sudo ufw allow <port-number>