Linux desktop application sandbox.
Go to file
Ophestra e8594cf670
All checks were successful
Tests / Go tests (push) Successful in 1m23s
Nix / NixOS tests (push) Successful in 3m28s
fortify: print short instance id in non-json short mode
Signed-off-by: Ophestra <cat@gensokyo.uk>
2024-12-22 11:02:19 +09:00
.gitea/workflows workflows: cache nix store 2024-12-18 23:38:39 +09:00
acl migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
cmd migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
comp fortify: zsh complete show instance list 2024-12-21 21:13:53 +09:00
dbus migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
dist migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
fst app: rename /fortify to /.fortify 2024-12-21 18:11:32 +09:00
helper migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
internal fortify: clean up ps formatting code 2024-12-21 20:34:40 +09:00
ldd migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
wl system: prevent duplicate Wayland op 2024-12-07 19:45:37 +09:00
xcb xcb: refactor and clean up 2024-12-17 12:46:36 +09:00
.gitignore dist: generate distribution tarball 2024-12-17 14:02:54 +09:00
error.go migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
flake.lock nix: permissive defaults nixos test 2024-12-16 22:56:10 +09:00
flake.nix nix: run Go tests in nixos 2024-12-17 21:16:55 +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.go fortify: clean up ps formatting code 2024-12-21 20:34:40 +09:00
nixos.nix nix: implement flake checks 2024-12-16 20:54:28 +09:00
options.md release: 0.2.6 2024-12-22 01:18:21 +09:00
options.nix nix: implement flake checks 2024-12-16 20:54:28 +09:00
package.nix release: 0.2.6 2024-12-22 01:18:21 +09:00
print.go fortify: print short instance id in non-json short mode 2024-12-22 11:02:19 +09:00
README.md migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
test.nix nix: check state store contents 2024-12-22 01:10:48 +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;
        };
      }
    ];
  };
}