SSH - Secure VPS With Certificate
Published: Ssh Estimated reading time: ~3 minutes
Secure VPS with Certificate SSH
Generate a new key on the machine that is to access the VPS
ssh-keygen -a 1000 -b 4096 -C "" -o -t rsa
or
ssh-keygen -a 1000 -C "" -o -t ed25519
-a specifies # of KDF rounds
-b specifies the bit size for RSA keys
-C removes the common comment at the end of the key
-o specifies that we should use the new format provided by OpenSSH
-t specifies the key type (RSA)
Copy key to the VPS
Copy the public key to the VPS
ssh-copy-id username@remote_host
Check that it worked
Look at the contents of ~/.ssh/id_rsa.pub
cat ~/.ssh/id_ed25519.pub
and make sure it is the same as the public key on the VPS
cat ~/.ssh/known_hosts
Modify the VPS configuration
Edit both these files
/etc/ssh/ssh_config
/etc/ssh/sshd_config
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
Should be
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
PasswordAuthentication no
ChallengeResponseAuthentication no
Restart ssh on the VPS
service ssh restart
Test that SSH is actually using the certs and no passwords
This happens on the machine you are using to connect TO the VPS
- move the contents of
~/.ssh
to a backup location - Be careful!!! If you screw this up you won’t be able to get into the server.
- Once the contents of
~/.ssh
are carefully moved, try to ssh in - Receive the following message
- Permission denied (publickey).
- If you can stil log in with a password, then something is wrong.
TODO
Change Default port for SSH from 22
- Update firewall
Disable root logon
- Create a new non-root user
- Add user to ???
- Can’t remember how I did this
- PermitRootLogin no
Copy of my sshd_config 20171204
# Package generated configuration file
# See the sshd_config(5) manpage for details
# What ports, IPs and protocols we listen for
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
#HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes
# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 1024
# Logging
SyslogFacility AUTH
LogLevel INFO
# Authentication:
LoginGraceTime 120
PermitRootLogin no
StrictModes yes
RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile %h/.ssh/authorized_keys
# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes
# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no
# Change to yes to enable challenge-response passwords (beware issues with
# some PAM modules and threads)
ChallengeResponseAuthentication no
# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no
# Kerberos options
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
# GSSAPI options
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes
#UseLogin no
#MaxStartups 10:30:60
#Banner /etc/issue.net
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
# 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 yes
# 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
# Added by DigitalOcean build process
ClientAliveInterval 120
ClientAliveCountMax 2
REFERENCES
https://www.digitalocean.com/community/questions/best-practices-for-hardening-new-sever-in-2017