UC San Diego SearchMenu

Ssh: A Secure, Encrypting Version of Rlogin/Rsh

Revised: October 2003.
There is a separate article with information on installing an SSH client on your home computer.

This article is composed of the following sections:

Basic Overview

ssh and slogin are replacements for the traditional rsh and rlogin commands that implement RSA-based authentication for network connections.

ssh by default uses a 768-bit host key and a 1024-bit user key that provides an extremely strong and secure authentication, to ensure that both ends of a connection really are who they say they are.

ssh also allows one working over a slow or lossy link to initiate gzip-style compression in order to speed the transfer of data.

As a general rule, rhosts-style authentication is insecure except on closely-controlled and isolated networks, and it is never truly secure. ssh, on the other hand, uses RSA-style authentication - the sort that netscape and the government uses. This makes IP spoofing (falsifying information about the source of a network connection) impossible because the client must answer a challenge from the server based upon its 'public key' in order to gain access to the server.

The key method is virtually unbreakable; in a project a few years ago with Iowa State University, a cryptography expert used 1500 workstations working together to factor a 428-bit key. This process took about nine months to complete. Each time one adds 4 bits to a key, the time to factor the key nearly doubles. Since ssh uses a 768-bit key, it would take 100,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000 years - such that by the time anyone decrypts a particular key, the two computers used in the transaction, UCSD, and human civilization will have crumbled to dust. }:>


Introduction: how to get started with ssh

Anyone who's used rsh or rlogin before can use ssh with no learning curve. In order to connect from one host to another, one simply replaces the 'rsh' or 'rlogin' command with 'ssh' or 'slogin':

sdcc12 % ssh somehost

It accepts the same flags to specify a different username (say, dalv):

sdcc12 % ssh somehost -l dalv

If you're using a slow link, you can turn on compression with the -C switch:

sdcc12 % ssh -C somehost -l dalv

Once ssh establishes the connection, it will ask for your password:

    sdcc12 % ssh somehost -l dalv
        dalv's password:
       

And once you type in the correct password and hit return, it will let you in. You've now established a secure, encrypted connection to the remote host (in this case, somehost.ucsd.edu) from your machine.

If this is the first time you've connected to somehost from this machine, it will display the following:

    sdcc12 % ssh somehost -l dalv
        Host 'somehost' added to the list of known hosts.
        Creating random seed file ~/.ssh/random_seed.  This may take a while.
       

The random seed file is used to calculate the encryption strings on your end of the connection. This will be displayed the first time you use ssh on a particular machine.

In this example, since this is the first time sdcc12 has connected to 'somehost', it stores the public host authentication key for 'somehost' into your personal file of known hosts. The next time you connect to 'somehost', ssh will issue a challenge to 'somehost' that it must answer correctly using its private identity file. If the host doesn't respond correctly, it means that the key information has somehow changed, and ssh will warn you of the discrepancy which might be due to a hacker setting up an imposter machine to pose as 'somehost'. This test ensures that you really are connecting to 'somehost', and not some hacker's machine between you and 'somehost'. (Assuming, of course that the first time you connected to 'somehost' you connected to the real somehost and got the real somehost's key, and that you didn't get a false key on the first connect.)

You can also use ssh just like rsh:

   sdcc12 % ssh somehost -l dalv uptime
        dalv's password:
         9:07pm  up 11 days, 21:49, 19 users,  load average: 0.38, 0.54, 0.44
       

This executes the 'uptime' command on the host 'somehost' as the user 'dalv'.

Note that some machines may not run ssh. If you try to use ssh to these machines, the program will automatically use rlogin/rsh, and will print a warning:

   sdcc12 % ssh sdcc8
        Secure connection to sdcc8 refused; reverting to insecure method.
        Using rsh.  WARNING: Connection will not be encrypted.
        Password:
       

The functionality will be the same, but the connection will not be securely authenticated or encrypted.

Rhosts with RSA authentication -- logging in without a password

With rlogin and rsh, one can set up a file called '.rhosts' in your home directory. In this file, one can put hostname/userid pairs of machines from which one can login. When one rlogins to this machine, then, one can get in without having to type a password:

   sdcc12 % rlogin sdcc10
        Last login: Tue Nov 26 10:19:37 from sdcc12.ucsd.edu
        SunOS Release 4.1.3_U1 (SDCC10 1.5) #1: Mon Oct 14 16:13:47 PDT 1996
        sdcc10 %
       

However, this is inherently insecure because this relies on domain name service information and an IP address for authentication, both of which can be spoofed, or falsified, thus opening one's account to break-ins.

(Fortunately, machines at a local site or on a local network are somewhat more secure, simply because the routers that divide that segment of the network from another keep out spoofers. In an environment like UCSD's computer room, where access is extremely controlled 24 hours a day, it is very unlikely that a breakin of this nature could occur. However, on machines accessed from across the global internet, it is very possible and even likely to occur.)

ssh fixes this by using RSA-based host authentication. Intended as a full replacement for rsh and rlogin, ssh even supports the use of an rhosts-like file called '.shosts'.

(If you only have an '.rhosts' file, ssh will use this file exactly like it would use the .shosts file - except that rlogin and rsh, which ssh intends to replace, will also use that file, thus defeating the extra level of security. Also, please read the section on pure RSA authentication, as this may be a simpler method to set up rhosts-style logins-without-a-password.)

The format of the .shosts file is exactly like that of the .rhosts file, except that a few additional requirements must be met. First, though, the format of the file itself.

A sample .shosts file:

  sdcc12           dalv
        sdcc13          dalv
        sdcc17          dalv
        dragonlair.dal.net      dalv
       

If this file resided on ieng9, it would allow someone with the username 'dalv' to login to this account from any of sdcc12, sdcc13, sdcc17, or dragonlair.dal.net.

Because this is a favorite target of hackers, however, in order for this file to be accepted, one must perform two additional tasks: * Make sure that your home directory, the .shosts file, and the .ssh directory and files are writeable only by the user. * Verify that ieng9 has a host authentication key for sdcc12, sdcc13, sdcc17, and dragonlair.dal.net.

One can do the first by executing the following commands (on the *target* host):

  ieng9 % chmod g-w,o-w ~
        ieng9 % cd
        ieng9 % chmod 700 .ssh
        ieng9 % chmod 600 .shosts .ssh/*
       

The first command ensures that only the user can write to his/her home directory. The second ensures that the user is the only one with any access to the .ssh directory, and the third does the same for the .shosts file and any files in the .ssh directory.

After this has been done, one needs to make sure that ieng9 knows the host keys for the five hosts in the .shosts file. Depending on the system configuration, this may or may not have already been done.

By viewing the system 'known hosts' file using the command 'more /etc/ssh_known_hosts', one can verify that the hosts *from* which the ssh session will come can be identified by the target machine.

An entry for sdcc13.ucsd.edu, for example, will look like this:

sdcc13.ucsd.edu 1024 35 9476867275562487563709483772740383309755296835 7531448351782289106802688182094427331369506907299501704894788975203252078 771287265680161651556819549952708689761039573604860469939681262935652569 204095233404687846356661031061808977066614042574219382833635431351337244 089391206874050663379360766169063954314988591

(That long string of numbers is the host's public identity key, used to verify the host's identity.) If you find the source hosts in this file, the job is done, and rhosts with RSA authentication will work.

As ssh becomes more widespread use at UCSD, the host keys for most workstations and servers will be distributed to the system known hosts files, and installing the host keys manually (as seen in the next few paragraphs) will become virtually unnecessary.

For any hosts that are *not* listed in this system file, you will need to install a host key for each unlisted machine in your personal ~/.ssh/known_hosts file by ssh'ing *back* to each of the five hosts from ieng9, then exiting the shell:

  ieng9 % ssh sdcc12.ucsd.edu
        dalv's password:
        Last login: Tue Nov 26 10:19:37 from sdcc17
        SunOS Release 4.1.3_U1 (SDCC12 1.5) #1: Mon Oct 14 16:13:47 PDT 1996

        sdcc12 % logout
        ieng9 % ssh iacs5.ucsd.edu
        dalv's password:
        [...]
       

ssh will put each of the unknown hosts' keys into the .ssh/known_hosts file, and will use this to authenticate the connection when the user sshs in. Note that when doing this, you need to use the entire name of each host - in other words, you must use sdcc12.ucsd.edu instead of sdcc12, iacs5.ucsd.edu instead of iacs5, etc.

And that's all! The user dalv can now ssh into ieng9 from any of sdcc12, sdcc13, sdcc17, or dragonlair.dal.net without having to type in a password.


Pure RSA authentication - using a personal RSA key

One can also set up ssh to login without a password by creating and installing a personal RSA key that can be used to authenticate both a connection and a user securely without the need for a password. This method is easier and requires less work than rhosts-with-RSA- authentication.

Using this method of authentication requires two simple steps to set up: * Generating a personal RSA key with 'ssh-keygen' * Distributing this key among the various target hosts

First, run 'ssh-keygen' on the machine FROM which the logins will be coming (this will be for the account 'abrayn' on ieng9):

  ieng9 % ssh-keygen
        Initializing random number generator...
        Generating p:  ...........................++ (distance 336)
        Generating q:  .++ (distance 10)
        Computing the keys...
        Testing the keys...
        Key generation complete.
        Enter file in which to save the key ($HOME/.ssh/identity):
       

At this prompt, simply push 'return'. The key should be saved in the default file.

  Enter passphrase:
        Enter the same passphrase again:
       

At this set of prompts, one may enter a passphrase used to activate the key. Doing so, however, makes it so that one must enter this passphrase each time one uses ssh to get to a target machine, and defeats the convenience of being able to get to other machines without a password. It does, however, increase the security - if one is paranoid, using a passphrase might be a good idea.

To use a key without a passphrase, simply hit return at the two passphrase prompts.

The program then prints:

  Your identification has been saved in
        /home/solaris/oce/abrayn/.ssh/identity.
        Your public key is:
        1024 37 730424662526414281339086750022538462553259901525707720154402047424
        7197937876197866923886632751633508582464057373146071686964039491372131686576
        047921179303084370018200284103795944556001828575921188635306649448153009255
        5604976760582142584621320360689907006570124515950157397815124036087880055391
        094643244472871 abrayn@ieng9.ucsd.edu
        Your public key has been saved in
        /home/solaris/oce/abrayn/.ssh/identity.pub
       

This completes the first step, key generation. In the next step, the key shown above (and contained in ~/.ssh/identity.pub) needs to be distributed to the file ~/.ssh/authorized_keys on the remote hosts.

This can be done by 'scp' or ftp - use this method if the source key is the only one which will be in the target host's authorized_keys file:

  ieng9 % scp ~/.ssh/identity.pub abrayn@sdcc10:~/.ssh/authorized_keys
        abrayn's password:
        ieng9 %
       

(The '~/.ssh' directory must exist on sdcc10 beforehand; it can be made with the command 'ssh sdcc10 mkdir .ssh')

It can also be done by editing the file .ssh/authorized_keys with a text editor such as vi, emacs, or pico and simply pasting the key, ensuring that the key is contained on one line and does not wrap (i.e. there must be no returns in the middle of the key). This method should be used if there will be more than one source host that will ssh into the target account. For example, on the machine delivery.dal.net, the login name 'dalv' has the following .ssh/authorized_keys:

   1024 37 139138116986620484[...]6142758206500869 dalv@dragonlair.dal.net
        1024 37 962036397358770606[...]2436464402257743 abrayn@sdcc12.ucsd.edu
       

(keys truncated for the sake of brevity)

This file enables both someone coming from the account 'dalv' on the machine dragonlair.dal.net and someone coming from the account 'abrayn' on the machine sdcc12.ucsd.edu to login to the account 'dalv' on the machine delivery.dal.net without a password.

After distributing the keys, one can then use ssh to login to the remote machines using pure RSA authentication. Based on the public key in authorized_keys, the target machine sends a challenge to the source machine that can only be answered properly if the source has access to the appropriate private key counterpart (stored in .ssh/identity).


Instructions for using ssh via the Terminal utility

Mac OS X comes with a SSH client pre-installed.

  • Go to Applications > Utilities
  • Start the Terminal application
  • Type ssh -l yourusername servername
  • When the notice regarding "The key for this host has never been seen before." appears, accept and save the key.
  • Enter your password