Title: OpenBSD extreme privacy setup | |
Author: Solène | |
Date: 08 June 2024 | |
Tags: privacy security openbsd tor i2p | |
Description: In this article, you will learn how to install and | |
configure OpenBSD to reduce its network activity over clearnet | |
# Introduction | |
This blog post explains how to configure an OpenBSD workstation with | |
extreme privacy in mind. | |
This is an attempt to turn OpenBSD into a Whonix or Tails alternative, | |
although if you really need that level of privacy, use a system from | |
this list and not the present guide. It is easy to spot OpenBSD using | |
network fingerprinting, this can not be defeated, you can not hide the | |
fact you use OpenBSD to network operators. | |
I did this guide as a challenge for fun, but I also know some users | |
have a use for this level of privacy. | |
Note: this guide explains steps related to increase privacy of OpenBSD | |
and its base system, it will not explain how to configure a web browser | |
or how to choose a VPN. | |
# Checklist | |
OpenBSD does not have much network activity with a default | |
installation, but the following programs generate traffic: | |
* the installer connects to 199.185.178.80 to associate chosen timezone | |
with your public IP to reuse the answer for a future installation | |
* ntpd (for time sync) uses pool.ntp.org, 9.9.9.9, 2620:fe::fe, | |
www.google.com and time.cloudflare.com | |
* fw_update connects to firmware.openbsd.org (resolves as | |
openbsd.map.fastlydns.net), fw_update is used at the end of the | |
installer, and at the end of each sysupgrade | |
* sysupgrade, syspatch and pkg_* tools use the address defined in | |
/etc/installurl (defaults to cdn.openbsd.org) | |
# Setup | |
## OpenBSD installation | |
If you do not have OpenBSD installed yet, you will have to download an | |
installer. Choose from the official mirrors or my tor/i2p proxy | |
mirror. | |
OpenBSD official website: Downloading OpenBSD | |
OpenBSD privacy-friendly mirrors | |
Choose the full installer, for 7.5 it would be install75.img for USB | |
installer or install75.iso for using a CD-ROM. | |
It is important to choose the full installer to avoid any network at | |
install time. | |
Full disk encryption is recommended, but it's your choice. If you | |
choose encryption, it is recommended to wipe the drive with random data | |
before. | |
OpenBSD FAQ: Crypto and disks | |
During the installation, do not configure the network at all. You want | |
to avoid syspatch and fw_update to run at the end of the installer, and | |
also ntpd to ping many servers upon boot. | |
## First boot (post installation) | |
Once OpenBSD booted after the installation, you need to take a decision | |
for ntpd (time synchronization daemon). | |
* you can disable ntpd entirely with `rcctl disable ntpd`, but it is | |
not really recommended as it can create issues with some network | |
software if the time is desynchronized | |
* you can edit the file `/etc/ntpd.conf` which contains the list of | |
servers used to keep the time synchronized, and choose which server to | |
connect to (if any) | |
* you can configure ntpd to use a sensor providing time (like a GPS | |
receiver) and disable everything else | |
Whonix (maybe Tails too?) uses a custom tailored program named swdate | |
to update the system clock over Tor (because Tor only supports TCP | |
while NTP uses UDP), it is unfortunately not easily portable on | |
OpenBSD. | |
Next step is to edit the file `/etc/hosts` to disable the firmware | |
server whose hostname is hard-coded in the program `fw_update`, add | |
this line to the file: | |
``` | |
127.0.0.9 firmware.openbsd.org | |
``` | |
## Packages, firmware and mirrors | |
The firmware installation and OpenBSD mirror configuration using Tor | |
and I2P are covered in my previous article, it explains how to use tor | |
or i2p to download firmware, packages and system sets to upgrade. | |
OpenBSD privacy-friendly mirrors | |
There is a chicken / egg issue with this though, on a fresh install you | |
have neither tor nor i2p, so you can not download tor or i2p packages | |
through it. You could download the packages and their dependencies | |
from another system and install them locally using USB. | |
Wi-Fi and some other devices requiring a firmware may not work until | |
you run fw_update, you may have to download the files from another | |
system and pass the network interface firmware over a USB memory stick | |
to get network. A smartphone with USB tethering is also a practical | |
approach for downloading firmware, but you will have to download it | |
over clearnet. | |
## DNS | |
DNS is a huge topic for privacy-oriented users, I can not really | |
recommend a given public DNS servers because they all have pros and | |
cons, I will use 1.1.1.1 and 9.9.9.9 for the example, but use your | |
favorite DNS. | |
Enable the daemon unwind, it is a local DNS resolver with some cache, | |
and supports DoT, DoH and many cool features. Edit the file | |
`/etc/unwind.conf` with this configuration: | |
``` | |
forwarder { 1.1.1.1 9.9.9.9 } | |
``` | |
As I said, DoT and DoH is supported, you can configure it directly in | |
the forwarder block, the man page explains the syntax: | |
OpenBSD manual pages: unwind.conf | |
Now, enable, start and make sure the service is running fine: | |
``` | |
rcctl enable unwind | |
rcctl start unwind | |
rcctl check unwind | |
``` | |
A program named `resolvd` is running by default, when it finds that | |
unwind is running, resolvd modifies `/etc/resolv.conf` to switch DNS | |
resolution to 127.0.0.1, so you do not have anything to do. | |
## Firewall configuration | |
A sane firewall configuration for workstations is to block all incoming | |
connections. This can be achieved with the following `/etc/pf.conf`: | |
(reminder, last rule matches) | |
``` | |
set block-policy drop | |
set skip on lo | |
match in all scrub (no-df random-id max-mss 1440) | |
antispoof quick for egress | |
# block all traffic (in/out) | |
block | |
# allow reaching the outside (IPv4 + IPv6) | |
pass out quick inet | |
pass out quick inet6 | |
# allow ICMP (ping) for MTU discovery | |
pass in proto icmp | |
# uncomment if you use SLAAC or ICMP6 (IPv6) | |
#pass in on egress inet6 proto icmp6 | |
#pass in on egress inet6 proto udp from fe80::/10 port dhcpv6-server to fe80::/… | |
``` | |
Reload the rules with `pfctl -f /etc/pf.conf`. | |
## Network configuration | |
Everything is ready so you can finally enable networking. You can find | |
a list of network interfaces with `ifconfig`. | |
Create the hostname.if file for your network device. | |
OpenBSD manual pages: hostname.if | |
An ethernet device configuration using DHCP would look like this | |
``` | |
inet autoconf | |
``` | |
A wireless device configuration would look like this: | |
``` | |
join SSID_NAME wpakey password1 | |
join OTHER_NET wpakey hunter2 | |
inet autoconf | |
``` | |
You can randomize your network device MAC address at each boot by | |
adding the line `lladdr random` to its configuration file. | |
Start the network with `sh /etc/netstart ifname`. | |
# Special attention during updates | |
When you upgrade your OpenBSD system from a release to another or to a | |
newer snapshot using `sysupgrade`, the command `fw_update` will | |
automatically be run at the very end of the installer. | |
It will bypass any `/etc/hosts` changes as it runs from a mini root | |
filesystem, if you do not want `fw_update` to be used over clearnet at | |
this step, the only method is to disable network at this step, which | |
can be done by using `sysupgrade -n` to prepare the upgrade without | |
rebooting, and then: | |
* disconnect your computer Ethernet cable if any, if you use Wi-Fi and | |
you have a physical killswitch this will be enough to disable Wi-Fi | |
* if you do not have such a killswitch and Wi-Fi is configured, rename | |
its configuration file in `/etc/hostname.if` to another invalid name, | |
you will have to rename it back after `sysupgrade`. | |
You could use this script to automate the process: | |
```shell | |
mv /etc/hostname.* /root/ | |
sysupgrade -n | |
echo 'mv /root/hostname.* /etc/' > /etc/rc.firsttime | |
echo 'sh /etc/netstart' >> /etc/rc.firsttime | |
chmod +x /etc/rc.firsttime | |
reboot | |
``` | |
It will move all your network configuration in `/root/`, run | |
sysupgrade, and configure the next boot to restore the hostname files | |
back to place and start the network. | |
# Webcam and Microphone protection | |
By default, OpenBSD "filters" webcam and microphone use, if you try to | |
use them, you get a video stream with a black background and no audio | |
on the microphone. This is handled directly by the kernel and only root | |
can change this behavior. | |
To toggle microphone recording, change the sysctl `kern.audio.record` | |
to 1 or 0 (default). | |
To toggle webcam recording, change the sysctl `kern.video.record` to 1 | |
or 0 (default). | |
What is cool with this mechanism is it makes software happy when they | |
make webcam/microphone a requirement, they exist but just record | |
nothing. | |
# Conclusion | |
Congratulations, you achieved a high privacy level with your OpenBSD | |
installation! If you have money and enough trust in some commercial | |
services, you could use a VPN instead (or as a base) of Tor/I2P, but it | |
is not in the scope of this guide. | |
I did this guide after installing OpenBSD on a laptop connected to | |
another laptop doing NAT and running Wireshark to see exactly what was | |
leaking over the network. It was a fun experience. |