Securing GPG keys with a Yubikey security device

I’ve been using my Yubikey for years with Ubuntu SSO, as a 2-factor authentication device.

Recently, I started playing with some of its other capabilities. In particular, I became interested in the OpenPGP capabilities. I spent a couple hours working through this excellent guide on the subject.

The end result: I have a GPG key stored on my hardware key, in the device’s “secure element”. I can sign and decrypt messages/files when the key is inserted into my Ubuntu or Mac systems, and the private key is not stored on the system at all.

A brief summary of the process:

  • Buy a Yubikey. If you want to carry it with you, don’t get the Nano–they’re easy to lose.
  • Install scdaemon to your system. You will also need pinentry
  • Generate the key. You can do on the Yubikey but I recommend doing it on an offline computer or live CD.
  • BACK UP the private key offline. This is important, as the next step is destructive.
  • Move the private key/subkeys to the Yubikey, one at a time. They will be removed from your keyring.
  • Edit gpg-agent.conf and add “pinentry” as described.
  • Edit gpg.conf and add “use-agent” as described.
  • Optional: upload your public key to keyserver.ubuntu.com

To use the key on another system, you will need scdaemon and pinentry, along with the configuration files. I find that I need to import my public key for the system to recognize the private key on my Yubikey. Also, don’t lose your offline backup of your private key. Some functions (like adduid) apparently require you to re-import your private key to your keyring–and the private key cannot be exported from the Yubikey.

Finally, you can use your GPG key in your Yubikey as an SSH private key. See the steps in the guide on Github. If you have any questions, hit me up in #Ubuntu-US-AZ on Freenode.

References:

systemd suspend/resume script

Had a question the other day; a friend’s laptop would lose the trackpad after resume so his solution was to insert the module manually. Well, systemd has systemd-suspend.service which can handle those events. Details in man systemd-suspend.service

Place a script in /lib/systemd/system-sleep/ and make it executable. Any scripts in that directory will be called upon suspend (passing the parameter pre) and will be called again upon resume (passing the parameter post.) A sample script:

#!/bin/sh
if [ "${1}" = "pre" ]; then
# about to suspend …
echo "suspend event at $(date)…" > /tmp/suspend_test
elif [ "${1}" = "post" ]; then
# about to resume …
echo "resume event at $(date) …" >> /tmp/suspend_test
fi

Now, my keyboard backlight settings get saved and restored correctly on suspend/resume.

END

gigabit switch test

I setup a gigabit switch and wanted to check the transfer rate between 2 linux systems.

1) Using iperf
==============
install iperf on both server and client, sudo apt install iperf

on server: iperf -s
on client: iperf -c server_host
————————————————————
Client connecting to server_host, TCP port 5001
TCP window size: 85.0 KByte (default)
————————————————————
[ 3] local 10.0.0.44 port 36798 connected with 10.0.0.30 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 1.09 GBytes 939 Mbits/sec

2) Using nc
===========
nothing to install, nc is already installed.

on server: nc -vvlnp 12345 >/dev/null
on client: dd if=/dev/zero bs=1M count=1K | nc -vv server_host 12345

Connection to server_host 12345 port [tcp/*] succeeded!
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 9.16265 s, 117 MB/s

iperf reports 939 Mbits/sec, about same as 117 MB/s (divide 939 / 8 bits/byte)

END