Add Boot RAID hint
[linux_from_scratch_hints.git] / entropy.txt
blobeb8523bba4b333312cf75ee09495bd73a5ca9239
1 AUTHOR:         Robert Connolly <robert at linuxfromscratch dot org> (ashes)
3 DATE:           2007-05-16
5 LICENSE:        Public Domain
7 SYNOPSIS:       Entropy and random number generators in Linux
9 PRIMARY URL:    http://www.linuxfromscratch.org/hints/
11 DESCRIPTION:
12 The word "entropy" generally means "chaos", "disorder", or "uncertainty". In
13 this hint "entropy" is used to describe random computer data.
15 Many system components depend on entropy (random numbers) for various tasks.
16 One of the simplest examples would be the fortune(6) program, which gives a
17 random quote from a list when we log in. Another simple example is a solitaire
18 card game, or the shuffle option in a music player. Without random numbers
19 these programs would generate the same results every time they run. The above
20 examples are low security applications. It is not critical for them to use
21 high quality random numbers, and in applications like these the current system
22 time and date is usually an adequate source of entropy.
24 Examples of medium security uses for entropy would be applications like
25 mktemp(1), password salt, or the Stack Smashing Protector (SSP) GCC feature.
26 These applications need unpredictable entropy to function securely, but the
27 life span of these applications is generally short, so they do not need to use
28 the highest quality entropy available. Using the system time is unsafe for
29 these applications because it is predictable.
31 Cryptographic keys tend to have a very long life, often several years. Even
32 after the key is eventually replaced, everything it was used to encrypt remains
33 only as safe as the entropy used to generate the key. For cryptography we want
34 to use the best entropy possible, and conserve this high quality entropy
35 specifically for cryptography.
37 Generating true entropy in a computer is fairly difficult because nothing,
38 outside of quantum physics, is random. The Linux kernel uses keyboard, mouse,
39 network, and disc activities, with a cryptographic algorithm (SHA1), to
40 generate data for the /dev/random device. One of the problems with this is that
41 the input is not constant, so the kernel entropy pool can easily become empty.
42 The /dev/random device is called a "blocking device". This means if the entropy
43 pool is empty applications trying to use /dev/random will have to wait,
44 indefinitely, until something refills the pool. This is both a feature and a
45 nuisance, and can cause a denial of service depending on the application.
46 Another problem with using the keyboard, mouse, network, and disc activity is
47 that on idle, unmanned, and disc-less systems there is very little, or no, input
48 of this kind. It is also theoretically possible for an observer (keyboard or
49 network sniffer) to predict the entropy pool without having root level access.
50 The only real solution to these vulnerabilities is in using a hardware-based
51 random number generator. These hardware devices usually use electrical static
52 as a source of entropy, because there is currently no technology that can
53 reliably predict this. The best hardware random number generators use
54 radioactive decay as an entropy source.
56 The /dev/urandom device is referred to as a pseudo-random device (like-random),
57 although /dev/random is also pseudo-random but to a lesser extent. /dev/urandom
58 uses small amounts of data from /dev/random to seed a secondary entropy pool.
59 This has the effect of inflating the real entropy so it can be conserved. Using
60 /dev/urandom can cause /dev/random's pool to become empty, but if this happens
61 /dev/urandom will not block, and it will continue using the last available
62 seed. This makes /dev/urandom theoretically vulnerable to outputting repeating
63 data, depending on the limitations of the algorithm used, but this is extremely
64 rare and to my knowledge has never actually happened. /dev/urandom is widely
65 considered safe for all cryptographic purposes, except by the most paranoid
66 people.
68 This hint contains links to web sites and patches to help you get more entropy,
69 and use it more conservatively.
71 PREREQUISITES:
72 Glibc-2.5, for the arc4random patch.
73 The entropy daemons have no prerequisites.
75 HINT:
77         Contents:
78                 Gkernel hwrandom daemon
79                 Audio/Video entropy daemon
80                 LavaRnd entropy daemon
81                 Frandom and Erandom kernel drivers
82                 Fortuna kernel driver
83                 Arc4random library
84                 Entropy pool size
85                 OpenSSL modifications
86                 Testing
88 - Gkernel hwrandom daemon:
89 http://linuxcertified.com/hw_random.html
90 Some systems have hardware devices for random numbers. The kernel supports
91 many of them. For more information check the above web site. Also see:
92 http://sourceforge.net/projects/gkernel/
94 The installation is strait forward for Glibc:
96 ./configure --prefix=/usr &&
97 make &&
98 make install
100 --- End Glibc installation ---
102 The installation is a little messy for uClibc:
103 uClibc does not have argp, because argp is not defined by any standard and
104 does not belong in a C library (it's Glibc specific). So get the stand-alone
105 argp library:
106 http://www.lysator.liu.se/~nisse/misc/argp-standalone-1.3.tar.gz
108 For uClibc first unpack argp-standalone, we don't need to install this:
110 cd argp-standalone-1.3 &&
111 ./configure --prefix=/usr && make
113 Then unpack rng-tools:
115 cd rng-tools-2 &&
116 env LIBS=-largp \
117         CFLAGS="-O2 -L../argp-standalone-1.3 -I../argp-standalone-1.3" \
118         ./configure --prefix=/usr && make && make install
120 --- End uClibc installation ---
122 rng-tools expects to find /dev/hw_random. This device was renamed to
123 /dev/hwrandom in Linux-2.6, so you may need to start 'rngd' like this:
125 rngd -r /dev/hw_random
127 This should be started on boot just like audio-entropyd, below.
129 This package comes with a test program named 'rngtest'.
131 - Audio/Video entropy daemon:
132 http://www.vanheusden.com/aed/
133 http://www.vanheusden.com/ved/
134 These two daemons use either the static noise from the sound card, or the video
135 frames from a video4linux device. These devices have a never ending supply of
136 entropy created by thermal fluctuation and electric fields on the devices.
137 These entropy gathering daemons depend on the kernel driver for your hardware,
138 to work properly, be it your sound or video card. These programs will refill
139 the kernel entropy pool as needed. The programs can be used together in
140 combination, including with Gkernel, to maintain a kernel entropy pool which
141 uses several different sources.
143 http://www.vanheusden.com/aed/audio-entropyd-0.0.6.tgz
145 make &&
146 install -g 0 -o 0 -m 755 audio-entropyd /usr/sbin/audio-entropyd
148 Edit your /etc/rc.d/init.d/random and start audio-entropyd just after seeding
149 urandom, and stop it just after saving random-seed. Or use the boot script
150 template and make a dedicated boot script. The PID file will be in /var/run.
151 You don't need to reboot to use it, but you do need your sound card driver
152 loaded, and be root. Add something like this:
154 if [ -f /usr/sbin/audio-entropyd ] && [ -c /dev/dsp ]; then
155         echo "Starting audio entropy daemon..."
156         loadproc /usr/sbin/audio-entropyd
159 and...
161 echo "Stopping audio entropy daemon..."
162 killproc /usr/sbin/audio-entropyd
164 http://www.vanheusden.com/ved/video_entropyd-0.7.tgz
166 make &&
167 install -g 0 -o 0 -m 755 video_entropyd /usr/sbin/video_entropyd
169 Add this to root's crontab every minute or so. It can not run as a daemon
170 because it will lock the video device. Depends on video4linux. Using one or
171 both of these daemons should be adequate for sustained moderate-to-heavy use.
173 Nothing else needs to be done, applications can continue to use /dev/random
174 and /dev/urandom normally. You should notice crypt keys get made faster.
176 Note: I have not personally used video_entropyd.
178 - LavaRnd entropy daemon:
179 http://www.lavarnd.org/
180 This uses hardware as a source of entropy much like Video Entropy Daemon.
181 I have not personally used this daemon.
183 - Frandom and Erandom kernel drivers:
184 http://frandom.sourceforge.net/
185 Frandom stands for "fast random". Erandom stands for "economical random".
186 They both use the arcfour algorithm
188 The /dev/frandom device is similar to /dev/urandom except that it only takes
189 one single seed from /dev/random, each time it is opened. As a result it is
190 able to output random data much faster than /dev/urandom because there is
191 no stirring of frandom's pool. This is ideal for wiping discs, or any time you
192 need gigabytes of random data.
194 The /dev/erandom device uses the constantly changing state of frandom's pool,
195 in a read-only mode, for entropy. /dev/erandom consumes no entropy from
196 /dev/random, and is ideal for applications that want to open the device
197 thousands of times, such as Stack Smashing Protector. /dev/erandom is also
198 well suited for any medium security application, and should be used for any
199 non-cryptographic application instead of /dev/urandom. /dev/erandom will
200 eventually output repeating data, but can be reinitialized by using
201 /dev/frandom (dumping one block from /dev/frandom to /dev/null). This is
202 done automatically after each reboot, and should be done once per week.
204 http://www.linuxfromscratch.org/patches/downloads/linux/
205         linux-2.6.21.1-frandom-1.patch
207         CONFIG_FRANDOM is in "Character Devices" and "UserMode" menus.
209 Add Udev permissions with the following command:
210 echo 'NAME=="erandom", MODE="0444"
211 NAME=="frandom", MODE="0444"' >>/etc/udev/rules.d/25-lfs.rules
213 Add this to your crontab, so /dev/erandom will be reinitialized weekly:
214 0 0 * * 1 /bin/dd if=/dev/frandom of=/dev/null count=1 >/dev/null 2>&1
216 Note: The sysctl interfaces are considered obsolete in the latest Linux-2.6
217 kernels, and may not be supported much longer. As a result the SYSCTL_ERANDOM
218 interface is no longer recommended, but it's there if you want it.
220 - Fortuna kernel driver:
221 http://jlcooke.ca/random
222 http://en.wikipedia.org/wiki/Fortuna_(PRNG)
223 The Fortuna driver is a complete replacement for the Linux random number
224 driver. While the vanilla kernel uses the SHA1 algorithm, the Fortuna driver
225 uses AES and SHA-256, and is capable of producing far more volume of random
226 data from the same entropy, due to using superior algorithms. The Fortuna
227 driver is also able to use any other algorithms supplied by the Linux crypto
228 API. The Fortuna driver includes several other improvements to the vanilla
229 driver.
231 At the time of this writing the patch on the Fortuna home page does not build
232 with linux-2.6.21.1, because of changes to the crypto api.
234         CONFIG_CRYPTO_RANDOM_FORTUNA - This depends on CONFIG_CRYPTO, SHA256,
235                                         and AES, in the crypto menu.
237 - Arc4random library:
238 The arc4random interfaces were designed by OpenBSD to solve the problem of
239 emptying the kernel entropy pool with non-cryptographic applications. In
240 Linux this is solved with /dev/erandom. The arc4random library function is
241 a companion function. It is designed to never fail.
243 For example, a program can be coded to try to use /dev/urandom for entropy,
244 and use the gettimeofday library function if /dev/urandom fails (like in a
245 chroot). The problem with this is that when the gettimeofday function is
246 being used it is fairly obvious that the output has a sequence, and it tells
247 an attacker that the system time is being used for entropy in this program.
248 The arc4random library function also uses /dev/urandom (or /dev/erandom),
249 and the gettimeofday library function if /dev/urandom fails, except that the
250 entropy is digested by the arcfour algorithm. The result is that even with a
251 one microsecond difference from gettimeofday, arc4random's output will be
252 completely different, and it is impossible for an attacker to know whether
253 the entropy came from /dev/urandom or the system time. Furthermore, even if
254 /dev/urandom (or /dev/erandom), and gettimeofday fail, arc4random will use the
255 uninitialized variables in a large character array (garbage data in memory).
257 Many packages will use the arc4random library function if it is found, such as
258 OpenSSL, OpenSSH, OpenNTPD, and Bind9.
260 The arc4random library function discards the first 256 bytes of the stream to
261 deal with the early key stream weakness, which is described in the paper below.
263 This function is included with uClibc. There is a patch below for Glibc.
265 Read more about Arcfour here:
266 Paper describing Arcfour -
267 http://www.mozilla.org/projects/security/pki/nss/\
268         draft-kaukonen-cipher-arcfour-03.txt
269 Paper describing the RC4 (and arcfour) weakness -
270 http://www.wisdom.weizmann.ac.il/~itsik/RC4/Papers/Rc4_ksa.ps
272 This patch adds the arc4random library function, and uses arc4random() in
273 tempname so it is used by the mktemp() family of functions, instead of
274 gettimeofday(), and to res_init, res_mkquery, and bindrsvprt to improve the
275 resolver and port number randomization, instead of using getpid().
277 http://www.linuxfromscratch.org/patches/downloads/glibc/
278         glibc-2.5-arc4_prng-1.patch
280 This patch also adds the --with-prng-device option. If you're using
281 /dev/erandom then use '--with-prng-device=/dev/erandom' when configuring Glibc.
283 Install the arc4random.3 manual page with this command:
284 install -m644 ../glibc-2.5/manual/arc4random.3 /usr/share/man/man3
286 OpenSSL will not detect arc4random. If you want to use arc4random with OpenSSL
287 instead of /dev/urandom then use the following command in OpenSSL's source:
289 sed -e 's/__OpenBSD__/__linux__/' -i crypto/rand/rand_unix.c
291 This is used with RAND_add, for RAND_bytes and RAND_pseudo_bytes, to re-seed the
292 random number generator for each thread.
294 - Entropy pool size:
295 You can increase the size of your kernel entropy pool. This will help you
296 retain entropy when it's available for when you need it. You can see the
297 current size with:
298 cat /proc/sys/kernel/random/poolsize
300 sysctl kernel.random.poolsize
302 This was recently increased from 512 bytes to 4096 bytes. This /proc file, and
303 sysctl, is read-only, and can not be changed without hard coding it in the
304 kernel.
306 If you want to increase this then I suggest you use the Grsecurity kernel patch
307 at: http://www.grsecurity.net/
309 And enable the "Larger entropy pools" option to double the size:
310         CONFIG_GRKERNSEC_RANDNET
312 - OpenSSL modifications:
313 OpenSSL command line tools will try to use the $RANDFILE, $HOME/.rnd, or
314 $(pwd)/.rnd file to initially seed its random number generator. If none are
315 found then the "PRNG not seeded" error message may occur. We can build OpenSSL
316 with a contingency plan, to use /dev/urandom, instead of causing an error.
318 Do this with the following command in the OpenSSL source:
320 sed -e 's/__OpenBSD__/__linux__/' \
321         -e 's/arandom/urandom/' -i crypto/rand/randfile.c
323 - Testing entropy quantity
324 You should try to test this on an idle machine. Nothing compiling in
325 background, no updatedb running, etc. Moving/clicking the mouse, keyboard, and
326 even network traffic will create entropy in the pool, and affect results.
328 Fetch this:
329 http://www.linuxfromscratch.org/~robert/hlfs/hints/attachments/entropy/
330         entropy_avail.sh
332 Open two windows with non-root login. This is easiest to do in X, else split
333 a console window in two. In one window do this:
335 sh ./entropy_avail.sh
337 In the next window do something like this:
339 dd if=/dev/{u,f,e}random of=/dev/null bs=1 count=1024
341 If one or both of the entropyd programs are running you should see the pool
342 being refilled. Kill the entropyd program(s) and you should see it does not
343 refill so quickly. Move the mouse and play with it if you like. If you use a
344 small count like count=512 the entropyd program(s) may not refill immediately
345 because the pool is still large enough. This is to improve performance.
347 You might want to delete entropy_avail.log when you're done.
349 - Testing entropy quality
350 The 'ent' program runs various tests on data you supply to check for patterns.
351 For a better description see:
352 http://www.fourmilab.ch/random/
354 Download the 'ent' program from here:
355 http://www.fourmilab.ch/random/random.zip
357 This package will unpack to your current directory, so it is best to make a
358 new empty directory and unpack random.zip in there. This package only needs a
359 'make' command to compile.
361 To test your random generators do something like this:
363 dd if=/dev/erandom of=erandom.txt count=100
364 ./ent erandom.txt
368 dd if=/dev/erandom count=512|./ent -b
370 These tests can take a very long time.
372 From the people who made Audio/Video entropy daemon there is another randomness
373 test program:
374 http://www.vanheusden.com/Linux/RNGTEST.tgz
376 To compile RNGTEST:
378 gcc -o RNGTEST RNGTEST.c
380 To use RNGTEST:
382 dd if=/dev/frandom count=2048 | RNGTEST
383 and:
384 cat /bin/true | RNGTEST
386 You'll notice /bin/true fails the RNGTEST multiple times.
388 ACKNOWLEDGMENTS:
389 * Thanks to Eli Billauer for the Frandom suite.
390         http://frandom.sourceforge.net/
391         http://www.billauer.co.il/
392 * Thanks to OpenBSD for the arc4random library.
393         http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/crypt/arc4random.c
394 * Thanks to hlfs-dev at linuxfromscratch.org
396 CHANGELOG:
397 [2004-03-29]
398 * Initial post
399 [2004-03-30]
400 * Added test.
401 [2004-04-18]
402 * Added frandom/erandom.
403 [2004-04-25]
404 * Added hardware random url and notes.
405 * Switched the entropy_avail program to a more simple shell script.
406 [2004-05-07]
407 * Added patch for kernel 2.6 and for mktemp.
408 * Added LavaRnd.
409 [2004-10-01]
410 * Added libc-headers patch.
411 [2004-10-28]
412 * New patch tarball url added.
413 * Added second url for linux-libc-headers patch.
414 [2004-11-03]
415 * Added Libarc4random.
416 * Changed Mktemp patch from frandom to libarc4random.
417 [2004-11-28]
418 * Added patch for linux-2.6.7 and older kernels because the 2.6.9 patch
419   does not compile on older kernel versions.
420 [2005-02-05]
421 * Added bootscript example for aed.
422 [2005-02-12]
423 * Added pseudo_random kernel patch and integrated arc4random with libc.
424 * Added help for increasing entropy pool size.
425 [2005-02-15]
426 * Added patch for OpenSSL.
427 [2005-04-04]
428 * Update the kernel random poolsize modification method. This must be hard coded
429   now.
430 [2005-04-09]
431 * Add argp standalone library so rng-tools will build on uClibc.
432 [2007-05-16]
433 * Updated the description.
434 * Added Fortuna kernel driver.
435 * Added some OpenSSL additions.
436 * Updated arc4random Glibc patch.
437 * Updated Frandom kernel patch.
438 * Added table of contents.
439 * Added entropy quality tests.
440 * Fixed the Udev config thanks to Bryan Kadzban.