Security
Upstream’s security page lists five things Omarchy does for you. Here is how each of them lands on NixOS.
| Upstream | nixarchy |
|---|---|
| Full-disk encryption, mandatory | The nixarchy installer encrypts by default — LUKS2 on btrfs, and you opt out with Ctrl+C rather than in. Installing the flake onto NixOS you already run cannot add it afterwards; that is a decision made when the disk was partitioned. |
| ufw, closed except 53317 | networking.firewall, closed except 53317. Same policy, different tool. |
| Arch rolling updates | nix flake update moves nixpkgs; security fixes arrive with the next omarchy update. |
| Omarchy’s own package mirror | Everything comes from nixpkgs and this flake. There is no Omarchy repo and no AUR. |
| Cloudflare in front of the ISOs | The ISO is built from source with nix build .#iso, not downloaded — there is nothing in front of it because there is nothing hosted. Packages come from the nixarchy binary cache and cache.nixos.org, both signed. |
The firewall
There is no ufw on NixOS. nixarchy sets
networking.firewall.enable = lib.mkDefault true;
networking.firewall.allowedTCPPorts = [ 53317 ];
networking.firewall.allowedUDPPorts = [ 53317 ];
which is a port of upstream’s install/config/firewall.sh (ufw default deny
incoming, then ufw allow 53317 on both protocols for
LocalSend). Discovery over mDNS was never the
missing part; services.avahi already opens 5353. Only the transfer port was.
The enable is mkDefault, so a configuration that turns the firewall off
wins. The port lists are not, deliberately: list options merge, so a port you
open is added to LocalSend’s rather than replacing it.
To open a port, add it in your flake and rebuild:
networking.firewall.allowedTCPPorts = [ 8080 ];
sudo ufw allow 8080 does not exist here, and a port opened by hand with
iptables or nft is gone on the next rebuild, which is the point.
Nixarchy defaults to virtualisation.docker.enable = false and
virtualisation.docker.rootless.enable = true: Docker runs as a rootless user
daemon. Upstream’s ufw-docker lockdown is not ported because it is a ufw
script. Check the bind address and network reachability of each published
container service. See
Docker, rootless for the default and how
to opt into the root-owned daemon.
SSH
Setup > Security > SSHD in the menu is upstream’s script, and it cannot
finish here: its first step is omarchy-pkg-add openssh, which exits 1 by
design (see the philosophy), and the script runs under
set -e. Declare it instead:
services.openssh.enable = true;
users.users.you.openssh.authorizedKeys.keys = [ "ssh-ed25519 AAAA... you@host" ];
services.openssh.openFirewall defaults to true, so port 22 opens with it.
Upstream rate-limits port 22 with ufw limit; nothing equivalent is set here,
so keep password authentication off (settings.PasswordAuthentication =
false) rather than relying on rate limiting.
Remote desktop
Serving the Hyprland session over RDP is off, and turning it on is a security decision with more than one part — what listens, on which interface, and where the password comes from. Remote desktop is that page.
Fingerprint and FIDO2
Setup > Security > Fingerprint and FIDO2 do the enrolment they always did:
fprintd-enroll really enrols a print, and pamu2fcfg really writes a
credential to /etc/fido2/fido2. What they cannot do is edit /etc/pam.d,
because on NixOS PAM is built, not edited. So the last step prints the lines
to add and exits non-zero:
security.pam.u2f.enable = true;
security.pam.u2f.settings.authfile = "/etc/fido2/fido2";
security.pam.u2f.settings.cue = true;
security.pam.services.sudo.u2fAuth = true;
security.pam.services.polkit-1.u2fAuth = true;
or, for fingerprint, services.fprintd.enable = true plus
security.pam.services.sudo.fprintAuth = true and the same for polkit-1.
Rebuild, and the enrolled key or print is accepted.
Passwordless sudo
Not a toggle here, on purpose. Upstream’s omarchy-sudo-passwordless
(Setup > Security > Passwordless Sudo) writes
/etc/sudoers.d/99-omarchy-nopasswd-$USER and a timer removes it after 15
minutes. NixOS’s /etc/sudoers has no #includedir, so that file would never
be read, and upstream would still print that it was enabled. nixarchy
replaces the command with one that says so, prints the options below, and
exits non-zero. In Omarchy’s newer releases the row becomes a toggle that
writes sudoers and tmpfiles rules; nixarchy hides it there, rather than offer
passwordless root one click away (#1280).
If you want it, declare it, for your user only:
security.sudo.extraRules = [{
users = [ "you" ];
commands = [{ command = "ALL"; options = [ "NOPASSWD" ]; }];
}];
or for the whole wheel group, security.sudo.wheelNeedsPassword = false;.
There is no timer: it stays until you remove it and rebuild. While it is on,
anything running as your user is root.
Changing your passwords
Your login password is passwd, or Update > Password > User in the menu.
The drive passphrase, if you encrypted, is cryptsetup luksChangeKey on the
LUKS device; NixOS does not manage that for you either.
If you declared users.users.you.hashedPassword or initialPassword in your
flake, that value is reapplied at every rebuild unless
users.mutableUsers is true (the default). Check before wondering why a
password change did not stick.
Passing on a machine, and signing keys
Setup > Reset Computer restores the baseline snapshot the Omarchy ISO takes, so it needs an ISO install and does not work here. Hand a machine over by reinstalling NixOS, or by deleting the user and their home from your flake and rebuilding. Upstream’s ISO and package signing key does not apply; nixarchy has no packages to sign, and the flake lock pins the source by hash.