Changing the SSH configuration
The responsible configuration file for the SSH service is /etc/ssh/sshd_config
. There are a lot of configuration lines there, but most of them are commented out after a fresh Linux installation. This is symbolized by the hash (#
) at the beginning of a line. A comprehensive documentation about sshd_config
is available on the openbsd.org.
We open the file with sudo
:
__$ sudo nano /etc/ssh/sshd_config
We are only interested in the following lines at this point:
Excerpt from /etc/ssh/sshd_config
...
#PubkeyAuthentication yes
...
#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
...
We comment #PubkeyAuthentication yes
by removing the comment symbol (#
). We change the value for AuthorizedKeysFile
to %h/.ssh/authorized_keys
. The variable %h
represents the user's home
directory. When tom
logs in, his user directory is searched for a public key to verify the submitted private key. In this case, in the /home/tom/.ssh/authorized_keys
file. In the last chapter, we already stored a public key for tom
here.
The entire /etc/ssh/sshd_config
file should eventually look like this:
/etc/ssh/sshd_config
# $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 22
#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 prohibit-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
PubkeyAuthentication yes
# Expect .ssh/authorized_keys2 to be disregarded by default in future.
AuthorizedKeysFile %h/.ssh/authorized_keys
#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 yes
#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 0
#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
Let's save the file (CTRL+s
, CTRL+x
) and restart the SSH service to make the changes effective:
__$ sudo systemctl restart sshd
This means that logging on to the server is possible in two ways: on the one hand, as before, with a user password and, on the other hand, with the private key. We will disable the first variant, i.e. the pure password-based login, in the next chapter. Before we do that, we should first test whether the new login method works. Otherwise, we run the risk of locking ourselves out irrevocably. So we keep the possibility open to still be able to correct configuration errors.
Let's log out first to be able to complete the test:
__$ logout
Depending on the operating system or client, the login with key varies. Below is the description for Windows, Mac and Linux.