treewide: update AppArmor policies

Update AppArmor policies to use modern conventions.
This includes
* Including abi version
* Adding conditional include of local/<name> policy file
* Use of the profile keyword
* Start file rules with a pathname

Author: ssoss <skyler.soss@gmail.com>
This commit is contained in:
ssoss 2025-09-19 15:23:24 -05:00 committed by Grimmauld
commit af42991dea
No known key found for this signature in database
7 changed files with 80 additions and 74 deletions

View file

@ -19,7 +19,7 @@ let
mode ? "r",
trail ? "",
}:
lib.optionalString (hasAttr path etc) "${mode} ${config.environment.etc.${path}.source}${trail},";
lib.optionalString (hasAttr path etc) "${config.environment.etc.${path}.source}${trail} ${mode},";
in
if isAttrs arg then go arg else go { path = arg; };
in
@ -93,19 +93,19 @@ in
];
"abstractions/base" = ''
include "${pkgs.apparmor-profiles}/etc/apparmor.d/abstractions/base"
r ${pkgs.stdenv.cc.libc}/share/locale/**,
r ${pkgs.stdenv.cc.libc}/share/locale.alias,
r ${config.i18n.glibcLocales}/lib/locale/locale-archive,
${pkgs.stdenv.cc.libc}/share/locale/** r,
${pkgs.stdenv.cc.libc}/share/locale.alias r,
${config.i18n.glibcLocales}/lib/locale/locale-archive r,
${etcRule "localtime"}
r ${pkgs.tzdata}/share/zoneinfo/**,
r ${pkgs.stdenv.cc.libc}/share/i18n/**,
${pkgs.tzdata}/share/zoneinfo/** r,
${pkgs.stdenv.cc.libc}/share/i18n/** r,
'';
"abstractions/bash" = ''
include "${pkgs.apparmor-profiles}/etc/apparmor.d/abstractions/bash"
# bash inspects filesystems at startup
# and /etc/mtab is linked to /proc/mounts
r @{PROC}/mounts,
@{PROC}/mounts r,
# system-wide bash configuration
''
@ -296,8 +296,8 @@ in
# looking up users by name or id, groups by name or id, hosts by name
# or IP, etc. These operations may be performed through files, dns,
# NIS, NIS+, LDAP, hesiod, wins, etc. Allow them all here.
mr ${getLib pkgs.nss}/lib/libnss_*.so*,
mr ${getLib pkgs.nss}/lib64/libnss_*.so*,
${getLib pkgs.nss}/lib/libnss_*.so* mr,
${getLib pkgs.nss}/lib64/libnss_*.so* mr,
''
+ lib.concatMapStringsSep "\n" etcRule [
"group"
@ -463,11 +463,11 @@ in
include "${pkgs.apparmor-profiles}/etc/apparmor.d/abstractions/ssl_certs"
# For the NixOS module: security.acme
r /var/lib/acme/*/cert.pem,
r /var/lib/acme/*/chain.pem,
r /var/lib/acme/*/fullchain.pem,
/var/lib/acme/*/cert.pem r,
/var/lib/acme/*/chain.pem r,
/var/lib/acme/*/fullchain.pem r,
r /etc/pki/tls/certs/,
/etc/pki/tls/certs/ r,
''
+ lib.concatMapStringsSep "\n" etcRule [
@ -510,8 +510,8 @@ in
];
"abstractions/ssl_keys" = ''
# security.acme NixOS module
r /var/lib/acme/*/full.pem,
r /var/lib/acme/*/key.pem,
/var/lib/acme/*/full.pem r,
/var/lib/acme/*/key.pem r,
'';
"abstractions/vulkan" = ''
include "${pkgs.apparmor-profiles}/etc/apparmor.d/abstractions/vulkan"

View file

@ -401,40 +401,40 @@ in
];
security.apparmor.policies."bin.mumble-server".profile = ''
abi <abi/4.0>,
include <tunables/global>
${cfg.package}/bin/{mumble-server,.mumble-server-wrapped} {
profile ${cfg.package}/bin/{mumble-server,.mumble-server-wrapped} {
include <abstractions/base>
include <abstractions/nameservice>
include <abstractions/ssl_certs>
include "${pkgs.apparmorRulesFromClosure { name = "mumble-server"; } cfg.package}"
pix ${cfg.package}/bin/.mumble-server-wrapped,
${cfg.package}/bin/.mumble-server-wrapped pix,
r ${config.environment.etc."os-release".source},
r ${config.environment.etc."lsb-release".source},
owner rwk ${cfg.stateDir}/murmur.sqlite,
owner rw ${cfg.stateDir}/murmur.sqlite-journal,
owner r ${cfg.stateDir}/,
r /run/murmur/murmurd.pid,
r /run/murmur/murmurd.ini,
r ${configFile},
''
+ lib.optionalString cfg.logToFile ''
rw /var/log/murmur/murmurd.log,
''
+ lib.optionalString (cfg.sslCert != null) ''
r ${cfg.sslCert},
''
+ lib.optionalString (cfg.sslKey != null) ''
r ${cfg.sslKey},
''
+ lib.optionalString (cfg.sslCa != null) ''
r ${cfg.sslCa},
''
+ lib.optionalString (cfg.dbus != null) ''
dbus bus=${cfg.dbus}
''
+ ''
${config.environment.etc."os-release".source} r,
${config.environment.etc."lsb-release".source} r,
owner ${cfg.stateDir}/murmur.sqlite rwk,
owner ${cfg.stateDir}/murmur.sqlite-journal rw,
owner ${cfg.stateDir}/ r,
/run/murmur/murmurd.pid r,
/run/murmur/murmurd.ini r,
${configFile} r,
${lib.optionalString cfg.logToFile ''
/var/log/murmur/murmurd.log rw,
''}
${lib.optionalString (cfg.sslCert != null) ''
${cfg.sslCert} r,
''}
${lib.optionalString (cfg.sslKey != null) ''
${cfg.sslKey} r,
''}
${lib.optionalString (cfg.sslCa != null) ''
${cfg.sslCa} r,
''}
${lib.optionalString (cfg.dbus != null) ''
dbus bus=${cfg.dbus},
''}
include if exists <local/bin.mumble-server>
}
'';
};

View file

@ -585,23 +585,23 @@ in
include "${cfg.package.apparmor}/bin.transmission-daemon"
'';
security.apparmor.includes."local/bin.transmission-daemon" = ''
r ${config.systemd.services.transmission.environment.CURL_CA_BUNDLE},
${config.systemd.services.transmission.environment.CURL_CA_BUNDLE} r,
owner rw ${cfg.home}/${settingsDir}/**,
rw ${cfg.settings.download-dir}/**,
owner ${cfg.home}/${settingsDir}/** rw,
${cfg.settings.download-dir}/** rw,
${optionalString cfg.settings.incomplete-dir-enabled ''
rw ${cfg.settings.incomplete-dir}/**,
${cfg.settings.incomplete-dir}/** rw,
''}
${optionalString cfg.settings.watch-dir-enabled ''
r${optionalString cfg.settings.trash-original-torrent-files "w"} ${cfg.settings.watch-dir}/**,
${cfg.settings.watch-dir}/** r${optionalString cfg.settings.trash-original-torrent-files "w"},
''}
profile dirs {
rw ${cfg.settings.download-dir}/**,
${cfg.settings.download-dir}/** rw,
${optionalString cfg.settings.incomplete-dir-enabled ''
rw ${cfg.settings.incomplete-dir}/**,
${cfg.settings.incomplete-dir}/** rw,
''}
${optionalString cfg.settings.watch-dir-enabled ''
r${optionalString cfg.settings.trash-original-torrent-files "w"} ${cfg.settings.watch-dir}/**,
${cfg.settings.watch-dir}/** r${optionalString cfg.settings.trash-original-torrent-files "w"},
''}
}
@ -612,12 +612,12 @@ in
# any existing profile for script-torrent-done-filename
# FIXME: to be tested as I'm not sure it works well with NoNewPrivileges=
# https://gitlab.com/apparmor/apparmor/-/wikis/AppArmorStacking#seccomp-and-no_new_privs
px ${cfg.settings.script-torrent-done-filename} -> &@{dirs},
${cfg.settings.script-torrent-done-filename} px -> &@{dirs},
''
}
${optionalString (cfg.webHome != null) ''
r ${cfg.webHome}/**,
${cfg.webHome}/** r,
''}
'';
};

View file

@ -207,15 +207,18 @@ in
environment.systemPackages = [ cfg.package ];
security.apparmor.policies."bin.miniflux".profile = ''
abi <abi/4.0>,
include <tunables/global>
${cfg.package}/bin/miniflux {
profile ${cfg.package}/bin/miniflux {
include <abstractions/base>
include <abstractions/nameservice>
include <abstractions/ssl_certs>
include <abstractions/golang>
include "${pkgs.apparmorRulesFromClosure { name = "miniflux"; } cfg.package}"
r ${cfg.package}/bin/miniflux,
rw /run/miniflux/**,
${cfg.package}/bin/miniflux r,
/run/miniflux/** rw,
include if exists <local/bin.miniflux>
}
'';
};

View file

@ -175,21 +175,22 @@ stdenv.mkDerivation (finalAttrs: {
postInstall = ''
mkdir $apparmor
cat >$apparmor/bin.transmission-daemon <<EOF
abi <abi/4.0>,
include <tunables/global>
$out/bin/transmission-daemon {
profile $out/bin/transmission-daemon {
include <abstractions/base>
include <abstractions/nameservice>
include <abstractions/ssl_certs>
include "${apparmorRules}"
r @{PROC}/sys/kernel/random/uuid,
r @{PROC}/sys/vm/overcommit_memory,
r @{PROC}/@{pid}/environ,
r @{PROC}/@{pid}/mounts,
rwk /tmp/tr_session_id_*,
@{PROC}/sys/kernel/random/uuid r,
@{PROC}/sys/vm/overcommit_memory r,
@{PROC}/@{pid}/environ r,
@{PROC}/@{pid}/mounts r,
/tmp/tr_session_id_* rwk,
r $out/share/transmission/public_html/**,
$out/share/transmission/public_html/** r,
include <local/bin.transmission-daemon>
include if exists <local/bin.transmission-daemon>
}
EOF
install -Dm0444 -t $out/share/icons ../qt/icons/transmission.svg

View file

@ -71,16 +71,18 @@ stdenv.mkDerivation rec {
postInstall = ''
mkdir $apparmor
cat >$apparmor/bin.ping <<EOF
$out/bin/ping {
abi <abi/4.0>,
include <tunables/global>
profile $out/bin/ping {
include <abstractions/base>
include <abstractions/consoles>
include <abstractions/nameservice>
include "${apparmorRulesFromClosure { name = "ping"; } [ stdenv.cc.libc ]}"
include <local/bin.ping>
capability net_raw,
network inet raw,
network inet6 raw,
mr $out/bin/ping,
include if exists <local/bin.ping>
}
EOF
'';

View file

@ -9,18 +9,18 @@
# TODO: factorize here some other common paths
# that may emerge from use cases.
baseRules ? [
"r $path"
"r $path/etc/**"
"mr $path/share/**"
"$path r"
"$path/etc/** r"
"$path/share/** mr"
# Note that not all libraries are prefixed with "lib",
# eg. glibc-2.30/lib/ld-2.30.so
"mr $path/lib/**.so*"
"mr $path/lib64/**.so*"
"$path/lib/**.so* mr"
"$path/lib64/**.so* mr"
# eg. glibc-2.30/lib/gconv/gconv-modules
"r $path/lib/**"
"r $path/lib64/**"
"$path/lib/** r"
"$path/lib64/** r"
# Internal executables
"ixr $path/libexec/**"
"$path/libexec/** ixr"
],
name ? "",
}: