| Title: Linux $HOME encryption with ecryptfs | |
| Author: Solène | |
| Date: 12 March 2023 | |
| Tags: linux encryption privacy | |
| Description: In this article, you will learn how to encrypt a user home | |
| directory, or a single directory using ecryptfs | |
| # Introduction | |
| In this article, I'd like to share with you about the Linux specific | |
| feature ecryptfs, which allows users to have encrypted directories. | |
| While disk encryption done with cryptsetup/LUKS is very performant and | |
| secure, there are some edge cases in which you may want to use | |
| ecryptfs, whether the disk is LUKS encrypted or not. | |
| I've been able to identify a few use cases making ecryptfs relevant: | |
| * a multi-user system, people want their files to be private (and full | |
| disk encryption wouldn't help here) | |
| * an encrypted disk on which you want to have an encrypted directory | |
| that is only available when needed (preventing a hacked live computer | |
| to leak important files) | |
| * a non-encrypted disk on which you want to have an encrypted | |
| directory/$HOME instead of reinstalling with full disk encryption | |
| ecryptfs official website | |
| # Full $HOME Encryption | |
| In this configuration, you want all the files in the $HOME directory of | |
| your user to be encrypted. This works well and especially as it | |
| integrates with PAM (the "login manager" in Linux) so it unlocks the | |
| files upon login. | |
| I tried the following setup on Gentoo Linux, the setup is quite | |
| standard for any Linux distribution packaging ecryptfs-utils. | |
| ## Setup | |
| As I don't want to duplicate documentation effort, let me share two | |
| links explaining how to set up the home encryption for a user. | |
| Gentoo Wiki: Encrypt a home directory with ECryptfs | |
| ArchWiki: eCryptfs | |
| Both guides are good, they will explain thoroughly how to set up | |
| ecryptfs for a user. | |
| However, here is a TLDR version: | |
| 1. install ecryptfs-utils and make sure ecryptfs module is loaded at | |
| boot | |
| 2. modify `/etc/pam.d/system-auth` to add ecryptfs unlocking at login | |
| (3 lines are needed, at specific places) | |
| 3. run `ecryptfs-migrate-home -u $YOUR_USER` as root to convert the | |
| user home directory into an encrypted version | |
| 4. delete the old unencrypted home which should be named after | |
| `/home/YOUR_USER.xxxxx` where xxxxx are random characters (make sure | |
| you have backups) | |
| After those steps, you should be able to log in with your user, `mount` | |
| outputs should show a dedicated entry for the home directory. | |
| # Private directory encryption | |
| In this configuration, you will have ecryptfs encrypting a single | |
| directory named `Private` in the home directory. | |
| That can be useful if you already have an encrypted disk, but you have | |
| very secret files that must be encrypted when you don't need them, this | |
| will protect file leak on a compromised running system, except if you | |
| unlock the directory while the system is compromised. | |
| This can also be used on a thrashable system (like my netbook) that | |
| isn't encrypted, but I may want to save a few files there that are | |
| private. | |
| ## Setup | |
| That part is really easy: | |
| 1. install a package named `ecryptfs-utils` (may depend on your | |
| distribution) | |
| 2. run `ecryptfs-setup-private --noautomount` | |
| 3. Type your login password | |
| 4. Press enter to use an auto generated mount passphrase (you don't use | |
| this one to unlock the directory) | |
| 5. Done! | |
| The mount passphrase is used in addition to the login passphrase to | |
| encrypt the files, you may need it if you have to unlock backuped | |
| encrypted files, so better save it in your password manager if you make | |
| backup of the encrypted files. | |
| You can unlock the access to the directory `~/Private` by typing | |
| `ecryptfs-mount-private` and type your login password. | |
| Congratulations, now you have a local safe for your files! | |
| # Performance | |
| Ecryptfs was available in older Ubuntu installer releases as an option | |
| to encrypt a user home directory without the full disk, it seems it has | |
| been abandoned due to performance reasons. | |
| I didn't make extensive benchmarks here, but I compared the writing | |
| speed of random characters into a file on an unencrypted ext4 | |
| partition, and the ecryptfs private directory on the same disk. On the | |
| unencrypted directory, it was writing at 535 MB/s while on the ecryptfs | |
| it was only writing at 358 MB/s, that's almost 33% slower. However, | |
| it's still fast enough for a daily workstation. I didn't measure the | |
| time to read or browse many files, but it must be slower. A LUKS | |
| encrypted disk should only have a performance penalty of a few percent, | |
| so ecryptfs is really not efficient in comparison, but it's still fast | |
| enough if you don't do database operation on it. | |
| # Security shortcoming | |
| There are extra security shortcomings coming with ecryptfs: when using | |
| your encrypted files unlocked, they may be copied in swap or in | |
| temporary directories, or in cache. | |
| If you use the Private encrypted directories, for instance, you should | |
| think that most image reader will create a thumbnail in your HOME | |
| directory, so pictures in Private may have a local copy that is | |
| available outside the encrypted directory. Some text editors may cache | |
| a backup file in another directory. | |
| If your system is running a bit out of memory, data may be written to | |
| the swap file, if it's not encrypted then one may be able to recover | |
| files that were opened during that time. There is a command | |
| `ecryptfs-setup-swap` from the ecryptfs package which check if the swap | |
| files are encrypted, and if not, propose to encrypt them using LUKS. | |
| One major source of leakage is the `/tmp/` directory, that may be used | |
| by programs to make a temporary copy of an opened file. It may be safe | |
| to just use a `tmpfs` filesystem for it. | |
| Finally, if you only have a Private directory encrypted, don't forget | |
| that if you use a file browser to delete a file, it may end up in a | |
| trash directory on the unencrypted filesystem. | |
| # Troubleshooting | |
| ## setreuid: Operation not permitted | |
| If you get the error `setreuid: Operation not permitted` when running | |
| ecryptfs commands, this mean the ecryptfs binaries aren't using suid | |
| bit. On Gentoo, you have to compile `ecryptfs-utils` with the USE | |
| suid. | |
| # Conclusion | |
| Ecryptfs is can be useful in some real life scenarios, and doesn't have | |
| much alternative. It's especially user-friendly when used to encrypt | |
| the whole home because users don't even have to know about it. | |
| Of course, for a private encrypted directory, the most tech-savvy can | |
| just create a big raw file and format it in LUKS, and mount it on need, | |
| but this mean you will have to manage the disk file as a separate | |
| partition with its own size, and scripts to mount/umount the volume, | |
| while ecryptfs offers an easy secure alternative with a performance | |
| drawback. |