| 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. |