[apparmor] mount rules

Seth Arnold seth.arnold at gmail.com
Sun Dec 18 10:11:39 UTC 2011


>> - I want to confine some stupid automounter program to read-write mounts
>>   for my camera's sd card. (/dev/disk/by-id/....) I don't want that stupid
>>   automounter to _ever_ be able to mount anything else, ever.
>>
> sure, you can do that without using the symlink.  You want a short cut to
> say use the path in the symlink.  Is taking a snapshot of that value at
> load time enough, or would you want it to be dynamic to the changing value
> of the symlink?

It ought to be dynamic -- I don't want to have my camera's SD card, my
Sony Reader, my iPod, my BlackBerry, my Top Gear USB Stick, and my
occasional backup-drive all connected at every profile load. :)

>> - I want to use pam_apparmor to confine all my users in the group "pvtfc"
>>   to _read only_ USB mounts but allow users in the group "officers"
>>   read-write USB mounts. Forbid all other SCSI mounts, forbid all
>>   NFS/CIFS/bind mounts. (/dev/disk/by-path/....)
>>
> you want extended conditional support, but that isn't going to happen
> in the first pass

Well, if we could use the symlinks in some fashion, I think it could be
done on a first go around. pam_apparmor changes privates first class into
the "pvtfc" profile and officers into the "officers" profile:

profile "pvtfc" {
  mount /dev/disk/by-path/pci-*-scsi-*-usb* -oro,noexec
  ...
}

profile "officers" {
  mount /dev/disk/by-path/pci-*-scsi-*-usb* -orw,noexec
}

If we had a daemon listening for udev events (or inotify events) and a
configuration file like this:

  DISK_USB: /dev/disk/by-path/pci-*-scsi-*-usb*

then the profiles could be written a bit more like this:

profile "pvtfc" {
  mount -label=DISK_USB -oro,noexec
}

profile "officers" {
  mount -label=DISK_USB -orw,noexec
}

>> - I want to confine Calibre to read-write mounts for my Sony Reader.
>>   (/dev/disk/by-id/... or /dev/disk/by-uuid/....)
>>
> I'm not sure I follow you?  I think you are saying you want Calibre to
> only have rw access on one specific mount specified by something in
> /dev/disk/by-uuid/, ie. basically the ereader?

Yes, that's it exactly -- I don't trust Calibre enough to mount anything
else, but I'll trust it with my books. (Honestly, Calibre failed the
automounting big time last time I tried. Hand-mounting devices always
worked better.)

>> - I want my data center operations staff to have privileges to rotate
>>   through a series of specific backup disks. (/dev/disk/by-uuid/...)
>>
> err okay, but I am not sure what this will by you.  A malicious operator
> can change the uuid of a disk

Oh. I forgot. Thanks.

How about drive serial numbers, vendor numbers, and device numbers? Say,
you could allow mounting only Apple devices or Kingston devices, or a
specific USB memory stick with built-in encryption services. (Hardware of
course can report whatever it pleases but this still might be useful.)

> yes, they are convenient, again the question is at what level.  Policy
> compilation, load time, dynamic?
>
> Policy compilation could be just done with a special variable assignment
>
> Load time with kernel vars, with the value set at load
>
> Dynamic kernel vars + daemon triggering on fanotify, or a few other more
> frightening implementations I can think of

Policy compilation and load time are both far too static. Drives come and
go all the time and their scsi name /dev/sd* is next to useless. The
dynamic names are better but troublesome. The more I think about it, the
more I think labeling is the answer here.

(I wish the kernel just gave them persistent names.)

>> deny mount type=nodev
>>
> yes though perhaps not at type= as we may want to use type= and nodev at the
> same time.

Good point.

>>> - how do we want to cover umount, anything you can mount you can unmount or
>>>  do we want a separate flag or permission.
>>
>> Definitely separate flag or permission.
>>
> Or different rule?
>  unmount /blah,

Sure, this sounds like a good idea. I got distracted by my special cases
and forgot simple too. :)

>  Hrmm maybe more like
>
>  unmount label=profile,            # yes I said labeling is a ways a way but
>                                    # but implicit labeling will be closer
>  unmount owner /foo/bar,

Yes, much easier to read.

>> How do we handle the unshare(2) system call? I can't find _any_ mediation
>> points in my kernel source for 'unshare' (not even for capable
>> CAP_SYS_ADMIN) -- only in do_fork() could I find any security checks.
>>
> basically we don't atm, at least not anymore than we can do with fork

Chalk this up to not looking _everywhere_: unshare_nsproxy_namespaces()
will call capable().

Thanks John



More information about the AppArmor mailing list