Setting up a laptop: Difference between revisions
m (→Improved method with plausible deniability: change location of key) |
m (→Original method with fdisk with no plausible deniability: change location of key) |
||
Line 84: | Line 84: | ||
| 2 | | 2 | ||
| Create and format the luks device | | Create and format the luks device | ||
| <code><nowiki>gpg --decrypt key.gpg | cryptsetup --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sda1</nowiki></code> | | <code><nowiki>gpg --decrypt /mnt/usb/key.gpg | cryptsetup --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sda1</nowiki></code> | ||
|- | |- | ||
| 3 | | 3 | ||
| Open the luks device | | Open the luks device | ||
| <code><nowiki>gpg --decrypt key.gpg | cryptsetup luksOpen /dev/sda1 root</nowiki></code> | | <code><nowiki>gpg --decrypt /mnt/usb/key.gpg | cryptsetup luksOpen /dev/sda1 root</nowiki></code> | ||
|- | |- | ||
| 4 | | 4 |
Revision as of 11:38, 8 March 2018
This material is work-in-progress ... Do not follow instructions here until this notice is removed. |
Creating a secured laptop is a fun project. I've created this in my Gentoo days but could attempt to do it the Alpine way. For this project we take in consideration ways to extend battery life. It covers tools and daemons that are must haves for a laptop setup.
Guide features
- Deniable full disk encryption
- Two factor authentication (USB key, mind)
- Encrypted swap and hibernation
- Encrypted home on top of encrypted drive
- Memory sanitation
- Dynamic power modes
- Feature keys support
Rubberhose Attack
Just a reminder that all attacks are subjected to the Rubberhose Attack dilemma, you either give up your encryption keys or be tortured with a rubberhose with the possibly of death. See Wikipedia article.
Why full disk?
The full disk encryption provides sort of some plausible deniability or a valid alibi that you didn't encrypt it. Is the drive just random noise, broken, or is it really encrypted? But, cryptsetup does leave plaintext marking or some hints that it has been encrypted.[1] To gain credibility that we didn't really do the encryption, you have to wipe the +3 MiB region based on the number of key slots used.
It is possible to erase and restore the header. This presents an opportunity to improve obfuscation. When you pull out the USB key, it should erase the header but store it on the USB key atomically as in completely. If you plug in the USB key, it will restore back the header.
Starting at the beginning
Grab a USB thumb drive with Alpine. Set it up as usual but don't let it touch your drive yet. Then, install all the tools into memory ramdisk but not in the hard drive yet. The hard drive will be obliterated.
Randomizing the drive with pseudorandom urandom entropy
The first part is to erase the drive with random noise but in practical time. There are many techniques to do this but should be done in one day or two minimum.
You can use shred or dd to accomplish this depending on your needs and the availability of entropy. Some techniques take longer. Cryptologist Bruce Schneier recommended 7 times with specified pattern. See Wikipedia Article. For practical purposes, we just do it random in one pass. To list the drives on the system do fdisk -l
. To wipe the disk with random entropy do:
dd if=/dev/urandom of=/dev/sda
Creating GPG keys
After you have scrambled the drive, you want to create your GPG keys. You will use these keys to set the password(s) for your cryptsetup-luks partitions. These keys should be stored on a USB thumb drive which will act as the boot partition and the USB key. The key should be a random 128 bit key wrapped in GPG and protected with a password.
If you are using x, you need to do sudo apk add pinentry
to display password prompt properly for the next step.
openssl rand -base64 128 | gpg --symmetric --cipher-algo aes --armor > /mnt/usb/key.gpg
The first part will produce 128 random bytes in wrap it in base64. The random data will be piped to gpg which will wrap it in AES as ciphertext which again gets wrapped in base64 ascii armor. For every partition, you should create more gpg keys and store them in your USB thumb drives. After you have produced your gpg keys, you will then use them as a password for cryptsetup/luks.
You can replace aes above with the ones listed in gpg --version
.
Working with cryptsetup-luks volumes
Choosing ciphers
When you create your luks drives, you need to decide on the type of ciphers and hashing techniques to use. The ciphers that you want to use are ones are up to you, but it should be one that is hasn't been cracked yet or has not suffered a lot of cryptanalysis attacks. The ones that you might want to use is AES which is hardware accelerated in some Intel CPUs that have the AES-NI cpuflag which you can check by cat /proc/cpuinfo
. Also consider the ciphers that are SIMD optimized such as serpent and twofish that are available in the Linux kernel. Also consider ciphers that are unpopular but know to be secure such as blowfish. If it is hardware accelerated, it will save battery life and minimize CPU usage.
Another advantage of using a public vetted cipher is that it provides confidence that it works.
Generally speaking, the swap partition should use a fast cipher.
Installing cryptsetup
To install cryptsetup you need the package below
apk add cryptsetup
Getting the available ciphers
cryptsetup benchmark
The top set is associated with the hashing algorithms. The bottom set are the ciphers. Use the commands below but replace the cipher and/or hash algorithm with your preferences.
General steps for cryptsetup-luks
Original method with fdisk with no plausible deniability
# | Step | Command |
---|---|---|
1 | Use fdisk to create partitions. Make two partitions--a system partition and a swap partition | fdisk
|
2 | Create and format the luks device | gpg --decrypt /mnt/usb/key.gpg | cryptsetup --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sda1
|
3 | Open the luks device | gpg --decrypt /mnt/usb/key.gpg | cryptsetup luksOpen /dev/sda1 root
|
4 | Format the decrypted drive with filesystem | mkfs.ext4 /dev/mapper/root
|
5 | Create the mount point | mkdir -p /mnt/root
|
6 | Mount the root partition | mount /dev/mapper/root /mnt/root
|
7 | Create swap | cryptsetup -c blowfish -h sha256 -d /dev/urandom create swap /dev/sda2 |
8 | Use swap | mkswap /dev/mapper/swap && swapon /dev/mapper/swap |
Improved method with plausible deniability
This method requires lvm2. To install:
apk add lvm2
# | Step | Command |
---|---|---|
1 | Create and format the entire luks device | gpg --decrypt /mnt/usb/key.gpg | cryptsetup --cipher aes-cbc-essiv:sha256 --key-size 256 luksFormat /dev/sda
|
2 | Open the luks device | gpg --decrypt /mnt/usb/key.gpg | cryptsetup luksOpen /dev/sda root
|
3 | Physical volume create with LVM | pvcreate /dev/mapper/root
|
4 | Volume group create with LVM | vgcreate vgroot /dev/mapper/root
|
5 | Logical volume create the swap volume with LVM | lvcreate -L 4G vgroot -n swap
|
6 | Logical volume create the root volume with LVM | lvcreate -L 2T vgroot -n root
|
7 | Logical volume create the rescue volume with LVM | lvcreate -L 110M vgroot -n rescue
|
8 | Format the root volume with filesystem | mkfs.ext4 /dev/mapper/vgroot-root
|
9 | Format the swap volume with filesystem and activate it | mkswap /dev/mapper/swap && swapon /dev/mapper/swap
|
10 | Format the rescue volume with filesystem | mkfs.ext4 /dev/mapper/vgroot-rescue
|
11 | Create mount point for root volume | mkdir -p /mnt/root
|
12 | Mount the root volume | mount /dev/mapper/root /mnt/root
|
Partitioning scheme
# | Name | Mount point | Notes |
---|---|---|---|
1 | swap | It should be the same size as your ram for x86_64. Rationale: it should contain the whole ram image. | |
2 | root | / | |
3 | rescue | /mnt/rescue | This should contain the Alpine image. |
Configuring OpenRC dm-crypt
You need to tell OpenRC init scripts to decrypt the volumes.
Next step: Full blown Alpine installation
You will then install Alpine using the steps:
Install the bootloader in the USB thumb drive
To install grub, you need to install grub on the ramdisk first on the host.
apk add grub
To get a list of partitions
fdisk -l
Mount the boot partition in /boot
mount /dev/sdb /boot
Make changes to initramfs
nano /boot/grub/grub.cfg
Install it to your USB Thumb Drive
grub-install /dev/sdb
Hacking mkinitfs
You want to hack the mkinitfs init script and rebuild the package. The initramfs should contain a static compiled gpg to decrypt the keys on the USB.
See https://github.com/alpinelinux/mkinitfs/tree/master .
Home mounting with ecryptfs
We use ecryptfs to encrypt home. The rationale for having another encrypted file system is that if you leave your laptop unattended on break or accidentally leave your USB key in, your data will not be accessible. When you log off, your home directory will be unmounted and encrypted.
To install ecryptfs-utils:
sudo apk add ecryptfs-utils
Locking it down
Many times you will leave your laptop behind with people you trust. The following tools will help lock down the system.
physlock
This will auto logoff the tty and when you return will prompt for password.
To install physlock:
sudo apk add physlock
It is currently bugged. See [2].
xscreensaver
This will lock you out of xserver
To install xscreensaver:
sudo apk add xscreensaver
USB key udev rule
You need to add a new udev rule that will suspend-to-ram or hibernate and log off once you pull the USB key. When you come back on, you should do 2 factor authentication to restore back everything. Hibernation and suspend-to-ram will mitigate cold-boot attack to extract plaintext private data and encryption keys in memory.
To find out the details of your USB do:
udevadm monitor --udev -p
The output should look like:
UDEV [181762.722853] add /devices/pci0000:00/0000:00:13.2/usb2/2-5/2-5:1.0/host6/target6:0:0/6:0:0:0/block/sdc (block) ACTION=add DEVLINKS=/dev/disk/by-id/usb-Kingston_MSFT_NORB_MSFTLAKDA300EB3021790009-0:0 /dev/disk/by-path/pci-0000:00:13.2-usb-0:5:1.0-scsi-0:0:0:0 /dev/disk/by-uuid/5A96-03E4 DEVNAME=/dev/sdc DEVPATH=/devices/pci0000:00/0000:00:13.2/usb2/2-5/2-5:1.0/host6/target6:0:0/6:0:0:0/block/sdc DEVTYPE=disk ID_BUS=usb ID_FS_TYPE=vfat ID_FS_USAGE=filesystem ID_FS_UUID=5A96-03E4 ID_FS_UUID_ENC=5A96-03E4 ID_FS_VERSION=FAT32 ID_INSTANCE=0:0 ID_MODEL=MSFT_NORB ID_MODEL_ENC=MSFT\x20NORB\x20\x20\x20\x20\x20\x20\x20 ID_MODEL_ID=1645 ID_PATH=pci-0000:00:13.2-usb-0:5:1.0-scsi-0:0:0:0 ID_PATH_TAG=pci-0000_00_13_2-usb-0_5_1_0-scsi-0_0_0_0 ID_REVISION=PMAP ID_SERIAL=Kingston_MSFT_NORB_MSFTLAKDA300EB3021790009-0:0 ID_SERIAL_SHORT=MSFTLAKDA300EB3021790009 ID_TYPE=disk ID_USB_DRIVER=usb-storage ID_USB_INTERFACES=:080650: ID_USB_INTERFACE_NUM=00 ID_VENDOR=Kingston ID_VENDOR_ENC=Kingston ID_VENDOR_ID=0951 MAJOR=8 MINOR=32 SEQNUM=2027 SUBSYSTEM=block USEC_INITIALIZED=1762722168
You want to extract the ID_SERIAL_SHORT=MSFTLAKDA300EB3021790009
or whatever is associated with your USB thumb drive.
You need pm-utils for ps-suspend. So to install it do:
sudo apk add pm-utils
You will create a udev rules so that when you pull out the USB, it will suspend-to-ram or you can use your own script. To do that create a file with the following contents:
Contents of /etc/udev/rules.d/50-usb-thumb-drive.rules
Extending battery life
ACPI
ACPI is a good daemon to use to execute certain scripts laptop events.
To install ACPI do:
apk add acpi
The events to pay attention to are:
Event | ACPI Event | What your script should do |
---|---|---|
lid close | log off ttys and suspend to ram | |
lid open | lock all ttys and all xservers should be lock | |
tapped power button | lock all ttys and suspend | |
held power button | hibernate | |
unplugged power | should switch to 'conservative' cpufreq governor at above 25% power ; 'powersave' governor at 25% | |
plugged power | should switch to 'performance' governor |
acpi_listen
can be used to retrieve the event name.
TODO: put scripts below
laptop-mode-tools
This is currently not in aports but worthy mentioning. It should really be packaged. This is an OpenRC set of scripts to define a power policies.
cpufreqd
This is a useful daemon to regulating power.
To install cpufreqd do:
sudo apk add cpufreqd
Make sure you add the service
sudo rc-update add cpufreqd
Hacking the kernel
You should refer to the Custom Kernel page for details.
Hibernation
See Hibernation to prevent data loss.
Additional tools
actkbd
To control the sound with fn function keys, you need this daemon. It is currently not in aports.
secure-delete
Want to prevent cold-boot attack or decrypted keys in memory falling in the wrong hands? This maybe could work who knows?
To install secure-delete do:
sudo apk add secure-delete
smem only works for unused ram.[3] If you use the vanilla kernel, this may work. If you use grsecurity, it will automatically sanitize memory when the memory page is freed.[4]
Close all important programs then call smem.
You call smem in your shutdown script or auto-logoff script.
Notes
If you lose or break your USB key, that is it and you cannot decrypt your drive. It would be wise to make a backup of it.
I don't know if suspend-to-ram or hibernate sufficiently clear the AES encryption keys off ram in those phases which would invite a cold boot attack. This has been covered by the TRESOR patch.[5] This patch hasn't been updated since the 4.x series.[6]