My name is Jeaye

I'm a leader, a problem solver, and a hacker with a passion for privacy and security.

Installing Arch Linux with a fully-encrypted disk

On a typical GNU/Linux install, you won’t have disk encryption. Though you’re a keen user and you’ve chosen a very strong passphrase, your data is still stored openly. Should anyone steal, confiscate, buy, or otherwise obtain your hard drive, every bit of data is going to be readable. Should anyone boot into a live CD on your system and mount your drives, your data is readily available and your strong passphrase is none the wiser.

Varying degrees of encryption

It’s becoming more popular to encrypt certain files, perhaps using GPG, and even home directories. This still suffers, compared to full system encryption, since the entire root of the file system is still open. Directories like /etc, where the majority of your system configurations exist (often including sensitive information), /var, where sensitive data may be logged by running processes, and even /tmp, where processes may store sensitive temporary data, are vulnerable.

Encrypt first, then install; use your system with more confidence.

Start here

Let this be a guide for your next bare-bones Arch setup. I assume you’re the root from here on out.

Download

Head over to the Arch download site and get the latest ISO, preferably via BitTorrent. Burn it to your external media in your preferred manner; I have a 16GB USB drive at /dev/sdb, in this example, and I’ll make my live disk with one command.

$ dd if=archlinux-2016.07.01-dual.iso of=/dev/sdb bs=1M

Boot into your new live CD, choose your architecture, and you’ll be dropped at a root prompt. Now you’ll create your system.

Partition

I’m assuming you’re installing to /dev/sda; the resulting partition table is shown below.

/dev/sda1   /boot   200MB
/dev/sda2   /       Rest

Spin up cfdisk and create a matching layout.

$ cfdisk /dev/sda

Encrypt

Now, before you install anything, you’re going to setup encryption for /dev/sda2. Choose a strong passphrase, at least 32 characters long. I recommend using a complete sentence with spaces, punctuation, and mixed case. As the disk is encrypted, it’ll first be scrubbed with random data. You can interrupt this, but you should not! Here’s why.

Typical data can be discovered by patterns that are inherent to its format. Video, audio, source code, etc, each looks different as a pattern of bits. Encrypted data typically looks like random garbage. As a result, if you only encrypt the data of this new system, there may be old data on the drive which will not look random; it’ll still be decipherable as video, audio, etc. If you randomize the whole drive first, then it’s substantially more difficult to tell where the encrypted data stops, since it all looks like random garbage.

$ cryptsetup --verbose --key-size 512 --hash sha512 --iter-time 5000 \
             --use-random luksFormat /dev/sda2

Given an encrypted partition, which /dev/sda2 now is, you can decrypt it into a labeled volume. In this example, you’ll decrypt the fresh /dev/sda2 into /dev/mapper/cryptroot.

$ cryptsetup open --type luks /dev/sda2 cryptroot

Once it’s there, you’re free to mount it, format it, or do just about anything you would with a normal disk partition.

Format

Both of the partitions will just use Ext4, in this example. You’re welcome to use any file system you’d like.

$ mkfs.ext4 /dev/sda1
$ mkfs.ext4 /dev/mapper/cryptroot

Once you have your file systems formatted, they should be mounted in a local directory. You’ll change root into here soon.

$ mkdir -p mnt
$ mount -t ext4 /dev/mapper/cryptroot mnt
$ mkdir -p mnt/boot
$ mount -t ext4 /dev/sda1 mnt/boot

Install the base system

The Arch live system comes with a couple of commands to help bootstrap your new system. The first you’ll use is pacstrap, which takes the directory in which to install and an arbitrary number of packages. This requires network access and I recommend installing some basic tools which will help as you build up your system. Aside from the required base and base-devel, I opt for vim and tmux.

$ pacstrap -i mnt base base-devel vim tmux

Your current mount points will work as a starting point for the new system, so you can serialize them as an fstab now.

$ genfstab -U -p mnt >> mnt/etc/fstab

Enter the system

At this point, a working user-space is within mnt and you an change root into it. Arch provides arch-chroot for this purpose; it’s a helper script around chroot which also sets up certain API file systems and makes /etc/resolv.conf available.

$ arch-chroot mnt

Setup locale

Now that you’re in your new system’s environment, some essential information will need to be specified. For starters, a modern setup should default to UTF-8.

$ sed -i 's/^#\(en_US.UTF-8 UTF-8\)//g' /etc/locale.gen
$ locale-gen

$ echo LANG=en_US.UTF-8 > /etc/locale.conf
$ export LANG=en_US.UTF-8

Setup time

Link in the appropriate time zone for you. I also recommend keeping the hardware clock on UTC.

$ ln -s /usr/share/zoneinfo/America/Los_Angeles /etc/localtime

$ hwclock --systohc --utc

Setup hostname

Your hostname can be whatever you want; it’s network-visible though, so keep it sane.

$ echo tofu-ninja > /etc/hostname

Setup users

Root needs a password and you’ll need a normal user. Using root for anything but short-term administrative tasks is a dangerous habit.

$ passwd # enter root password

$ useradd -m -g users -G wheel -s /bin/bash penny
$ passwd penny # enter user's password

$ visudo # uncomment wheel

Install GRUB

You have other options for your bootloader, but GRUB is the most powerful around. I like that, in a pinch, the GRUB shell can be used to boot just about anything. The installation is straightforward, but you need to make sure that GRUB knows about our encrypted drive.

$ pacman -S grub-bios

$ sed -i 's#^\(GRUB_CMDLINE_LINUX="\)#cryptdevice=/dev/sda2:cryptroot#' \
         /etc/default/grub

$ grub-install --recheck /dev/sda
$ grub-mkconfig --output /boot/grub/grub.cfg

Rebuild initramfs

The kernel needs to know about your encrypted setup, so you must instruct mkinitcpio to do some extra work.

$ sed -i 's/^\(HOOKS=".*\)\(filesystems.*\)/ encrypt /' \
         /etc/mkinitcpio.conf
$ mkinitcpio -p linux

Reboot

At this point, your minimal setup is complete and your entire system, save for /boot, is encrypted. You can exit the install environment and reboot into GRUB and your new install.

$ exit
$ umount -R mnt/boot
$ umount -R mnt
$ cryptsetup close cryptroot
$ reboot

If you get locked out

If locked out of your system, for whatever reason, you’ll need to manually decrypt your drives. You can do this by just manually opening and closing through cryptsetup, like you did for the install.

$ cryptsetup open --type luks /dev/sda2 cryptroot
$ mkdir -p mnt
$ mount -t ext4 /dev/mapper/cryptroot mnt
$ mkdir -p mnt/boot
$ mount -t ext4 /dev/sda1 mnt/boot

# Do your work ...

$ umount -R mnt/boot
$ umount -R mnt
$ cryptsetup close cryptroot

What now?

A starting point for filling out your new system would be the Arch General Recommendations.