| Title: A Stateless Workstation | |
| Author: Solène | |
| Date: 20 April 2024 | |
| Tags: security linux openbsd unix | |
| Description: In this article, I explain the rational and experiment | |
| about my project of a stateless workstation | |
| # Introduction | |
| I always had an interest for practical security on computers, being | |
| workstations or servers. Many kinds of threats exist for users and | |
| system administrators, it's up to them to define a threat model to know | |
| what is acceptable or not. Nowadays, we have choice in the operating | |
| system land to pick what works best for that threat model: OpenBSD with | |
| its continuous security mechanisms, Linux with hardened flags (too bad | |
| grsec isn't free anymore), Qubes OS to keep everything separated, | |
| immutable operating system like Silverblue or MicroOS (in my opinion | |
| they don't bring much to the security table though) etc... | |
| My threat model always had been the following: some exploit on my | |
| workstation remaining unnoticed almost forever, stealing data and | |
| capturing keyboard continuously. This one would be particularly bad | |
| because I have access to many servers through SSH, like OpenBSD | |
| servers. Protecting against that is particularly complicated, the best | |
| mitigations I found so far is to use Qubes OS with disposable VMs or | |
| restricting outbound network, but it's not practical. | |
| My biggest grip with computers always have been "states". What is a | |
| state? It is something that distinguish a computer from another: | |
| installed software, configuration, data at rest (pictures, documents | |
| etc…). We use states because we don't want to lose work, and we want | |
| our computers to hold our preferences. | |
| But what if I could go stateless? The best defense against data | |
| stealer is to own nothing, so let's go stateless! | |
| # Going stateless | |
| My idea is to be able to use any computer around, and be able to use it | |
| for productive work, but it should always start fresh: stateless. | |
| A stateless productive workstation obviously has challenges: How would | |
| it help with regard to security? How would I manage passwords? How | |
| would I work on a file over time? How to achieve this? | |
| I have been able to address each of these questions. I am now using a | |
| stateless system. | |
| > States? Where we are going, we don't need states! (certainly Doc | |
| Brown in a different timeline) | |
| ## Data storage | |
| It is obvious that we need to keep files for most tasks. This setup | |
| requires a way to store files on a remote server. | |
| Here are different methods to store files: | |
| * Nextcloud | |
| * Seafile | |
| * NFS / CIFS over VPN | |
| * iSCSI over VPN | |
| * sshfs / webdav mount | |
| * Whatever works for you | |
| Encryption could be done locally with tools like cryfs or gocryptfs, so | |
| only encrypted files would be stored on the remote server. | |
| Nextcloud end-to-end encryption should not be used as of April 2024, it | |
| is known to be unreliable. | |
| Seafile, a less known alternative to Nextcloud but focused only on file | |
| storage, supports end-to-end encryption and is reliable. I chose this | |
| one as I had a good experience with it 10 years ago. | |
| Having access to the data storage in a stateless environment comes with | |
| an issue: getting the credentials to access the files. Passwords | |
| should be handled differently. | |
| ## Password management | |
| When going stateless, the first step that will be required after a boot | |
| will be to access the password manager, otherwise one would be locked | |
| outside. | |
| The passwords must be reachable from anywhere on Internet, with a | |
| passphrase you know and/or hardware token you have (and why not 2FA). | |
| A self-hosted solution is vaultwarden (it used to be named | |
| bitwarden_rs), it's an open source reimplementation of Bitwarden | |
| server. | |
| Any proprietary service offering password management could work too. | |
| A keepassxc database on a remote storage service for which you know the | |
| password could also be used, but it is less practical. | |
| ## Security | |
| The main driving force for this project is to increase my workstation | |
| security, I had to think hard about this part. | |
| Going stateless requires a few changes compared to a regular | |
| workstation: | |
| * data should be stored on a remote server | |
| * passwords should be stored on a remote server | |
| * a bootable live operating system | |
| * programs to install | |
| This is mostly a paradigm change with pros and cons compared to a | |
| regular workstation. | |
| Data and passwords stored in the cloud? This is not really an issue | |
| when using end-to-end encryption, this is true as long as the software | |
| is trustable and its code is correct. | |
| A bootable live operating system is quite simply to acquire. There is | |
| a ton of choice of Linux distributions able to boot from a CD or from | |
| USB, and also non Linux live system exist. A bootable USB device could | |
| be compromised while a CD is an immutable media, but there are USB | |
| devices such as the Kanguru FlashBlu30 with a physical switch to make | |
| the device read-only. A USB device could be removed immediately after | |
| the boot, making it safe. As for physically protecting the USB device | |
| in case you would not trust it anymore, just buy a new USB memory stick | |
| and resilver it. | |
| Product page: Kanguru FlashBlu30 | |
| As for installed programs, it is fine as long as they are packaged and | |
| signed by the distribution, the risks are the same as for a regular | |
| workstation. | |
| The system should be more secure than a typical workstation because: | |
| * the system never have access to all data at once, user is supposed to | |
| only pick what they will need for a given task | |
| * any malware that would succeed to reach the system would not persist | |
| to the next boot | |
| The system would be less secure than a typical workstation because: | |
| * remote servers could be exploited (or offline, not a security issue | |
| but…), this is why end-to-end encryption is a must | |
| To circumvent this, I only have the password manager service reachable | |
| from the Internet, which then allows me to create a VPN to reach all my | |
| other services. | |
| ## Ecology | |
| I think it is a dimension that deserves to be analyzed for such setup. | |
| A stateless system requires remote servers to run, and use bandwidth to | |
| reinstall programs at each boot. It is less ecological than a regular | |
| workstation, but at the same time it may also enforce some kind of | |
| rationalization of computer usage because it is a bit less practical. | |
| ## State of the art | |
| Here is a list of setup that already exist which could provide a | |
| stateless experience, with support for either a custom configuration or | |
| a mechanism to store files (like SSH or GPG keys, but an USB smart card | |
| would be better for those): | |
| * NixOS with impermanence, this is an installed OS, but almost | |
| everything on disk is volatile | |
| * NixOS live-cd generated from a custom config | |
| * Tails, comes with a mechanism to locally store encrypted files, | |
| privacy-oriented, not really what I need | |
| * Alpine with LBU, comes with a mechanism to locally store encrypted | |
| files and cache applications | |
| * FuguITA, comes with a mechanism to locally store encrypted files | |
| (OpenBSD based) | |
| * Guix live-cd generated from a custom config | |
| * Arch Linux generated live-cd | |
| * Ubuntu live-cd, comes with a mechanism to retrieve files from a | |
| partition named "casper-rw" | |
| Otherwise, any live system could just work. | |
| Special bonus to NixOS and Guix generated live-cd as you can choose | |
| which software will be in there, in latest version. Similar bonus with | |
| Alpine and LBU, packages are always installed from a local cache which | |
| mean you can update them. | |
| A live-cd generated a few months ago is certainly not really up to | |
| date. | |
| # My experience | |
| I decided to go with Alpine with its LBU mechanism, it is not 100% | |
| stateless but hit the perfect spot between "I have to bootstrap | |
| everything from scratch" and "I can reduce the burden to a minimum". | |
| Earlier blog post: Alpine Linux from RAM but persistent | |
| My setup requires two USB memory stick: | |
| * one with Alpine installer, upgrading to a newer Alpine version only | |
| requires me to write the new version on that stick | |
| * a second to store the packages cache and some settings such as the | |
| package list and specific changes in /etc (user name, password, | |
| services) | |
| While it is not 100% stateless, the files on the second memory stick | |
| are just a way to have a working customized Alpine. | |
| This is a pretty cool setup, it boots really fast as all the packages | |
| are already in cache on the second memory stick (packages are signed, | |
| so it is safe). I made a Firefox profile with settings and extensions, | |
| so it is always fresh and ready when I boot. | |
| I decided to go with the following stack, entirely self-hosted: | |
| * Vaultwarden for passwords | |
| * Seafile for data (behind VPN) | |
| * Nextcloud for calendar and contacts (behind VPN) | |
| * Kanboard for task management (behind VPN) | |
| * Linkding for bookmarks (behind VPN) | |
| * WireGuard for VPN | |
| This setup offered me freedom. Now, I can bootstrap into my files and | |
| passwords from any computer (a trustable USB memory stick is advisable | |
| though!). | |
| I can also boot using any kind of operating system on any on my | |
| computer, it became so easy it's refreshing. | |
| I do not make use of dotfiles or stored configurations because I use | |
| vanilla settings for most programs, a git repository could be used to | |
| fetch all settings quickly though. | |
| Vaultwarden official project website | |
| Seafile official project website | |
| Nextcloud official project website | |
| Kanboard official project website | |
| Linkding official project website | |
| # Backups | |
| A tricky part with this setup is to proceed with serious backups. The | |
| method will depend on the setup you chose. | |
| With my self-hosted stack, restic makes a daily backup to two remote | |
| locations, but I should be able to reach the backup if my services are | |
| not available due to a server failure. | |
| If you use proprietary services, it is likely they should handle | |
| backups, but it is better not to trust them blindly and checkout all | |
| your data on a regular schedule to make a proper backup. | |
| # Conclusion | |
| This is an interesting approach to workstations management, I needed to | |
| try. I really like how it freed me from worrying about each | |
| workstation, they are now all disposable. | |
| I made a mind map for this project, you can view it below, it may be | |
| useful to better understand how things articulate. | |
| Stateless computing mind mapping document |