====== Setting up the Raspberry Pi as an entropy server ====== The Raspberry Pi has a hardware random number generator. Quick testing shows it can provide sufficient entropy to read from ''/dev/random'' at around ''35kB/s''. * Build the the ''bcm2708-rng'' kernel driver (required on at least ''raspbmc''): sudo su - apt-get install build-essential bc gcc make cd /tmp wget http://www.mirrorservice.org/sites/raspbmc.com/downloads/bin/kernel/linux-headers-latest.deb.gz mkdir x dpkg-deb -x linux-headers-latest.deb.gz x mv -v x/usr/src/linux-headers-$(uname -r)/Module.symvers /usr/src cd /usr/src gKernel=$(uname -r | sed 's/[0-9]*$/y/') wget --no-check-certificate https://github.com/raspberrypi/linux/archive/rpi-$gKernel.tar.gz tar xzf rpi-*.tar.gz mv linux-rpi-*y rpi-linux cd rpi-linux/ make mrproper zcat /proc/config.gz > .config sed -i 's/CONFIG_CROSS_COMPILE.*/CONFIG_CROSS_COMPILE=""/' .config apt-get install ncurses-dev make menuconfig # Enable HW_RANDOM and HW_RANDOM_BCM2708 cp /usr/src/Module.symvers . make modules SUBDIRS=drivers/char/hw_random/ modprobe hwrng_register insmod drivers/char/hw_random/rng-core.ko insmod drivers/char/hw_random/bcm2708-rng.ko mkdir -p /lib/modules/3.12.31/kernel/drivers/char/hw_random/ cp drivers/char/hw_random/bcm2708-rng.ko /lib/modules/3.12.31/kernel/drivers/char/hw_random/ * Install and start ''rngd'' to populate the local's system entropy pool from the hardware rng: sudo apt-get install rng-tools sudo bash -c 'echo "bcm2708-rng" >> /etc/modules' initctl start rngd * Install ''NetRNG'' on both clients and the server: sudo apt-get install git python-virtualenv python-dev git clone https://github.com/infincia/NetRNG.git sudo mv NetRNG /opt cd /opt/NetRNG/ git fetch --tags origin git checkout -b v0.1 v0.1 virtualenv /opt/NetRNG/env source /opt/NetRNG/env/bin/activate pip install -r /opt/NetRNG/requirements.txt sudo cp netrng.conf.upstart /etc/init/netrng.conf sudo cp netrng.conf.sample /etc/netrng.conf * Start the ''NetRNG'' server on the Raspberry Pi: sudo initctl start netrng ====== Setting up an entropy client ====== * Install and run the ''NetRNG'' client on each network machine: sudo vim /etc/netrng.conf # Set mode = client, and the server IP address sudo initctl start netrng * Verify it's working: # Whenever the pool drops to 128 it should very quickly be refilled watch -n 0.1 cat /proc/sys/kernel/random/entropy_avail # For extra fun, try this both with and without netrng running: cat /dev/random | pv -bart > /dev/null # For me this measures 13KB/s with netrng running # but only small numbers of B/s rapidly dropping towards zero with netrng stopped ====== Systemd unit file ====== For systems that use systemd instead of upstart, use the following service definition: [Unit] Description=NetRNG Entropy Client After=syslog.target [Service] Type=simple ExecStart=/opt/NetRNG/env/bin/python /opt/NetRNG/netrng.py User=root [Install] WantedBy=multi-user.target ====== Future Improvements? ====== * Currently the random data is provided over the network in cleartext which is not ideal. Stunnel or some kind of VPN would fix that, alternatively patching the netrng source code to use an encrypted socket connection. * A puppet module to manage the installation and configuration of client/server parts