Linux desktop application sandbox.
Go to file
Ophestra 71135f339a
All checks were successful
Test / Create distribution (push) Successful in 20s
Release / Create release (push) Successful in 33s
Test / Fortify (push) Successful in 2m4s
Test / Data race detector (push) Successful in 2m33s
Test / Flake checks (push) Successful in 48s
release: 0.2.18
Signed-off-by: Ophestra <cat@gensokyo.uk>
2025-02-23 18:52:33 +09:00
.gitea/workflows workflows: separate nixos tests from flake check 2025-02-23 18:34:42 +09:00
acl acl: implement Update in C 2025-02-17 21:39:14 +09:00
cmd nix: separate fsu from package 2025-02-23 18:13:37 +09:00
command command: filter parse errors 2025-02-23 12:55:10 +09:00
comp fortify: zsh complete show instance list 2024-12-21 21:13:53 +09:00
dbus dbus: remove BwrapStatic method 2025-02-14 18:09:59 +09:00
dist nix: configure target users via nixos 2025-01-23 17:04:19 +09:00
fst fst: remove empty file 2025-02-21 19:27:08 +09:00
helper fortify: keep external files alive 2025-02-23 03:24:37 +09:00
internal app: separate instance from process state 2025-02-21 16:06:24 +09:00
ldd ldd: handle behaviour on static executable 2025-02-23 18:02:33 +09:00
system system: document I methods 2025-02-21 19:51:12 +09:00
test nix: clean up directory structure 2025-02-23 18:48:01 +09:00
wl fortify: keep external files alive 2025-02-23 03:24:37 +09:00
.gitignore nix: generate application package build script 2024-12-29 00:42:21 +09:00
error.go fmsg: export logBaseError function 2025-02-18 13:02:51 +09:00
flake.lock release: 0.2.13 2025-02-13 23:45:54 +09:00
flake.nix nix: clean up directory structure 2025-02-23 18:48:01 +09:00
go.mod migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
LICENSE apply MIT license 2024-07-16 20:49:00 +09:00
main_test.go fortify: test help message 2025-02-23 02:51:35 +09:00
main.go fortify: handle errors via MustParse 2025-02-23 12:57:59 +09:00
nixos.nix nix: separate fsu from package 2025-02-23 18:13:37 +09:00
options.md release: 0.2.18 2025-02-23 18:52:33 +09:00
options.nix nix: separate fsu from package 2025-02-23 18:13:37 +09:00
package.nix release: 0.2.18 2025-02-23 18:52:33 +09:00
parse.go sys: rename from linux 2025-02-18 18:47:48 +09:00
print_test.go fortify: integrate command handler 2025-02-23 02:35:02 +09:00
print.go fortify: integrate command handler 2025-02-23 02:35:02 +09:00
README.md migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00

Fortify

Go Reference Go Report Card

Lets you run graphical applications as another user in a confined environment with a nice NixOS module to configure target users and provide launchers and desktop files for your privileged user.

Why would you want this?

  • It protects the desktop environment from applications.

  • It protects applications from each other.

  • It provides UID isolation on top of the standard application sandbox.

If you have a flakes-enabled nix environment, you can try out the tool by running:

nix run git+https://git.gensokyo.uk/security/fortify -- help

Module usage

The NixOS module currently requires home-manager to function correctly.

Full module documentation can be found here.

To use the module, import it into your configuration with

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";

    fortify = {
      url = "git+https://git.gensokyo.uk/security/fortify";

      # Optional but recommended to limit the size of your system closure.
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = { self, nixpkgs, fortify, ... }:
  {
    nixosConfigurations.fortify = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        fortify.nixosModules.fortify
      ];
    };
  };
}

This adds the environment.fortify option:

{ pkgs, ... }:

{
  environment.fortify = {
    enable = true;
    stateDir = "/var/lib/persist/module/fortify";
    users = {
      alice = 0;
      nixos = 10;
    };

    apps = [
      {
        name = "chromium";
        id = "org.chromium.Chromium";
        packages = [ pkgs.chromium ];
        userns = true;
        mapRealUid = true;
        dbus = {
          system = {
            filter = true;
            talk = [
              "org.bluez"
              "org.freedesktop.Avahi"
              "org.freedesktop.UPower"
            ];
          };
          session =
            f:
            f {
              talk = [
                "org.freedesktop.FileManager1"
                "org.freedesktop.Notifications"
                "org.freedesktop.ScreenSaver"
                "org.freedesktop.secrets"
                "org.kde.kwalletd5"
                "org.kde.kwalletd6"
              ];
              own = [
                "org.chromium.Chromium.*"
                "org.mpris.MediaPlayer2.org.chromium.Chromium.*"
                "org.mpris.MediaPlayer2.chromium.*"
              ];
              call = { };
              broadcast = { };
            };
        };
      }
      {
        name = "claws-mail";
        id = "org.claws_mail.Claws-Mail";
        packages = [ pkgs.claws-mail ];
        gpu = false;
        capability.pulse = false;
      }
      {
        name = "weechat";
        packages = [ pkgs.weechat ];
        capability = {
          wayland = false;
          x11 = false;
          dbus = true;
          pulse = false;
        };
      }
      {
        name = "discord";
        id = "dev.vencord.Vesktop";
        packages = [ pkgs.vesktop ];
        share = pkgs.vesktop;
        command = "vesktop --ozone-platform-hint=wayland";
        userns = true;
        mapRealUid = true;
        capability.x11 = true;
        dbus = {
          session =
            f:
            f {
              talk = [ "org.kde.StatusNotifierWatcher" ];
              own = [ ];
              call = { };
              broadcast = { };
            };
          system.filter = true;
        };
      }
      {
        name = "looking-glass-client";
        groups = [ "plugdev" ];
        extraPaths = [
          {
            src = "/dev/shm/looking-glass";
            write = true;
          }
        ];
        extraConfig = {
          programs.looking-glass-client.enable = true;
        };
      }
    ];
  };
}