Linux desktop application sandbox.
Go to file
Ophestra dc579dc610
All checks were successful
Tests / Go tests (push) Successful in 32s
Nix / NixOS tests (push) Successful in 3m35s
dbus/run: bind ldd entry absolute name
The ld.so entry has an absolute name. They are usually symlinks so binding path does not guarantee ld.so availability under its expected path in the mount namespace.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2024-12-26 16:36:03 +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 dbus/run: bind ldd entry absolute name 2024-12-26 16:36:03 +09:00
dist dist: create checksum in dist directory 2024-12-26 15:14:35 +09:00
fst fst/config: improve correctness of comments 2024-12-26 00:45:29 +09:00
helper migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
internal app: mount /dev/kvm in permissive defaults 2024-12-22 12:37:24 +09:00
ldd ldd: add fhs glibc test case 2024-12-26 16:33: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 config loading 2024-12-23 17:57:54 +09:00
nixos.nix nix: implement flake checks 2024-12-16 20:54:28 +09:00
options.md release: 0.2.7 2024-12-22 13:34:50 +09:00
options.nix nix: implement flake checks 2024-12-16 20:54:28 +09:00
package.nix release: 0.2.7 2024-12-22 13:34:50 +09:00
parse.go fortify/parse: accept config stream fd 2024-12-23 20:09:07 +09:00
print.go fortify: show short mode omit filesystems 2024-12-22 13:20:33 +09:00
README.md migrate to git.gensokyo.uk/security/fortify 2024-12-20 00:20:02 +09:00
test.nix nix: include fortify show output 2024-12-22 13:28:21 +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;
        };
      }
    ];
  };
}