AppArmor #2

Előző bejegyzésem folytatásaként tovább kísérleteztem AppArmorral. Azt akartam kideríteni, hogy mi van ha egy meglévő (pl. gyárilag szállított) szabályt úgy akarok kiegészíteni, hogy csak bizonyos mappához ne férjen a folyamat.

AppArmort alapból tiltó (default deny) módon szállítja Ubuntu. Az általáunk "deny" előszóval ellátott szabályok pedig az engedő és tiltó szabályok sorrendjeitől független mindig tiltásra kerülnek. Tehát egy dologban biztosak lehetünk: ha implicit módon tiltunk valamit, azt más szabály nem tudja feloldani.

Tehát a fenti kérdésemre a válasz:

Ha egy bináris hatalmas és bonyolult profiljában be akarom állítani, hogy egy mappához ne férjen, akkor elég a legelső sorba beilleszteni egy tagadó szabályt. Pl. ha azt akarom, hogy a Firefox semmiképp ne férjen a $HOME/.gnupg mappámhoz (a profiljában beállítottaktól függetlenül), akkor ezt adom meg a végén:

deny /home/andras/.gnupg r,

Lehetne user névre glob patternnel is:

deny /home/*/.gnupg r,

Megjegyzés:
- a * minta minden nulla vagy több karakterre illeszkedik, kivéve a / karaktert, vagyis _nem_ rekurzív módon csak 1 mappa szintet tudunk vele célozni
- a ** minta mindenre illeszkedik, vagyis a / karakterre is, tehát teljesen rekurzívan a mappa teljes tartalmát célozhatjuk vele

Az AA nagyon jó hivatalos doksija itt:
http://wiki.apparmor.net/index.php/AppArmor_Core_Policy_Reference

Felvetődött bennem még egy kérdés. Mi van ha egy bináris profiljától függetlenül azt szeretném megadni, hogy egy adott mappából bizonyos mappákon kívül ne férjen hozzá semmihez. Tehát pont a fordítottja az előzőnek. Pl. hogy a Firefox folyamatnak a $HOME/.mozilla és $HOME/.cache és pár egyéb mappán kívül a $HOME-ban semmi máshoz ne legyen olvasási, sem pedig írási engedélye - független a gyári profiljától.

A fenti AA doksiban az alábbit írja:

{*^} - a proposed glob similar to * with an alternation style list of things it is not allowed to match.
eg. /etc/{*^shadow} is the same as allowing everything /etc/* matches except /etc/shadow
eg. /etc/{*^shadow,passwd} is the same as /etc/* - /etc/{shadow,passwd}
eg. /etc/{*^*shadow} is the same as /etc/* - /etc/*shadow
{**^} - a proposed glob similar to ** with an alternation style list of things is is not allowed to match eg. /etc/{**^shadow} is the same as /etc/** matches - /etc/shadow
eg. /etc/{**^shadow,passwd} is the same as /etc/** - /etc/{shadow,passwd}
eg. /etc/{**^*shadow} is the same as /etc/** - /etc/*shadow

Az világos hogy duplán kell tagadnom. De az is látható, hogy egyetlen szabállyal kell leírnom, mivel kizáró szabályt csinálok. Az nem fog működni, hogy leírom hogy ezen kívül mindent tiltok, utána meg még egy szabály, mert mint az előzőkben írtam - amit egyszer tiltunk, az tiltva lesz.

A megoldás az alábbi lenne:

deny /root/{**^.dir1/,.dir1/**,.dir2/,.dir2/**} r,

Sajnos ez a két globbing minta még csak "proposed", vagyis belefejlesztésre ajánlott és egyelőre nem elérhető a jelenlegi verzióban. Ha beemelik ezt a feature-t, akkor onnétól kezdve a meglévő szabályok "megnyírbálása" nagyon egyszerű lesz.

Addig is a Firefox-om profilját pl. valami hasonlóval egészítem ki:


  deny /home/andras/{.bash_history,.bash_profile,.bashrc,.encfs*,...} rw,
  deny /home/andras/{.claws-mail*/,.claws-mail*/**,.config/,.config/**...} rw,
  deny /home/andras/{dir1/,dir1/**,dir2/,dir2/**,...} rw,

Hozzászólások

Jó írás(ok), köszi. Írhatnál több általad használt profilmódosításról is.