blob: 97da74ff79bc7e5c47e815fb549fed7323dfd8d3 [file] [log] [blame]
Damien Miller6f9c3372000-10-25 10:06:04 +11001This document contains a description of portable OpenSSH's random
2number collection code. An alternate reading of this text could
3well be titled "Why I should pressure my system vendor to supply
4/dev/random in their OS".
5
6Why is this important? OpenSSH depends on good, unpredictable numbers
7for generating keys, performing digital signatures and forming
8cryptographic challenges. If the random numbers that it uses are
9predictable, then the strength of the whole system is compromised.
10
11A particularly pernicious problem arises with DSA keys (used by the
12ssh2 protocol). Performing a DSA signature (which is required for
13authentication), entails the use of a 160 bit random number. If an
14attacker can predict this number, then they can deduce your *private*
Damien Millerdf1b6452000-10-25 14:47:35 +110015key and impersonate you or your hosts.
Damien Miller6f9c3372000-10-25 10:06:04 +110016
17If you are using the builtin random number support (configure will
Damien Millerdf1b6452000-10-25 14:47:35 +110018tell you if this is the case), then read this document in its entirety.
Damien Miller0736c4d2001-01-25 10:51:46 +110019Alternately, you can use Lutz Jaenicke's PRNGd - a small daemon which
20collects random numbers and makes them available by a socket.
Damien Miller6f9c3372000-10-25 10:06:04 +110021
22Please also request that your OS vendor provides a kernel-based random
23number collector (/dev/random) in future versions of your operating
Damien Millerdf1b6452000-10-25 14:47:35 +110024systems by default.
Damien Miller6f9c3372000-10-25 10:06:04 +110025
26On to the description...
27
28The portable OpenSSH contains random number collection support for
29systems which lack a kernel entropy pool (/dev/random).
30
Damien Miller49411ff2002-04-14 23:16:04 +100031This collector (as of 3.1 and beyond) comes as an external application
32that allows the local admin to decide on how to implement entropy
33collection.
34
35The default entropy collector operates by executing the programs listed
36in ($etcdir)/ssh_prng_cmds, reading their output and adding it to the
Damien Miller6f9c3372000-10-25 10:06:04 +110037PRNG supplied by OpenSSL (which is hash-based). It also stirs in the
38output of several system calls and timings from the execution of the
39programs that it runs.
40
41The ssh_prng_cmds file also specifies a 'rate' for each program. This
42represents the number of bits of randomness per byte of output from
43the specified program.
44
45The random number code will also read and save a seed file to
46~/.ssh/prng_seed. This contents of this file are added to the random
Damien Millera8e06ce2003-11-21 23:48:55 +110047number generator at startup. The goal here is to maintain as much
Damien Millerdf1b6452000-10-25 14:47:35 +110048randomness between sessions as possible.
Damien Miller6f9c3372000-10-25 10:06:04 +110049
Damien Miller49411ff2002-04-14 23:16:04 +100050The default entropy collection code has two main problems:
Damien Miller6f9c3372000-10-25 10:06:04 +110051
521. It is slow.
53
Damien Millera8e06ce2003-11-21 23:48:55 +110054Executing each program in the list can take a large amount of time,
55especially on slower machines. Additionally some program can take a
56disproportionate time to execute.
Damien Miller6f9c3372000-10-25 10:06:04 +110057
Darren Tuckerba2abb32004-12-06 22:40:10 +110058Tuning the random helper can be done by running ./ssh-random-helper in
59very verbose mode ("-vvv") and identifying the commands that are taking
Damien Miller9d0ccb82005-05-26 11:47:54 +100060excessive amounts of time or hanging altogher. Any problem commands can
Darren Tuckerba2abb32004-12-06 22:40:10 +110061be modified or removed from ssh_prng_cmds.
Damien Miller6f9c3372000-10-25 10:06:04 +110062
Damien Miller49411ff2002-04-14 23:16:04 +100063The default entropy collector will timeout programs which take too long
Damien Miller6f9c3372000-10-25 10:06:04 +110064to execute, the actual timeout used can be adjusted with the
65--with-entropy-timeout configure option. OpenSSH will not try to
66re-execute programs which have not been found, have had a non-zero
67exit status or have timed out more than a couple of times.
68
692. Estimating the real 'rate' of program outputs is non-trivial
70
71The shear volume of the task is problematic: there are currently
72around 50 commands in the ssh_prng_cmds list, portable OpenSSH
73supports at least 12 different OSs. That is already 600 sets of data
74to be analysed, without taking into account the numerous differences
75between versions of each OS.
76
77On top of this, the different commands can produce varying amounts of
78usable data depending on how busy the machine is, how long it has been
79up and various other factors.
80
81To make matters even more complex, some of the commands are reporting
82largely the same data as other commands (eg. the various "ps" calls).
83
Damien Millere9cf3572001-02-09 12:55:35 +110084
Damien Miller49411ff2002-04-14 23:16:04 +100085How to avoid the default entropy code?
86
87The best way is to read the OpenSSL documentation and recompile OpenSSL
88to use prngd or egd. Some platforms (like earily solaris) have 3rd
89party /dev/random devices that can be also used for this task.
90
91If you are forced to use ssh-rand-helper consider still downloading
92prngd/egd and configure OpenSSH using --with-prngd-port=xx or
93--with-prngd-socket=xx (refer to INSTALL for more information).
94
Damien Miller9d0ccb82005-05-26 11:47:54 +100095$Id: WARNING.RNG,v 1.8 2005/05/26 01:47:54 djm Exp $