SDB:AppArmor geeks

Μετάβαση σε: πλοήγηση, αναζήτηση

A Geeks Introduction to AppArmor

Εισαγωγή

Αυτός ο οδηγός έχει σκοπό να σας καθοδηγήσει στην προσπάθεια του AppArmor να κατανοήσει καλύτερα τα εσωτερικά του. Οι χρήστες που απλά επιθυμούν να χρησιμοποιήσουν το πακεταρισμένο για διανομές AppArmor θα πρέπει να αναφέρθουν στην τεκμιρίωση της διανομής τους.

Το AppArmor

Το AppArmor είναι μια εφαρμογή ασφαλείας του Linux των name-based ελεγχών πρόσβασης. Το AppArmor περιορίζει τα μεμονωμένα προγράμματα σε μια σειρά από αρχεία που παρατίθενται και σε POSIX 1003.1e σχέδια δυνατοτήτων.

Ένας από τους κύριους στόχους του AppArmor είναι να είναι εύκολα κατανοητό και απλό στη χρήση. Ένα από τα χαρακτηριστικά του AppArmor που εισήχθη για να βοηθήσει τους χρήστες να γράψουν και να διατηρήσουν την πολιτική είναι μια λειτουργία μάθησης ανα προφίλ. Τα προφιλ μπορεί να είναι σε μία από τις δύο καταστάσεις: εκμάθηση λειτουργίας (επίσης γνωστή ως "λειτουργία παραπόνων") και ο τρόπος επιβολής της (επίσης γνωστή ως "περιορισμένη").

Η λειτουργία μάθησης έχει ρυθμιστεί ανά προφίλ. Οι διεργασίες που τρέχουν σε ένα προφίλ μπορεί εύκολα να ρυθμιστούν μεταξύ της εκμάθησης λειτουργίας και τη λειτουργία επιβολής. Μόνο οι ανεμπόδιστες ριζικές (root) διαδικασίες επιτρέπεται να αλλάξουν τρόπο μάθησης.

Patches πυρήνα

Τα patches του πυρήνα του AppArmor παρέχονται σε μορφή κατάλληλη για χρήση με το quilt.[1] Τα patches ισχύουν για τους τελευταίους πυρήνες git στο kernel.org. Στιγμιότυπα του git ή κυκλοφορημένοι πυρήνες μπορεί να λειτουργήσουν με λίγα fuzz. Αν υπάρχουν πολλά fuzz ή τα patchesδεν ισχύουν, προσπαθήστε με παλαιότερους ή νεότερους πυρήνες.

Αφού κατεβάσετε και αποσυμπιέσετε τον κώδικα του πυρήνα, εφαρμόστε όλα τα patches του AppArmor. Ένα παράδειγμα χρήσης του quilt για την εφαρμογή των AppArmor patches:

 tar -zxvf apparmor.tar.gz
 ln -sf apparmor ~/path/to/kernel/sources/patches
 cd ~/path/to/kernel/sources
 quilt push -a

Ρύθμιση πυρήνα

Ρυθμίστε τον πυρήνα. Το CONFIG_SECURITY_APPARMOR πρέπει να οριστεί σε 'y' ή 'm'. Το 'm' λαμβάνει συχνότερες δοκιμές. Απενεργοποιήστε τα CONFIG_SECURITY_CAPABILITIES και CONFIG_SECURITY_SELINUX.

(Εαν επιθυμέιτε να μεταγλωτίσετε το SELinux ή το Capabilities στον πυρήνα σας, τότε πρέπει να προσθέσετε το selinux=0 capability.disable=1 στη γραμμή εντολών (grub, lilo, yaboot, κτλ.).)

Δεν αρκεί να βάλετε το SELinux σε permissive mode. Το AppArmor πρέπει να να είναι το μόνο φορτωμένο στο LSM.

Securityfs

Το AppArmor χρησιμοποιεί τον τυπικό μηχανισμό securityfs του πυρήνα για να φορτώσει την πολιτική και ενημερωτική έκθεση στους διαχειριστές του συστήματος. Το σύνηθες σημείο προσάρτησης για securityfs είναι το /sys/kernel/security.

Προσαρτήστε το με:

 mount securityfs -t securityfs /sys/kernel/security

Μόλις securityfs έχει τοποθετηθεί και AppArmor είναι φορτωμένο, το /sys/kernel/security/apparmor/profile θα εμφανίσει τα προφίλ που φορτώνονται στον πυρήνα, καθώς και το σήμα εάν τα προφίλ είναι σε κατάσταση αναγκαστικής εκτέλεσης ή σε λειτουργία εκμάθησης:

 $ sudo cat /sys/kernel/security/apparmor/profiles
 /usr/bin/opera (complain)
 /usr/lib/firefox/firefox.sh (complain)
 /sbin/lspci (enforce)
 ...

/sys/kernel/security/apparmor/control/ control seldom-used features of AppArmor:

 audit    if '1', audit all actions by confined processes
 complain if '1', allow all actions by confined processes, report
          accesses not granted by policy
 debug    if '1', emit copius debugging
 logsyscall  if '1', use audit framework's syscall debugging, if audit
          has been instructed to create per-task contexts.[2]

Policy parser

Θα χρειαστείτε το apparmor_parser [3] για να φορτώσετε την πολιτική του AppArmor μέσα στον πυρήνα. Απλά τρέξτε το «make» στο υψηλότερο επίπεδο για τη μεταγλώττιση του apparmor_parser.

Μόλις το πρόγραμμα ανάλυσης είναι μεταγλωττισμένο και το module του AppArmor φορτωμένο, μπορείτε να χρησιμοποιήσετε το πρόγραμμα ανάλυσης για να μεταγλωττίσετε και να εγκαταστήσετε την πολιτική:

 echo "/tmp/ls { /tmp/ls rm, }" | ./apparmor_parser

Μόλις ένα προφίλ για ένα πρόγραμμα έχει φορτωθεί στον πυρήνα, πρέπει να χρησιμοποιήσετε την επιλογή --replace:

 echo "/tmp/ls { /tmp/ls rm, }" | ./apparmor_parser --replace

Το --replace μπορεί να χρησιμοποιηθεί ακόμη και αν κανένα προφίλ με το όνομα αυτό δεν υπάρχει.

Ανατομία ενός προφίλ

Τα προφίλ του AppArmor είναι μια απλή declaritive γλώσσα. Περιγράφονται πλήρως στην apparmor.d (5) manpage. Τα προφίλ αποθηκεύονται κατά σύμβαση στο /etc/apparmor.d/. Το πρόγραμμα ανάλυσης του AppArmor υποστηρίζει έναν απλό cpp-style #include μηχανισμό που επιτρέπει την ανταλλαγή κομματιών της πολιτικής.

Ένα απλό προφίλ του μοιάζει με αυτό:

/tmp/ls flags=(complain) {
 # executable needs 'r' and mmap PROT_EXEC 'm'
 /tmp/ls rm,
 /lib/ld-2.5.so rmix,
 /etc/ld.so.cache rm,
 /lib/lib*.so* rm,

 /dev/pts/*    w,

 /proc/meminfo r,
 /var/run/nscd/socket w,
 /var/run/nscd/passwd r,
 /var/run/nscd/group  r,

 /tmp/ r,
}

Το πρώτο "/ tmp / ls" είναι το όνομα του προφίλ. Αυτό το προφίλ θα χρησιμοποιείται αυτόματα κάθε φορά που μια ανεμπόδιστη διαδικασία εκτελεί το /tmp/ls.

Τα "flags=(complain)" υποχρεώνουν το module του AppArmor να επιτρέπει όλες τις λειτουργίες και την καταγραφή γεγονότων που θα είχαν αρνηθεί, εαν το προφίλ είχε φορτωθεί κατα εξαναγκασμό.

Τα μεμονωμένα προφίλ ορίζονται σε λειτουργία complain ή enforcement. Αυτό βοηθά τους χρήστες να αναπτύξουν σταδιακά AppArmor σε περιβάλλοντα παραγωγής. Για να τοποθετήσετε ένα προφίλ σε λειτουργία complain, προσθέστε το 'flags=(complain)', όπως φαίνεται πιο πάνω, επαναφορτώστε το προφίλ με το apparmor_parser --replace(ή την επιλογή επανακκίνησης του initscript). Για να τοποθετήσετε όλα τα προφίλ σε λειτουργία complain, μπορείτε επίσης να χρησιμοποιήσετε το /sys/kernel/security/apparmor/control/complain αρχείο, όπως περιγράφεται παραπάνω.

Η κατανομή AppArmor περιλαμβάνει δύο μικρά εργαλεία, το aa-enforce και το aa-complain, που θα θέσουν τα προφίλ σε λειτουργία enforce ή complain:

 # enforce firefox
 Setting /usr/lib/firefox/firefox.sh to enforce mode.


Μέσα στο σώμα του προφίλ είναι ένας οποιοσδήποτε αριθμός κανόνων. Οι κανόνες χρησιμοποιούν μια shell-inspired globbing σύνταξη:

 ?         - any single character, except /
 *         - any number of characters excepting /
 **        - any number of characters including /
 [abc]     - one of a, b, or c
 [a-c]     - one of a, b, or c
 {ab,cd}   - alternation -- 'ab' or 'cd'

Οι κανόνες που τελειώνουν με / θα ταιριάζουν μόνο σε καταλόγους. Οι κανόνες τελειώνει με ? ή * δεν θα ταιριάζουν σε καταλόγους. Οι κανόνες που λήγουν σε ** θα ταιριάζουν σε καταλόγους. Μερικά παραδείγματα:

 /tmp/*   - all files directly in /tmp
 /tmp/*/  - all directories directly in /tmp
 /tmp/**  - all files and directories underneath /tmp
 /tmp/**/ - all directories underneath /tmp

Κανένα από αυτά θα ταιριάζει με το /tmp/.

Κάθε κανόνας ορίζει επίσης τα δικαιώματα:

      r    - read
      w    - write
      ux   - unconstrained execute
      Ux   - unconstrained execute -- scrub the environment
      px   - discrete profile execute
      Px   - discrete profile execute -- scrub the environment
      ix   - inherit execute
      m    - allow PROT_EXEC with mmap(2) calls
      l    - link

Το AppArmor δεν απαιτεί την πρόσβαση εκτέλεσης για να καταστεί δυνατό το directory traversal.

Το AppArmor δεν απαιτεί την «w» πρόσβαση σε έναν κατάλογο για να δημιουργήσετε ή να μετονομάσετε τα αρχεία μέσα στον κατάλογο. Αντ 'αυτού, η άδεια «w» απαιτείται για συγκεκριμένα αρχεία, καταλόγους, pipes, κλπ., όταν μια περιορισμένη διαδικασία επιχειρεί να δημιουργήθει ή να μετονομάστει.

To AppArmor απαιτεί την πρόσβαση «r» σε έναν κατάλογο να καλέσει μια περιορισμένη διαδικασία το getdents().

Η πρόσβαση εκτέλεσης απαιτεί έναν τροποποιητή: το «P» ή «p» αναθέτει το AppArmor τη μετάβαση σε ένα διαφορετικό προφίλ, όταν μια διεργασία εκτελεί το exec() με το αποκαλούμενο πρόγραμμα. Το «U» ή «u» αναθέτει το AppArmor να μην περιορίσει τη διαδικασία, όταν αυτό εκτελεί το exec() με το αποκαλούμενο πρόγραμμα. Το «i» αναθέτει το AppArmor να διατηρήσει το τρέχον προφίλ, ακόμη και αν υπάρχει ένα προφίλ για το αποκαλούμενο πρόγραμμα.

Οι λειτουργίες «Px» και «Ux» θα χρησιμοποιήσουν τη μη ασφαλή εγκατάσταση του πυρήνα exec για την ανάθεση του glibc για τον καθαρισμό του περιβάλλοντος. (Τα 'Px', 'px', 'Ux', 'ux', αλλάζουν τα προνόμια που διαθέτει η διαδικασία, περισσότερο σαν τα setuid ή setgid. Τα προνόμια που μπορεί να είναι διαφορετικά από την καλούσα διεργασία, είτε περισσότερο ή λιγότερο περιοριστικά. Ο καθαρισμός του περιβάλλοντος βοηθά στην προστασία κατά π.χ, της κατάχρησης LD_PRELOAD.)

Το «m» είναι απαραίτητο για τις βιβλιοθήκες και εκτελέσιμα που πρέπει να χαρτογραφηθούν ως PROT_EXEC. Αυτό βοηθά επίσης στην πρόληψη π.χ. της κατάχρησης LD_PRELOAD όταν το «Px» δεν μπορεί να χρησιμοποιηθεί.

Για να δημιουργήσετε ένα hardlink, το προφίλ χρειάζεται το «l» για την πρόσβαση στο όνομα του νέου συνδέσμου. Επίσης, τα δικαιώματα για τη νέα σύνδεση πρέπει να είναι ένα υποσύνολο των δικαιωμάτων του στόχου (με εξαίρεση το «L» το ίδιο). Μερικά παραδείγματα:

 /foo lr,
 /bar r,    link("bar", "foo") will succeed
 
 /foo l,
 /bar r,    link("bar", "foo") will succeed, empty rights are subset of 'r'
 
 /foo r,
 /foo w,
 /foo l,
 /bar rw,   link("bar", "foo") will succeed, 'rw' on both

 /fo* r,
 /f*o w,
 /foo l,
 /bar r,   link("bar", "foo") will fail -- /foo has rw, /bar only r

Κάθε σύνδεσμος που περιλαμβάνει την εκτέλεση τροποποιητών (PpUui) σχετικά με το νέο όνομα του συνδέσμου πρέπει να ταιριάζει ακριβώς με τα προνόμια για το στόχο του συνδέσμου. (Η παροχή άδειας για σύνδεση με τα προγράμματα δεν είναι μια κοινή ανάγκη.)

To AppArmor μεσολαβεί επίσης κατά τη χρήση των POSIX 1003.1e δυνατότητων σχεδίου. Οι δυνατότητες που μία διεργασία επιτρέπεται να χρησιμοποιήσει, απλά παρατίθενται στο προφίλ ως "capability <lowercase name from capabilities(7) with CAP_ stripped off" - π.χ., "capability sys_admin," or "capability audit_control,":

# vim:syntax=apparmor
# Last Modified: Wed Mar 21 13:27:16 2007
#include <tunables/global>

/sbin/lspci {
 #include <abstractions/base>
 #include <abstractions/consoles>
 
 capability sys_admin,
 
 /sbin/lspci mr, 
 /sys/bus/pci/ r,
 /sys/bus/pci/devices/ r,
 /sys/devices/** r,
 /usr/share/pci.ids r,
} 

Αυτό το προφίλ χρησιμοποιεί προκαθορισμένα περιλαμβανόμενα αρχεία που αποτελούν μέρος του πακέτου apparmor-profiles.

Logging

AppArmor uses the kernel standard audit facility to report policy violations. When a profile is in complain mode, the log messages look like this:

 type=APPARMOR msg=audit(1174506429.573:1789): PERMITTING r access to
 /home/sarnold/ (ls(16504) profile /tmp/ls active /tmp/ls)
      

When a profile is in enforcement mode, the log messages look like this:

 type=APPARMOR msg=audit(1174508205.298:1791): REJECTING r access to
 /bin/ (ls(16552) profile /tmp/ls active /tmp/ls)
      

These log messages are sent to the kernel auditing facility; if auditd is not running, the kernel will forward these messages to printk for collection by klogd. Auditd must be configured with --with-apparmor to enable the #defines to translate AppArmor's message integers to strings.

AppArmor also logs some important events in the process lifecycle, such as when processes in learning mode fork and change domain via exec. These other events, while not strictly related to permissions requested by the process, help the 'genprof' profile generation tool reconstruct when specific accesses are required by processes -- this allows the tool to make more relevant and meaningful policy suggestions.


Χειροκίνητη δημιουργία προφίλ

Ενώ η πλειοψηφία των χρηστών μας, αναμένεται να δημιουργήσει προφίλ με τη βοήθεια των εργαλείων μας, είναι δυνατό να γραφτεί η πολιτική με το χέρι. Το τελευταίο αυτό τμήμα δίνει ένα πολύ γρήγορο walktrough δημιουργώντας ένα απλό προφίλ για τον Firefox.

Επειδή ο πυρήνας επιλύει τα symlinks για τον «τελικό προορισμό» τους πριν από την υποβολή ζητμάτων πολιτικής στο AppArmor, θα πρέπει πρώτα να δούμε αν το /usr/bin/firefox είναι ένα symlink ή το σενάριο κελύφους που ξεκινά τον firefox. Στο σύστημά μας, αυτό είναι ένα symlink:

 # ls -l /usr/bin/firefox
 lrwxrwxrwx 1 root root 25 Mar 21 13:36 /usr/bin/firefox -> ../lib/firefox/firefox.sh

Γι 'αυτό και θα ξεκινήσουμε ένα προφίλ για το /usr/lib/firefo/firefox.sh. Αυτό το script κέλυφους θα εκτελέσει το firefox-bin, όπως θα δούμε αργότερα. Όταν το κάνει, θα πούμε το AppArmor να κληρονομήσει αυτό το προφίλ. Έτσι, το firefox-bin θα εκτέλεστεί βάσει του προφίλ /usr/lib/firefox/firefox.sh.

Για να ξεκινήσετε, μπορούμε να κάνουμε κάποιες υποθέσεις σχετικά με τα προνόμια που ο Firefox θα χρειαστεί (και τα δύο ως ένα shell script και ως μια αρκετά σύνθετη εφαρμογή GUI):

# cat /etc/apparmor.d/usr.lib.firefox.firefox.sh
/usr/lib/firefox/firefox.sh flags=(complain) {
 /usr/lib/firefox/firefox.sh r,
 /bin/bash rmix,
 /lib/ld-2.5.so rmix,
 /etc/ld.so.cache rm,
 /lib/lib*.so* rm,
 /usr/lib/lib*.so* rm,
}
# apparmor_parser --reload < /etc/apparmor.d/usr.lib.firefox.firefox.sh
Replacement succeeded for "/usr/lib/firefox/firefox.sh".

Πριν από την έναρξη του Firefox, ξεκινήστε ένα tail-f /var/log/audit/audit.log (ή/var/log/messages, ή όπου τα μηνύματα του πυρήνα αποστέλλονται).

Σε ένα άλλο τερματικό, ξεκινήστε τον Firefox. που θα δείξει μερικές εκατοντάδες κανόνες ΑΔΕΙΑΣ:

 type=APPARMOR msg=audit(1174512269.026:1804): PERMITTING rw access to
   /dev/tty (firefox(16950) profile /usr/lib/firefox/firefox.sh active
   /usr/lib/firefox/firefox.sh)

 type=APPARMOR msg=audit(1174512269.026:1805): PERMITTING r access
   to /usr/share/locale/locale.alias (firefox(16950) profile
   /usr/lib/firefox/firefox.sh active /usr/lib/firefox/firefox.sh)

 type=APPARMOR msg=audit(1174512269.026:1806): PERMITTING r access to
   /usr/lib/locale/en_US.utf8/LC_IDENTIFICATION (firefox(16950) profile
   /usr/lib/firefox/firefox.sh active /usr/lib/firefox/firefox.sh)

και ούτω καθεξής.

Επειδή θέλουμε αυτό το προφίλ να είναι αρκετά απλό, θα είμαστε αρκετά ανεκτικοί. Προσθέσετε μερικούς ακόμα κανόνες για το προφίλ και την επαναφόρτωση:

 /dev/tty rw,
 /usr/share/locale/** r,
 /usr/lib/locale/** r,

Τώρα, εκτελέστε ξανά το firefox. (Δεν υπάρχει καμία ανάγκη να χειριστεί τις καταχωρήσεις _all_ log ταυτόχρονα. Σε complain mode, το AppArmor θα αναφέρει μόνο προσβάσεις που δεν είναι στο προφίλ. Αυτό το καθιστά αρκετά εύκολο να προσθέσετε μερικούς κανόνες και την εκ νέου εκτέλεση της εφαρμογής για να καθορίσει τι προνόμια εξακολουθούν να είναι αναγκαία.)

Με την επανεκτέλεση παίρνουμε λίγα περισσότερα μηνύματα:

 type=APPARMOR msg=audit(1174512791.236:5356): PERMITTING r access
   to /usr/lib/gconv/gconv-modules.cache (firefox(17031) profile
   /usr/lib/firefox/firefox.sh active /usr/lib/firefox/firefox.sh)

 type=APPARMOR msg=audit(1174512791.236:5357): PERMITTING r access to
   /proc/meminfo (firefox(17031) profile /usr/lib/firefox/firefox.sh
   active /usr/lib/firefox/firefox.sh)

 type=APPARMOR msg=audit(1174512791.240:5358): PERMITTING x access to
   /bin/basename (firefox(17032) profile /usr/lib/firefox/firefox.sh
   active /usr/lib/firefox/firefox.sh)

 type=APPARMOR msg=audit(1174512791.240:5359): LOGPROF-HINT
   changing_profile pid=17032

 type=APPARMOR msg=audit(1174512791.240:5360): PERMITTING r access to
   /bin/basename (firefox(17032) profile null-complain-profile active
   null-complain-profile)

 ...

  type=APPARMOR msg=audit(1174512791.240:5364): PERMITTING mr access to
    /bin/basename (basename(17032) profile null-complain-profile active
    null-complain-profile)


Έτσι τώρα, προσθέτουμε μερικούς ακόμα κανόνες:

 /usr/lib/gconv/** r,
 /proc/meminfo r, 
 /bin/basename rmix,

Έχουμε επιλέξει το «rmix» για το /bin/basename -- όπως και τα περισσότερα μικρά εργαλεία κέλυφους, το basename δεν θα πρέπει να έχει ένα προφίλ για τον εαυτό του. Δεν υπάρχει κανένα λάθος με basename δίνοντας του ένα προφίλ, αλλά η αξία ενός τέτοιου προφίλ θα είναι πολύ περιορισμένη -- το προφίλ θα πρέπει να έχει πρόσβαση ανάγνωσης σε ολόκληρο το σύστημα αρχείων για να λειτουργούν αξιόπιστα τα shell scripts. Όταν το basename κληρονομεί απλώς από ένα άλλο προφίλ, τότε δεν έχει τίποτα περισσότερο και τίποτα λιγότερα προνόμια από την κλήση του προγράμματος -- που είναι συχνά ένα απλό tradeoff.

Ο φορτωτής θα χρειαστεί το «r» και «m» για την πρόσβαση της εκτέλεσης του basename, και να χρησιμοποιούμε το «ix», για να καθορίσουμε τη μετάβαση τομέα. Τα μητρώα του πηρύνα μόνο ανέφεραν την πρόσβαση των «r», «m» και «x». Πρέπει να κάνουμε μια απόφαση μεταξύ των «P», «i», και προκριματικά «u» για το «x» τον εαυτό μας. (Και πάλι, τα συνήθη εργαλεία χρήστης θα ζητούν από τους χρήστες για την απόφαση αυτή και θα δώσουν τις συνέπειες των αποφάσεων - ανατρέξτε στην τεκμηρίωση της διανομής σας για λεπτομέρειες σχετικά με τα εργαλεία του χρήστη.)

Συνεχίζουμε με αυτό τον τρόπο, επαναληπτικά με την προσθήκη/αλλαγή των κανόνων όπως απαιτούνται από τα αρχεία καταγραφής. Μερικές από τις κααγραφές αναφέρουν αλλαγές των ιδιοτήτων, όπως:

 type=APPARMOR msg=audit(1174519157.851:10357): PERMITTING
   attribute (mode,ctime,) change to /home/sarnold/.gnome2_private/
   (firefox-bin(17338) profile /usr/lib/firefox/firefox.sh active
   /usr/lib/firefox/firefox.sh)
 

Αυτά πρέπει να εκπροσωπούνται στο προφίλ με μια απλή πρόσβαση «w».

 /home/*/.gnome2_private/ w,

Μετά από εννέα επαναλήψεις, το προφίλ του μοιάζει με αυτό -- έχουνε εισαχθεί κενές γραμμές ανάμεσα σε κάθε επανάληψη:


 /usr/lib/firefox/firefox.sh flags=(complain) {
   /usr/lib/firefox/firefox.sh r,
   /bin/bash rmix,
   /lib/ld-2.5.so rmix,
   /etc/ld.so.cache rm,
   /lib/lib*.so* rm,
   /usr/lib/lib*.so* rm,
 
   /dev/tty rw,
   /usr/share/locale/** r,
   /usr/lib/locale/** r,
 
   /usr/lib/gconv/** r,
   /proc/meminfo r,
   /bin/basename rmix,
 
   /usr/bin/file rmix,
   /etc/magic r,
   /usr/share/misc/magic.mgc r, 
   /bin/gawk rmix,
   /usr/lib/firefox/firefox-bin rmix,
 
   /usr/lib/firefox/lib*so rm,
   /opt/gnome/lib/lib*so* rm,
   /usr/share/X11/locale/* r,
   /var/run/nscd/socket w,
   /var/run/nscd/passwd r,
 
   /usr/share/X11/locale/** r,
   /home/*/.Xauthority r,
   /usr/lib/gconv/*so m,
   /home/*/.mozilla/** rw,
   /etc/resolv.conf r,
   /usr/lib/firefox/**.so rm,
   /usr/lib/firefox/** r,
 
   /etc/opt/gnome/** r,
   /var/run/dbus/system_bus_socket w,
   /etc/localtime r,
   /opt/gnome/lib/**.so rm,
   /var/cache/libx11/compose/* r,
   /tmp/orbit-*/ w,
   /dev/urandom r,
   /tmp/ r,
   /dev/null rw,
   /opt/gnome/lib/GConf/2/gconfd-2 rmix,
 
   /dev/log w,
   /tmp/orbit-*/* w,
   /tmp/gconfd-*/ r,
   /tmp/gconfd-*/** rwl,
   /home/*/.gconf/ r,
   /home/*/.gconf/* rw,
   /etc/fonts/** r,
   /var/cache/fontconfig/* r,
   /home/*/.fontconfig/** r,
   /usr/share/ghostscript/fonts/** r,
   /etc/passwd r,
   /var/tmp/ r,
   /bin/netstat rmix,

   /home/*/.gnome2_private/ w,
   /home/*/.gconfd/* rw,
   /proc/net/ r,
   /proc/net/* r,
   /usr/share/fonts/** r,
   /usr/lib/browser-plugins/ r,
   /usr/lib/browser-plugins/** rm,
 }

Η ταξινόμηση των καταχωρήσεων στο προφίλ μπορεί να βοηθήσει περιοχές που δείχνουν ότι μπορεί να καταρρεύσουν με ακόμα πιο γενικούς κανόνες:

 /usr/lib/firefox/firefox.sh flags=(complain) {
   /bin/basename rmix,
   /bin/bash rmix,
   /bin/gawk rmix,
   /bin/netstat rmix,
   /dev/log w,
   /dev/null rw,
   /dev/tty rw,
   /dev/urandom r,
   /etc/fonts/** r,
   /etc/ld.so.cache rm,
   /etc/localtime r,
   /etc/magic r,
   /etc/opt/gnome/** r,
   /etc/passwd r,
   /etc/resolv.conf r,
   /home/*/.fontconfig/** r,
   /home/*/.gconfd/* rw,
   /home/*/.gconf/ r,
   /home/*/.gconf/* rw,
   /home/*/.gnome2_private/ w,
   /home/*/.mozilla/** rw,
   /home/*/.Xauthority r,
   /lib/ld-2.5.so rmix,
   /lib/lib*.so* rm,
   /opt/gnome/lib/GConf/2/gconfd-2 rmix,
   /opt/gnome/lib/lib*so* rm,
   /opt/gnome/lib/**.so rm,
   /proc/meminfo r,
   /proc/net/ r,
   /proc/net/* r,
   /tmp/gconfd-*/ r,
   /tmp/gconfd-*/** rwl,
   /tmp/orbit-*/ w,
   /tmp/orbit-*/* w,
   /tmp/ r,
   /usr/bin/file rmix,
   /usr/lib/browser-plugins/ r,
   /usr/lib/browser-plugins/** rm,
   /usr/lib/firefox/firefox-bin rmix,
   /usr/lib/firefox/firefox.sh r,
   /usr/lib/firefox/lib*so rm,
   /usr/lib/firefox/** r,
   /usr/lib/firefox/**.so rm,
   /usr/lib/gconv/** r,
   /usr/lib/gconv/*so m,
   /usr/lib/lib*.so* rm,
   /usr/lib/locale/** r,
   /usr/share/fonts/** r,
   /usr/share/ghostscript/fonts/** r,
   /usr/share/locale/** r,
   /usr/share/misc/magic.mgc r,
   /usr/share/X11/locale/* r,
   /usr/share/X11/locale/** r,
   /var/cache/fontconfig/* r,
   /var/cache/libx11/compose/* r,
   /var/run/dbus/system_bus_socket w,
   /var/run/nscd/passwd r,
   /var/run/nscd/socket w,
   /var/tmp/ r,
 }

Μετά την κατάρρευση μερικών κανόνων σε πιο γενικούς και ανοικτούς:

 /usr/lib/firefox/firefox.sh flags=(complain) {
   /bin/basename rmix,
   /bin/bash rmix,
   /bin/gawk rmix,
   /bin/netstat rmix,
   /dev/log w,
   /dev/null rw,
   /dev/tty rw,
   /dev/urandom r,
   /etc/fonts/** r,
   /etc/ld.so.cache rm,
   /etc/localtime r,
   /etc/magic r,
   /etc/opt/gnome/** r,
   /etc/passwd r,
   /etc/resolv.conf r,
   /home/*/.fontconfig/** r,
   /home/*/.gconfd/* rw,
   /home/*/.gconf/ r,
   /home/*/.gconf/* rw,
   /home/*/.gnome2_private/ w,
   /home/*/.mozilla/** rw,
   /home/*/.Xauthority r,
   /lib/ld-2.5.so rmix,
   /lib/lib*.so* rm,
   /opt/gnome/lib/GConf/2/gconfd-2 rmix,
   /opt/gnome/lib/**.so* rm,
   /proc/meminfo r,
   /proc/net/ r,
   /proc/net/* r,
   /tmp/gconfd-*/ r,
   /tmp/gconfd-*/** rwl,
   /tmp/orbit-*/ w,
   /tmp/orbit-*/* w,
   /tmp/ r,
   /usr/bin/file rmix,
   /usr/lib/browser-plugins/ r,
   /usr/lib/browser-plugins/** rm,
   /usr/lib/firefox/firefox-bin rmix,
   /usr/lib/firefox/firefox.sh r,
   /usr/lib/firefox/** r,
   /usr/lib/firefox/**.so rm,
   /usr/lib/gconv/** r,
   /usr/lib/gconv/*so m,
   /usr/lib/lib*.so* rm,
   /usr/lib/locale/** r,
   /usr/share/** r, 
   /var/cache/fontconfig/* r,
   /var/cache/libx11/compose/* r,
   /var/run/dbus/system_bus_socket w,
   /var/run/nscd/passwd r,
   /var/run/nscd/socket w,
   /var/tmp/ r,
 } 
   
   
   

[1] http://savannah.nongnu.org/projects/quilt [2] auditctl(8) option -e; perhaps your distro also supports

   /etc/sysconfig/auditd or similar for persistent configuration

[3]