Securing a Linux Server Part 2: SSH
Wow, it's been a while since I posted something in this series! Last time, I took a look at the Uncomplicated Firewall, and how you can use it to control the traffic coming in (and going out) of your server. This time, I'm going to take a look at steps you can take to secure another vitally important part of most servers: SSH. Used by servers and their administrators across the world to talk to one another, if someone manages to get in who isn't supposed to, they could do all kinds of damage!
The first, and easiest thing we can do it improve security is to prevent the root
user logging in. If you haven't done so already, you should create a new user on your server, set a good password, and give it superuser privileges. Login with the new user account, and then edit /etc/ssh/sshd_config
, finding the line that says something like
PermitRootLogin yes
....and change it to
PermitRootLogin no
Once done, restart the ssh server. Your config might be slightly different (e.g. it might be PermitRootLogin without-password
) - but the principle is the same. This adds an extra barrier to getting into your server, as now attackers must not only guess your password, but your username as well (some won't even bother, and keep trying to login to the root
account :P).
Next, we can move SSH to a non-standard port. Some might argue that this isn't a good security measure to take and that it doesn't actually make your server more secure, but I find that it's still a good measure to take for 2 reasons: defence in depth, and preventing excessive CPU load from all the dumb bots that try to get in on the default port. With that, it's make another modification to /etc/ssh/sshd_config
. Make sure you test at every step you take, as if you lock yourself out, you'll have a hard time getting back in again....
Port 22
Change 22
in the above to any other number between about 1
and 65535
. Next, make sure you've allowed the new port through your firewall! If you're using ufw
, my previous post (link above) gives a helpful guide on how to do this. Once done, restart your SSH server again - and try logging in before you close your current session. That way if you make a mistake, you can fix through your existing session.
Once you're confident that you've got it right, you can close port 22 on your firewall.
So we've created a new user account with a secure password (tip: use a password manager if you have trouble remembering it :-)), disabled root login, and moved the ssh port to another port number that's out of the way. Is there anything else we can do? Turns out there is.
Passwords are not the only we can authenticate against an SSH server. Public private keypairs can be used too - and are much more secure - and convenient - than passwords if used correctly. You can generate your own public-private keypair like so:
ssh-keygen -t ed25519
It will ask you a few questions, such as a password to encrypt the private key on disk, and where to save it. Once done, we need to tell ssh
to use the new public-private keypair. This is fairly easy to do, actually (though it took me a while to figure out how!). Simply edit ~/.ssh/config
(or create it if it doesn't exist), and create (or edit) an entry for your ssh server, making it look something like this:
Host bobsrockets.com
Port {port_name}
IdentityFile {path/to/private/keyfile}
It's the IdentityFile
line that's important. The port
line simply makes it such that you can type ssh bobsrockets.com
(or whatever your server is called) and it will figure out the port number for you.
With a public-private keypair now in use, there's just one step left: disable password-based logins. I'd recommend trailing it for a while to make sure you haven't messed anything up - because once you disable it, if you lose your private key, you won't be getting back in again any time soon!
Again, open /etc/ssh/sshd_config
for editing. Find the line that starts with PasswordAuthentication
, and comment it out with a hash symbol (#
), if it isn't already. Directly below that line, add PasswordAuthentication no
.
Once done, restart ssh
for a final time, and check it works. If it does, congratulations! You've successfully secured your SSH server (to the best of my knowledge, of course). Got a tip I haven't covered here? Found a mistake? Let me know in a comment below!