If you attended
my talk about Entropy at the OpenStack Summit in San Diego earlier this month, or you
read my post and slides here on my blog, you noticed that I had a few suggestions as to how we might improve entropy in Linux cloud instances and virtual machines.
There's one very easy approach that you can handle entirely on your end, when launching an instance, if you use Ubuntu's
cloud-init utility, which consumes the
user-data field from the
metadata service.
You simply need to use
ec2-run-instances or
euca-run-instances with the
--user-data-file option.
Cloud-init supports a directive called
write_files. Here, you can specify a path, ownerships, permissions, encoding, and content of a given file, which
cloud-init will write a boot time. Leveraging, this, you can simply "create" (actually, just append to) the psuedo random device that the Linux kernel provides at
/dev/urandom, with is owned by
root:root and permissioned
rw-rw-rw-. The stanza should look like this:
write_files:
- encoding: b64
content: $SEED
owner: root:root
path: /dev/urandom
perms: '0666'
Now, you'll need to generate this using a script on your end, and populate the
$SEED variable. To do that, simply use this on your host system where you launch your cloud instance:
SEED="$(head -c 512 /dev/urandom | base64 -w 0)"
This command will read 512 bytes from your locale system's
/dev/urandom and
base64 encode it without wrapping lines. You could, alternatively, read from your local system's
/dev/random if you have enough time and entropy.
Using the recipe above, you can
ensure that your instance has at least some bit (actually, 4096 bits) of randomness that was collected
outside of your cloud provider's environment.
I'm representing
Gazzang this week at the
Ubuntu Developer Summit this week in Copenhagen, Denmark pushing for better security, entropy, and key management inside of Ubuntu's cloud images.
Cheers,
:-Dustin