D.4 AppArmor Profile selbst erstellen I.
Hier schreibe ich alles was Du für die Arbeit mit AA benötigst, selbst wenn Du niemals eigene Profile erstellen willst. Ich habe hier aber so geschrieben, wie wenn Du D.5 bereits installiert hättest und nun zusammen mit mir einiges ausprobieren willst. Quasi, zwei Durchgänge, einmal nur lesen und dann optional mit mir ausprobieren.
Wir erstellen drei Profile zu Lehrzwecken und reden dann über Variablen.
A. Das erste AP
1. Gehe in das Verzeichnis /etc/apparmor.d (als root) und editiere ...
Code: Select all
/etc/apparmor.d # nano usr.bin.wgetCode: Select all
# version 1
abi <kernel>,
profile wget /usr/bin/wget
{
include <local/ONLYNETWORK>
}- Zeile 1: Dies ist nur ein Kommentar weil ein # am Anfang steht. Das ist nur für uns Menschen; AA interessiert sich überhaupt nicht dafür. Das wäre auch ein Kommentar: "# include". Wenn aber das Blank fehlen würde - also so: "#include" - wäre es kein Kommentar mehr, sondern ein echter Befehl wie in Zeile 5. Diese Schreibweise ist aber veraltet und soll nicht mehr verwendet werden (deprecated!). Wir schreiben also alle Includes so wie in Zeile 5.
- Zeile 2: Dies ist nun zwingend notwendig. Ich werde es aber erst im zweiten Teil erklären. Bis dahin nimm es einfach mal als gegeben hin.
- Zeile 3: Hier definieren wir den NAMEN unseres Profiles, gefolgt vom ausführbaren PROGRAMM. Als Name kannst Du zwar alles vergeben was Du willst, solltest aber etwas sinnvolles verwenden, da dieser Name in der "aa-status"-Abfrage erscheint.
Achtung/Fallstrick: Du musst hier den Pfad zum tatsächlichen Binary vergeben und NICHT zu einem Link davon - sonst bewirkt dieses Profil gar nichts ! Verlasse Dich nicht auf die Ausgabe von "which nano", der mir sagte "/usr/bin/nano". Tja, das ist aber nur ein Link auf "/bin/nano" ... (Rate mal wie es mir erging ...)
- Zeile 4: Damit AA weiß was alles zum profile gehört.
- Zeile 5: Wir includen das BP, wie in D.1 beschrieben.
- Zeile 6: Damit AA weiß wo unsere profile-Definitionen endet.
2. Nachdem Du diese Datei gespeichert hast, aktivieren wir das Profil mit
Code: Select all
/etc/apparmor.d # apparmor_parser usr.bin.wgetCode: Select all
~/Downloads $ wget https://blog.fefe.de/Code: Select all
# version 1
abi <kernel>,
profile wget /usr/bin/wget
{
include <local/ONLYNETWORK>
/home/*/.wget-hsts rwk,
}Code: Select all
/etc/apparmor.d # apparmor_parser -r usr.bin.wgetB. Ein zweites AP
Wir wollen nun den "nano" sichern. Dies ist ein Programm welches keine Netzwerk-Verbindung aufbauen soll/darf. Dafür darf er aber alle Dateien lesen und schreiben. Wir inkludieren deshalb das andere BP (siehe D.1) und geben ihm gleich mal sicherheitshalber Lese- und Schreibberechtigung auf alles: Das sieht dann so aus:
Code: Select all
/etc/apparmor.d # nano bin.nano
=>
# version 1
abi <kernel>,
profile nano /bin/nano
{
include <local/ONLYLOCAL>
/{,**} rw,
}OK. Wir wollen weitermachen und deaktivieren dieses Profil jetzt mit
Code: Select all
/etc/apparmor.d # apparmor_parser -R bin.nanoCode: Select all
# man apparmor_parserWir sichern jetzt den "ping". "Wassili, geben Sie mir ein Ping. Aber bitte nur eines." [aus dem Film "Jagd auf Roter Oktober"] Das Profil mit dem wir beginnen ist klar:
Code: Select all
# version 1
abi <kernel>,
profile ping /bin/ping
{
include <local/ONLYNETWORK>
}Code: Select all
/etc/apparmor.d # apparmor_parser -C bin.pingCode: Select all
# man capabilitiesNun wird es Zeit für einen Link zur offiziellen AA-Dokumentation auf gitlab. Zuerst die "kleine" Einführung (diese Seiten benötigen Javascript aktiviert im Browser):
https://gitlab.com/apparmor/apparmor/-/ ... leLanguage
Dann etwas tiefer gehend:
https://gitlab.com/apparmor/apparmor/-/ ... _Reference
Die beiden erreichst Du vom Hauptdokument:
https://gitlab.com/apparmor/apparmor/-/ ... umentation
Zuletzt noch meine Lieblings-Manpage:
Code: Select all
# man apparmor.dhttps://gitlab.com/apparmor/apparmor/-/ ... ng_by_hand
Dort findest Du den Hinweis, dass Du das Ratelimit des Kernellogs auf Null setzen sollst, damit keine AA-Logausgaben vom klog verschluckt werden. Zwei Möglichkeiten dies auf Null zu setzen:
Code: Select all
# echo 0 > /proc/sys/kernel/printk_ratelimit
-or-
# sysctl -w kernel.printk_ratelimit=0Hinweis: Wenn Du ein Profil für ein bereits laufendes Programm aktivierst, gilt dies NICHT für dieses bereits laufende Programm, sonder NUR für NEU gestartete Instanzen dieses Programms. Probiere folgendes aus wenn Du den Privoxy (aus B.1) benutzt:
a) Kopiere das Profil aus D.6 und aktiviere es mit "apparmor_parser usr.sbin.privoxy"
b) Prüfe mit "aa-status"
c) Führe "/etc/init.d/privoxy restart" aus
d) Prüfe wieder mit "aa-status"
Du siehst die Unterschiede - ja.
Variablen in den Profilen
Du hast in den EP gesehen, dass dort Variablen beginnend mit @ genutzt werden. Warum haben wir das nicht ?
AA hat einen klitzekleinen Haken: Du musst Variablen VOR dem "profile" deklarieren. Also genau zwischen "abi" und "profile". Du kannst keine Variablen innderhalb des profiles deklarieren, sondern nur nutzen. Zum Beispiel:
Code: Select all
# version 1
abi <kernel>,
@{MYDATADIRS}=/home/*/ /mnt/ /media/
profile wget /usr/bin/wget
{
[...]Code: Select all
# version 1
abi <kernel>,
include <local/VARIABLES>
profile wget /usr/bin/wget
{
[...]Bevor ich diesen Post beende ein letzter Hinweis um Konfusion zu vermeiden:
WENN Du im Profil etwas einfach nicht erlaubst, dann wird AA jeden Verstoß protokollieren.
WENN Du im Profil etwas mit "deny" ausdrücklich verbietest, dann wird AA diesen Verstoß NICHT protokollieren, sondern "nur" unterbinden.
WENN Du im Profil etwas mit "audit deny" ausdrücklich verbietest, dann wird AA diesen Verstoß WIEDER protokollieren und natürlich auch unterbinden.
Mehr Informationen im zweiten Teil D.11. Schau Dir bis dahin aber einfach mal D.5 bis D.10 an.
.
