15 SSH: Secure Network Operations #
    In networked environments, it is often necessary to access hosts from a
    remote location. If a user sends login and password strings for
    authentication purposes as plain text, they could be intercepted and
    misused to gain access to that user account. This would open all the user's files to an attacker
    and the illegal account could be used to obtain administrator or
    root access, or to penetrate
    other systems. In the past, remote connections were established with
    telnet, rsh or
    rlogin, which offered no guards against eavesdropping
    in the form of encryption or other security mechanisms. There are other
    unprotected communication channels, like the traditional FTP protocol
    and some remote copying programs like rcp.
   
The SSH suite provides the necessary protection by encrypting the authentication strings (usually a login name and a password) and all the other data exchanged between the hosts. With SSH, the data flow could still be recorded by a third party, but the contents are encrypted and cannot be reverted to plain text unless the encryption key is known. So SSH enables secure communication over insecure networks, such as the Internet. The SSH implementation coming with SUSE Linux Enterprise Server is OpenSSH.
SUSE Linux Enterprise Server installs the OpenSSH package by default providing the
  commands ssh, scp, and
  sftp. In the default configuration, remote access of a
  SUSE Linux Enterprise Server system is only possible with the OpenSSH utilities, and
  only if the sshd is running and
  the firewall permits access.
 
SSH on SUSE Linux Enterprise Server uses cryptographic hardware acceleration if available. As a result, the transfer of large quantities of data through an SSH connection is considerably faster than without cryptographic hardware. As an additional benefit, the CPU will see a significant reduction in load.
15.1 ssh—Secure Shell #
   With ssh it is possible to log in to remote
   systems and to work interactively. To log in to the host
   sun as user tux enter one of
   the following commands:
  
ssh tux@sun ssh -l tux sun
   If the user name is the same on both machines, you can omit it. Using
   ssh sun is sufficient. The remote host
   prompts for the remote user's password. After a successful
   authentication, you can work on the remote command line or use
   interactive applications, such as YaST in text mode.
  
   Furthermore, ssh offers the possibility to run
   non-interactive commands on remote systems using ssh
HOST COMMAND.
   COMMAND needs to be properly quoted. Multiple
   commands can be concatenated as on a local shell.
  
ssh root@sun "dmesg -T | tail -n 25" ssh root@sun "cat /etc/issue && uptime"
15.1.1 Starting X Applications on a Remote Host #
    SSH also simplifies the use of remote X applications. If you run
    ssh with the -X option, the
    DISPLAY variable is automatically set on the remote
    machine and all X output is exported to the local machine over the
    existing SSH connection. At the same time, X applications started
    remotely cannot be intercepted by unauthorized individuals.
   
15.1.2 Agent Forwarding #
    By adding the -A option, the ssh-agent authentication
    mechanism is carried over to the next machine. This way, you can work
    from different machines without having to enter a password, but only if
    you have distributed your public key to the destination hosts and
    properly saved it there. Refer to
    Section 15.5.2, “Copying an SSH Key” for details.
   
    This mechanism is deactivated in the default settings, but can be
    permanently activated at any time in the systemwide configuration file
    /etc/ssh/sshd_config by setting
    AllowAgentForwarding yes.
   
15.2 scp—Secure Copy #
scp copies files to or from a remote machine.  If
   the user name on jupiter is different than the user name on
   sun, specify the latter using the
   USER_NAME@host format. If
   the file should be copied into a directory other than the remote
   user's home directory, specify it as
   sun:DIRECTORY. The following
   examples show how to copy a file from a local to a remote machine and
   vice versa.
  
# local -> remote scp ~/MyLetter.tex tux@sun:/tmp # remote -> local scp tux@sun:/tmp/MyLetter.tex ~
-l Option
    With the ssh command, the option
    -l can be used to specify a remote user (as an
    alternative to the
    USER_NAME@host
    format). With scp the option -l
    is used to limit the bandwidth consumed by scp.
   
   After the correct password is entered, scp starts the
   data transfer. It displays a progress bar and the time remaining for each
   file that is copied. Suppress all output with the -q
   option.
  
scp also provides a recursive copying feature for
   entire directories. The command
  
scp -r src/ sun:backup/
   copies the entire contents of the directory src
   including all subdirectories to the ~/backup
   directory on the host sun. If this subdirectory does not
   exist, it is created automatically.
  
   The -p option tells scp to leave the
   time stamp of files unchanged. -C compresses the data
   transfer. This minimizes the data volume to transfer, but creates a
   heavier burden on the processors of both machines.
  
15.3 sftp—Secure File Transfer #
15.3.1 Using sftp #
   If you want to copy several files from or to different locations,
   sftp is a convenient alternative to
   scp. It opens a shell with a set of commands similar
   to a regular FTP shell. Type help at the sftp-prompt
   to get a list of available commands. More details are available from the
   sftp man page.
  
sftp sun Enter passphrase for key '/home/tux/.ssh/id_rsa': Connected to sun. sftp> help Available commands: bye Quit sftp cd path Change remote directory to 'path' [...]
15.3.2 Setting Permissions for File Uploads #
    As with a regular FTP server, a user cannot only download,
        but also upload files to a remote machine running an SFTP server
        by using the put command. By default the
        files will be uploaded to the remote host with the same
        permissions as on the local host. There are two options to
        automatically alter these permissions:
   
- Setting a umask
- A umask works as a filter against the permissions of the original file on the local host. It can only withdraw permissions: Table 15.1: Setting a umask #- permissions original - umask - permissions uploaded - 0666 - 0002 - 0664 - 0600 - 0002 - 0600 - 0775 - 0025 - 0750 - To apply a umask on an SFTP server, edit the file - /etc/ssh/sshd_configuration. Search for the line beginning with- Subsystem sftpand add the- -uparameter with the desired setting, for example:- Subsystem sftp /usr/lib/ssh/sftp-server -u 0002 
- Explicitly Setting the Permissions
- Explicitly setting the permissions sets the same permissions for all files uploaded via SFTP. Specify a three-digit pattern such as - 600,- 644, or- 755with- -u. When both- -mand- -uare specified,- -uis ignored.- To apply explicit permissions for uploaded files on an SFTP server, edit the file - /etc/ssh/sshd_config. Search for the line beginning with- Subsystem sftpand add the- -mparameter with the desired setting, for example:- Subsystem sftp /usr/lib/ssh/sftp-server -m 600 
15.4 The SSH Daemon (sshd) #
   To work with the SSH client programs ssh and
   scp, a server (the SSH daemon) must be running in the
   background, listening for connections on TCP/IP port
   22. The daemon generates three key pairs when starting for the
   first time. Each key pair consists of a private and a public key.
   Therefore, this procedure is called public key-based. To
   guarantee the security of the communication via SSH, access to the
   private key files must be restricted to the system administrator. The
   file permissions are set accordingly by the default installation. The
   private keys are only required locally by the SSH daemon and must not be
   given to anyone else. The public key components (recognizable by the name
   extension .pub) are sent to the client requesting
   the connection. They are readable for all users.
  
A connection is initiated by the SSH client. The waiting SSH daemon and the requesting SSH client exchange identification data to compare the protocol and software versions, and to prevent connections through the wrong port. Because a child process of the original SSH daemon replies to the request, several SSH connections can be made simultaneously.
   For the communication between SSH server and SSH client, OpenSSH supports
   versions 1 and 2 of the SSH protocol. Version 2 of the
   SSH protocol is used by default. Override this to use version 1
   of protocol with the -1 option.
  
When using version 1 of SSH, the server sends its public host key and a server key, which is regenerated by the SSH daemon every hour. Both allow the SSH client to encrypt a freely chosen session key, which is sent to the SSH server. The SSH client also tells the server which encryption method (cipher) to use. Version 2 of the SSH protocol does not require a server key. Both sides use an algorithm according to Diffie-Hellman to exchange their keys.
   The private host and server keys are absolutely required to decrypt the
   session key and cannot be derived from the public parts. Only the
   contacted SSH daemon can decrypt the session key using its private keys.
   This initial connection phase can be watched closely by turning on
   verbose debugging using the -v option of the SSH client.
  
    To watch the log entries from the sshd use the following command:
   
tux > sudo journalctl -u sshd15.4.1 Maintaining SSH Keys #
   It is recommended to back up the private and public keys stored in
   /etc/ssh/ in a secure, external location. In this
   way, key modifications can be detected or the old ones can be used again
   after having installed a new system.
  
If you install SUSE Linux Enterprise Server on a machine with existing Linux installations, the installation routine automatically imports the SSH host key with the most recent access time from an existing installation.
   When establishing a secure connection with a remote host for the first
   time, the client stores all public host keys in
   ~/.ssh/known_hosts. This prevents any
   man-in-the-middle attacks—attempts by foreign SSH servers to use
   spoofed names and IP addresses. Such attacks are detected either by a
   host key that is not included in ~/.ssh/known_hosts,
   or by the server's inability to decrypt the session key in the absence of
   an appropriate private counterpart.
  
   If the public keys of a host have changed (that needs to be verified
   before connecting to such a server), the offending keys can be
   removed with ssh-keygen -r
   HOSTNAME.
  
15.4.2 Rotating Host Keys #
As of version 6.8, OpenSSH comes with a protocol extension that supports host key rotation. It makes sense to replace keys, if you are still using weak keys such as 1024-bit RSA keys. It is strongly recommended to replace such a key and go for 2048-bit DSA keys or something even better. The client will then use the “best” host key.
After installing new host keys on the server, restart sshd.
    This protocol extension can
    inform a client of all the new host keys on the server, if the user
    initiates a connection with ssh.  Then, the
    software on the client updates
    ~/.ssh/known_hosts, and the user is not
    required to accept new keys of previously known and trusted hosts
    manually.  The local known_hosts file will
    contain all the host keys of the remote hosts, in addition to the
    one that authenticated the host during this session.
   
    Once the administrator of the server knows that all the clients have
    fetched the new keys, they can remove the old keys. The protocol
    extension ensures that the obsolete keys will be removed from the
    client's configuration, too. The key removal occurs while initiating
    an ssh session.
   
For more information, see:
- http://blog.djm.net.au/2015/02/key-rotation-in-openssh-68.html 
- http://heise.de/-2540907 (“Endlich neue Schlüssel für SSH-Server”, German only) 
15.5 SSH Authentication Mechanisms #
   In its simplest form, authentication is done by entering the user's
   password just as if logging in locally. However, having to memorize
   passwords of several users on remote machines is inefficient. What is
   more, these passwords may change. On the other hand—when
   granting root access—an administrator needs to be able
   to quickly revoke such a permission without having to change the
   root password.
  
   To accomplish a login that does not require to enter the remote
   user's password, SSH uses another key pair, which needs to be generated
   by the user. It consists of a public (id_rsa.pub or
   id_dsa.pub) and a private key
   (id_rsa or id_dsa).
  
   To be able to log in without having to specify the remote user's
   password, the public key of the “SSH user” must be
   in ~/.ssh/authorized_keys. This approach also
   ensures that the remote user has got full control: adding the key
   requires the remote user's password and removing the key revokes the
   permission to log in from remote.
  
   For maximum security such a key should be protected by a passphrase which
   needs to be entered every time you use ssh,
   scp, or sftp. Contrary to the
   simple authentication, this passphrase is independent from the remote
   user and therefore always the same.
  
An alternative to the key-based authentication described above, SSH also offers a host-based authentication. With host-based authentication, users on a trusted host can log in to another host on which this feature is enabled using the same user name. SUSE Linux Enterprise Server is set up for using key-based authentication, covering setting up host-based authentication on SUSE Linux Enterprise Server is beyond the scope of this manual.
    If the host-based authentication is to be used, the file
    /usr/lib/ssh/ssh-keysign (32-bit systems) or
    /usr/lib64/ssh/ssh-keysign (64-bit systems) should
    have the setuid bit set, which is not the default setting in
    SUSE Linux Enterprise Server. In such case, set the file permissions manually. You
    should use /etc/permissions.local for this purpose,
    to make sure that the setuid bit is preserved after security updates of
    openssh.
   
15.5.1 Generating an SSH Key #
- To generate a key with default parameters (RSA, 2048 bits), enter the command - ssh-keygen.
- Accept the default location to store the key ( - ~/.ssh/id_rsa) by pressing Enter (strongly recommended) or enter an alternative location.
- Enter a passphrase consisting of 10 to 30 characters. The same rules as for creating safe passwords apply. It is strongly advised to refrain from specifying no passphrase. 
    You should make absolutely sure that the private key is not accessible
    by anyone other than yourself (always set its permissions to
    0600). The private key must never fall into the hands
    of another person.
   
    To change the password of an existing key pair, use the command
    ssh-keygen -p.
   
15.5.2 Copying an SSH Key #
    To copy a public SSH key to ~/.ssh/authorized_keys
    of a user on a remote machine, use the command
    ssh-copy-id. To copy your personal key
    stored under ~/.ssh/id_rsa.pub you may use the
    short form. To copy DSA keys or keys of other users, you need
    to specify the path:
   
# ~/.ssh/id_rsa.pubssh-copy-id -i tux@sun# ~/.ssh/id_dsa.pubssh-copy-id -i ~/.ssh/id_dsa.pub tux@sun# ~notme/.ssh/id_rsa.pubssh-copy-id -i ~notme/.ssh/id_rsa.pub tux@sun
    To successfully copy the key, you need to enter the remote
    user's password. To remove an existing key, manually edit
    ~/.ssh/authorized_keys.
   
15.5.3 Using the ssh-agent #
    When doing lots of secure shell operations it is cumbersome to type the
    SSH passphrase for each such operation. Therefore, the SSH package
    provides another tool, ssh-agent, which retains the
    private keys for the duration of an X or terminal session. All other
    windows or programs are started as clients to the
    ssh-agent. By starting the agent, a set of
    environment variables is set, which will be used by
    ssh, scp, or
    sftp to locate the agent for automatic login. See
    the ssh-agent man page for details.
   
    After the ssh-agent is started, you need to add your
    keys by using ssh-add. It will prompt for the
    passphrase. After the password has been provided once, you can use the
    secure shell commands within the running session without having to
    authenticate again.
   
15.5.3.1 Using ssh-agent in an X Session #
     On SUSE Linux Enterprise Server, the ssh-agent is automatically
     started by the GNOME display manager. To also invoke
     ssh-add to add your keys to the agent at the
     beginning of an X session, do the following:
    
- Log in as the desired user and check whether the file - ~/.xinitrcexists.
- If it does not exist, use an existing template or copy it from - /etc/skel:- if [ -f ~/.xinitrc.template ]; then mv ~/.xinitrc.template ~/.xinitrc; \ else cp /etc/skel/.xinitrc.template ~/.xinitrc; fi 
- If you have copied the template, search for the following lines and uncomment them. If - ~/.xinitrcalready existed, add the following lines (without comment signs).- # if test -S "$SSH_AUTH_SOCK" -a -x "$SSH_ASKPASS"; then # ssh-add < /dev/null # fi 
- When starting a new X session, you will be prompted for your SSH passphrase. 
15.5.3.2 Using ssh-agent in a Terminal Session #
     In a terminal session you need to manually start the
     ssh-agent and then call ssh-add
     afterward. There are two ways to start the agent. The first example
     given below starts a new Bash shell on top of your existing shell. The
     second example starts the agent in the existing shell and modifies the
     environment as needed.
    
ssh-agent -s /bin/bash eval $(ssh-agent)
     After the agent has been started, run ssh-add to
     provide the agent with your keys.
    
15.6 Port Forwarding #
ssh can also be used to redirect TCP/IP connections.
   This feature, also called SSH tunneling, redirects TCP
   connections to a certain port to another machine via an encrypted
   channel.
  
With the following command, any connection directed to jupiter port 25 (SMTP) is redirected to the SMTP port on sun. This is especially useful for those using SMTP servers without SMTP-AUTH or POP-before-SMTP features. From any arbitrary location connected to a network, e-mail can be transferred to the “home” mail server for delivery.
ssh -L 25:sun:25 jupiter
Similarly, all POP3 requests (port 110) on jupiter can be forwarded to the POP3 port of sun with this command:
ssh -L 110:sun:110 jupiter
   Both commands must be executed as root, because the connection
   is made to privileged local ports. E-mail is sent and retrieved by
   normal users in an existing SSH connection. The SMTP and POP3 host
   must be set to localhost for this to
   work. Additional information can be found in the manual pages for
   each of the programs described above and in the OpenSSH package
   documentation under
   /usr/share/doc/packages/openssh.
  
15.7 For More Information #
- https://www.openssh.com
- The home page of OpenSSH 
- https://en.wikibooks.org/wiki/OpenSSH
- The OpenSSH Wikibook 
- man sshd
- The man page of the OpenSSH daemon 
- man ssh_config
- The man page of the OpenSSH SSH client configuration files 
- man scp,- man sftp,- man slogin,- man ssh,- man ssh-add,- man ssh-agent,- man ssh-copy-id,- man ssh-keyconvert,- man ssh-keygen,- man ssh-keyscan
- Man pages of several binary files to securely copy files ( - scp,- sftp), to log in (- slogin,- ssh), and to manage keys.
- 
/usr/share/doc/packages/openssh/README.SUSE,/usr/share/doc/packages/openssh/README.FIPS
- SUSE package specific documentation; changes in defaults with respect to upstream, notes on FIPS mode etc.