Replies: 1 comment 8 replies
|
Thanks for raising this. You are right: the permission/security model should be documented better. I’ll use this as the basis for a proper docs section. Passless is not intended to run as root. The privileged part is only the initial system integration needed to let an unprivileged user create a virtual FIDO2 HID device through Linux UHID. At runtime, the basic flow is:
The required runtime permissions are: The packaged udev rule is currently: So the expected setup is: sudo modprobe uhid
echo uhid | sudo tee /etc/modules-load.d/fido.conf
sudo groupadd fido 2>/dev/null || true
sudo usermod -aG fido "$USER"
echo 'KERNEL=="uhid", GROUP="fido", MODE="0660"' | sudo tee /etc/udev/rules.d/90-passless.rules
sudo udevadm control --reload-rules
sudo udevadm triggerThen log out and back in, or otherwise refresh your group membership, and verify: id
ls -l /dev/uhidYou should see your user in the What Passless does not need at runtime: Depending on your browser and distro, there is one separate browser-side detail: the browser must be allowed to access FIDO/HID devices. For normal non-sandboxed browsers this is usually handled by the desktop/session/udev stack. For sandboxed browsers, for example Snap/Flatpak-style installs, access may be blocked even when Passless itself is working. In that case you may need For the default By default it stores credentials under the configured path inside the password store, currently For a hardened AppArmor/SELinux/bubblewrap setup, the useful allowlist is roughly: The user systemd service also applies some hardening: NoNewPrivileges=true
LimitMEMLOCK=2MPassless itself tries to disable core dumps and probes sudo setcap cap_ipc_lock=+ep "$(command -v passless)"A minimal config can be generated with: mkdir -p ~/.config/passless
passless config print > ~/.config/passless/config.tomlFor a stricter configuration, I recommend setting a PIN and requiring PIN-based user verification: backend_type = "pass"
[pass]
store_path = "/home/YOUR_USER/.password-store"
path = "fido2"
gpg_backend = "gnupg-bin"
[security]
check_mlock = true
disable_core_dumps = true
always_uv = true
[pin]
enforcement = "required"
min_length = 4
max_retries = 8Useful debugging commands: lsmod | grep uhid
ls -l /dev/uhid
id
systemctl --user status passless
journalctl --user -u passless -f
passless --verboseTypical failure mapping: So the smallest required permission for Passless itself is |
Uh oh!
There was an error while loading. Please reload this page.
How does the Passless setup work? What kind of permissions are required to function properly? As mentioned before on Discord, I have hardened machine configurations for security so I need to know exactly what is needed to adapt my setup and impose restrictions that make sense and the application does not have any documentation that explains this. I'm blindly trying to configure but, with permission errors.
All reactions