[apparmor] Priority of two matching profiles

John Johansen john.johansen at canonical.com
Sat Mar 8 20:41:47 UTC 2025


On 3/8/25 05:03, engelflorian at posteo.de wrote:
> Hi,
> 
> What is the priority if two profiles match. E.g. /usr/bin/cat matches on
> profiles /usr/bin/c* and /usr/bin/ca*. What profile is it using?
> 

It is approximately longest left non-glob match wins. It has changed some
over the years, from just being a length hint of how long the left match
is before hitting globbing, to the kernel actually keeping a small buffer,
to provide a more refined match.

So example in order of match order

/usr/bin/example
/usr/bin/*
/usr/bin/**

If we are talking exact match (eg. /usr/bin/example) then the first
exact match wins (match is short circuited), so load order would
matter.

However if there isn't an exact match, a complete search is done
for the best match. If there are two or more with the same best
left match length then there will be a conflict and the exec will
be failed.

> I use Nixos and have generate profiles for all programs which are
> installed by my configuration. I then want to add a default profile
> which is only used if no other profile matches.
> 
> I don't think I can do that wit profile inheritence, because if i switch
> from the default profile it always switches to the systemd profile. If i
> add inheritence to the systemd profile it selects the default profile
> and not the more specific ones
> 

ix, or inheritance fallback really only works for this if you are using
stacking, because ix default to the current confinement, not a default.
ix is transition that's primary use is role based profiles.

The stacking I mentioned is probably not what you want either, as having
multiple profiles on an application can get messy.


> I tried it with a config like this
> ```

so /nix/store/ ...  has priority over default /**

> profile /nix/store/***-systemd/**  flags=(attach_disconnected) {
>    # allow everything
>    capability,
>    network,
>    mount,
>    remount,
>    umount,
>    pivot_root,
>    ptrace,
>    signal,
>    dbus,
>    unix,
>    file,
> }
> ...
> profile default /** flags=(attach_disconnected) {
>    capability,
>    network,
>    mount,
>    remount,
>    umount,
>    pivot_root,
>    ptrace,
>    signal,
>    dbus,
>    unix,
>    file,
> 
>    # Deny some sensitive files
>    deny /home/florian/.ssh/{,**} mrwlk,
>    }
> ```




More information about the AppArmor mailing list