u/Vegetable-Escape7412

PVEday: first Belgium Proxmox Community Day, 3 Feb 2027 in Gent (free, CFP open)
▲ 127 r/ProxmoxVE+1 crossposts

PVEday: first Belgium Proxmox Community Day, 3 Feb 2027 in Gent (free, CFP open)

We're organising the first Proxmox community day in Belgium: PVEday, Wednesday 3 February 2027 in Ghent.

  • Free, one full day, talks and workshops, by and for the community
  • Proxmox is sponsoring and will present some of the future directions of the projects
  • Hosted inside CfgMgmtCamp (cfgmgmtcamp.org), which runs right after FOSDEM, so if you're coming to Brussels for FOSDEM you can stay a few more days and do both
  • CFP is open until 1 December 2026: we're still looking for speakers. Migration war stories, storage setups, Ceph, PBS, PDM, homelab or enterprise, anything you'd want to hear yourself. Workshops welcome too.
  • Registration is open now (free): https://www.pveday.be

Happy to answer questions here. And if you've done something with Proxmox that you think others should know about, submit it, first-time speakers very welcome!

**EDIT, registration is now open:** https://www.opensource-enterprise.com/event-registration.php?event=belgium-proxmox-community-day-2027-02-03&source=pveday (free)

u/Vegetable-Escape7412 — 9 days ago

New AUR package: modulejail - kernel-module attack-surface hardening. Would value a packaging review.

Just published modulejail (1.2.4-1) to AUR. It's a hardening tool that walks `lsmod`, treats the currently-loaded set as necessary, and writes a `modprobe.d` blacklist for everything else - shrinks the autoload-able kernel-module surface to ~3% of available modules on a default install of most Linux distributions. Logs blocked module loading attempts to syslog and more...

I'm posting here because this is my first AUR package and I'd rather have it picked apart by people who've done this more than once than discover something six months from now.

## Packaging choices I made deliberately

- **`license=('GPL-3.0-only')`** - SPDX identifier, not legacy `GPL3`.

- **`arch=('any')`** - pure POSIX shell, no native code.

- **`depends=('kmod')`** for `lsmod`/`modprobe`. Everything else

(POSIX shell, coreutils, sed, awk) is in `base`, left undeclared.

`optdepends=('util-linux: logger(1) for syslog integration')` is

mostly a docs gesture - util-linux is in `base` on every standard

install, but minimal containers may strip it.

- **Real sha256 committed**, not `SKIP`. SKIP belongs to `-git`

tracking flavors; this is a tagged-release package.

- **Man page templated** (`man/modulejail.8.in` upstream). The

PKGBUILD runs a single `sed "s/__VERSION__/$pkgver/g"` in

`package()`, same substitution upstream's `build.sh` does for

`.deb`/`.rpm`. No `prepare()` step, no `build()` step.

- **0BSD on the PKGBUILD itself**, GPL-3.0-only on the program it

builds. SPDX header in `PKGBUILD` + `LICENSE` file alongside, per

the [Arch sources-license guideline](https://wiki.archlinux.org/title/Arch_package_guidelines#Package_sources_licenses).

Also unblocks any future promotion-to-`extra` path if that ever

makes sense.

package layout:

/usr/bin/modulejail

/usr/share/man/man8/modulejail.8.gz # makepkg auto-gzips

/usr/share/doc/modulejail/{README.md,CHANGELOG.md}

/usr/share/licenses/modulejail/LICENSE

Resulting `.pkg.tar.zst` is ~120 KB.

## What I'd value feedback on

- Did I miss anything from the [Arch packaging guidelines](https://wiki.archlinux.org/title/Arch_package_guidelines) ?

- `depends=('kmod')` correct, or should I be more explicit (e.g.

declare coreutils / findutils explicitly even though they're in

`base`)?

- Anything else you'd want different before using it?

## Links

- AUR: https://aur.archlinux.org/packages/modulejail

- Upstream: https://github.com/jnuyens/modulejail

- PKGBUILD (version-controlled in-tree, mirrored to AUR):

https://github.com/jnuyens/modulejail/tree/master/packaging/aur

- License: 0BSD on the recipe, GPL-3.0-only on the program

The PKGBUILD lives in-tree at `packaging/aur/PKGBUILD`

**Edit:** Two things I should have flagged in the original post:

  1. **`modulejail-git` already exists on AUR**, maintained by u/bambuch, who

packaged the v1.2.3 HEAD commit a few days before I got to publishing

the tagged-release counterpart. This is the standard AUR pattern -

`pkgname` (stable releases) and `pkgname-git` (rolling) routinely

coexist with different maintainers. Their PKGBUILD already declared

`conflicts=('modulejail')` and `provides=('modulejail')`; I just

pushed 1.2.4-2 with a symmetric `conflicts=('modulejail-git')` so

the mutual-exclusion is two-way-declared. Credit to bambuch for

being there first.

  1. **Current version on AUR is 1.2.4-2**, not the 1.2.4-1 mentioned

above. The only change is the conflicts declaration.

AUR (-git variant by bambuch): https://aur.archlinux.org/packages/modulejail-git

reddit.com
u/Vegetable-Escape7412 — 5 months ago

Your Linux system has +6,000 kernel modules which can be autoloaded. You use 80 of them. ModuleJail blacklist all of the unused ones. Server and desktop profiles and much more in a simple shell script.

Hey r/linuxadmin. I'm the author of this so I'm flagging that up front - this is a "would love feedback from people running real fleets" post.

The problem. Modern distro kernels ship with thousands of loadable modules. Almost all of them are attack surface that you're paying for in availability (autoload via udev, hotplug, dependency resolution) but not using. With AI-assisted kernel vulnerability discovery accelerating, every module a host can load but doesn't need to load is a problem you'd rather not have.

ModuleJail walks lsmod, treats whatever is loaded right now as "necessary," and writes a modprobe.d blacklist file for everything else. Optionally adds a --whitelist-file for modules you want preserved even if they're not currently loaded (think: rarely-used filesystem drivers you mount once a quarter).

What it isn't.

- Not a vulnerability scanner. The model is "unused, therefore blacklisted," not "vulnerable, therefore blacklisted."

- Not a defense against an attacker who already has root - they can rm the file. It's about reducing the unprivileged-trigger / autoload paths.

- Not initramfs-aware. Modules baked into the initrd are out of scope.

- Not a daemon, not a monitor. Single POSIX shell script, runs once, writes one file in /etc/modprobe.d/.

Revert.

rm /etc/modprobe.d/modulejail-blacklist.conf

and you're back. No reboot needed - the kernel reads modprobe.d at load time. Explicit sudo modprobe foo always wins over the blacklist, by design.

What I want feedback on. What does this need before you'd run it across a fleet? Things I've heard so far: an Ansible role, a --dry-run flag, JSON output for diff-friendly state tracking, kernel-version pinning in the generated file header. What else?

Repo: github.com/jnuyens/modulejail

License: GPL-3.0

Packaging: .deb and .rpm on the releases page; AUR package today.

u/Vegetable-Escape7412 — 5 months ago