AppArmor kasutamine operatsioonisüsteemiga Debian
Sissejuhatus
AppArmor (AA) http://wiki.apparmor.net/index.php/Main_Page on Linux tuuma turvamehhanism, mille abil saab kitsendada käivitatud programmide (protsesside) tegevust. AppArmor kasutab Linux Security Modules raamistikku.
Mõisted
- profiil - ühe protsessi jaoks kirjeldatud komplekt kitsendusi
- capability - man capability (linuxi tuuma üldine omadus)
- DAC - discretionary access control, kasutaja enda äranägemisel juhitud ligipääspiirangud
- MAC - mandatory access control, süsteemi haldaja poolt kehtetatud ligipääsupiirangud
Tööpõhimõte
Tundub, et AppArmor rakendamiseks on siis paras aeg, kui süsteem töötab ja on hästi teada kuidas ta töötab. Vastasel korral on segadus, kas asjad on katki programmide seadistuste tõttu, programmid ise ei tööta korralikult või AppArmor eksitab. AppArmor nimetusest jääb mulje, et rakendusele on lisatud juurde midagi, mis teeb rakenduse enda turvalisemaks; pigem tekitatakse olukord, kus operatsioonisüsteem (ja asjad nö operatsioonisüsteemi taga, failisüsteem, võrk jms) on kaitstud rakendust ärakasutava pahalase ebasoovitavate mõjude eest
| pahalane ----> võrk ----> rakendus ----> | apparmor ----> operatsioonisüsteem ----> failisüsteem, võrk, mälu |
AppArmor laadsele süsteemile võiks olla kolme sorti ootusi
- kitsendab väljast sisse suunal üle võrgu lähtuva ründe mõju - kaitseb (nt veebiserver ei saa ligi failisüsteemi mingitele osadele)
- kitsendab töökoha arvutisse arvuti kasutaja poolt paigaldatud ja käivitatud programmi võimalikku soovimatut mõju - kaitseb (nt Skype ei saa ligi .ssh kataloogi sisule)
- kitsendab arvutisse pahalase poolt paigaldatud ja käivitatud programmi mõju - ei kaitse
Väited
- LSM (Linux Security Modules) on pigem tuumas asuv raamistik, kui sõna otseses mõttes modprobe abil mällu laaditavad moodulid; samamoodi AppArmor asub otse tuumas, mitte pole modprobe abil laaditav
- tundub, et apparmor + lsm kasutamine toimub selliselt, et kas apparmori jaoks on tuuma default CONFIG_DEFAULT_SECURITY_* jt parameetrite väärtused sobivad või tuleb neid seada tuuma bootimisel parameetritega
- AppArmor töötamisega ei kaasne mingit nö apparmor serveri protsessi vms; apparmori kasutamisel lülitatakse tuumas aktiivseks täiendavad kontrollid
- üldiselt võiks AppArmor rakendamist alustada programmidest, mille sisend tuleb ebausaldusväärsetest allikatest (nt syslog (sh lokaalne), üle võrgu) ja mis töötavad suurte privileegidega kasutajatena
- AppArmor töötab tuuma tasemel
- AppArmor ei tee muudatusi failisüsteemi selles mõttes, et ei kasutata failisüsteemi xattr atribuute vms
- AppArmor ei rakenda kasutajatele piiranguid; Apparmor rakendab programmidele piiranguid
- AppArmor kaitse tuleb rakendada programmi kaupa; tavaliselt käitseb Apparmor arvutis teenust pakkuvaid programme (ütleme paarkümmend, st ebatavaline on, et arvutis on kõik sajad programmid AppArmori kontrolli all)
- AppArmori profiili reeglid kehtestuvad ka root kasutaja jaoks (root on vastava profiili kehtestumise kontekstis enam-vähem tavaline kasutaja, nt pole tal ligipääsu tavakasutajate failidele (kui tavakasutaja pole other vms lubanud)
- esmalt rakendatakse nö tavalised kitsendused (failisüsteemi ligipääsud jms) ja seejärel AppArmor kitsendused; kui mingi tegevus ei lahe läbi nö tavaliste (DAC) kitsenduste tõttu, siis AppArmori juurde ei jõutagi
- mitmete programmide jaoks on olemas AppArmor profiilid paketihaldusest (nt mysql, clamav, dovecot); kui pole, siis tuleb nad ise koostada (nt aa-genprof programmi abil)
- reeglina AppArmor ei kaitse rakenduse sees toimuvate pahanduste eest, nt SQL injection
- puudub Secure Boot ja AppArmor integratsioon
- tänu AppArmori kasutamisele tekib kasutajal tõenäoliselt parem ettekujutus mis protsessid süsteemis töötavad ja mis nad teevad
- AppArmor sisselülitamine vähendab jõudlust nö keskmisel juhul mõni protsent
- tundub, et uuemal ajal on suund, et rakendusega pakendatakse kaasa sobiv AA profiil (nt strongswan-charon, unbound)
Linuxi tuumas on üldotstarbeline capability süsteem, mille abil nt saab protsesside anda erinevaid privileege. Nt üks selline capabiliti on dac_override, mis seisneb selles, et root kasutajal on õigus sõita üle enamusest piirangutest, nt saab root töötada kasutajale kuuluvate failidega. Kui root kasutajale ei anna apparmor profiil erilisi privileege, siis root kasutaja on enam-vähem samaväärne tavakasutajaga, mille nimeks on 'root'. St tal ei ole õigust nt teiste kasutajate faile lugeda. Selleks, et root kasutajale kehtestatud apparmor profiili tingimustes see ülesõitmise privileeg tagasi tekiks sobib kasutada profiilis rida 'capability dac_override'. Capability süsteem on üldotstarbeline, ta ei ole LSM komponent, nt üks tema esinemise koht on selles, et uuemal ajal /bin/ping ei ole enam setuid
# ls -ld /bin/ping -rwxr-xr-x 1 root root 44104 Nov 8 2014 /bin/ping # getcap /bin/ping /bin/ping = cap_net_raw+ep
Programmile AppArmori rakendamise töövoog on põhimõtteliselt selline
- valitakse programm välja ja veendutakse, et ta töötab, nt nginx
- apparmoris tekitatakse uus tühi nginx profiil ja see viiakse õppivasse režiimi (nn complain mode)
- käivitatakse nginx protsessid ja lastakse neil teha erinevaid tegevusi (kasutades taustal veebikohta, faile üles laadides jne)
- apparmor kasutab auditd deemonit ja taustal salvetatakse syscall'ide jms operatsioonisüsteemi ressursside kasutamise kohta info faili /var/log/audit/audit.log
- apparmori tarkvara komplekti kuuluva interaktiivse kasutajaliidesega utiliidi abil moodustatakse paarikümnele küsimusele vastates profiil
- asutakse profiili kasutama nn enforced režiimis
Kasulikud lisamaterjalid
- man capabilities
- man apparmor.d
Tarkvara paigaldamine ja seadistamine
Debian v. 9 Stretch
Debian v. 9 Stretch keskkonnas
# apt-get install apparmor apparmor-profiles apparmor-profiles-extra apparmor-utils auditd
tulemusena tekib failisüsteemi
- apparmor - /etc/apparmod.d kataloogi erinevas režiimis olevaid mooduleid (enforced, complain)
- apparmor-utils - hulk aa-* nimelisi utiliite
- apparmor-profiles - /etc/apparmod.d kataloogi erinevas režiimis olevaid mooduleid (enforced, complain)
- /usr/share/doc/apparmor-profiles/extras - hulka erineva kvaliteediga mooduleid, mida saab kopeerides /etc/apparmor.d kataloogi kasutada
kuna Debian tuumas on vaikimisi sisselülitatud
# grep ^CONFIG_DEFAULT_SECURITY_ /boot/config-3.16.0-4-amd64 CONFIG_DEFAULT_SECURITY_DAC=y
tuleb lisada tuumale argumendid
# grep ^GRUB_CMDLINE_LINUX= /etc/default/grub GRUB_CMDLINE_LINUX="apparmor=1 security=apparmor"
uue GRUB seadistuse moodustamiseks öelda
# update-grub
Muudatuste kehtestamiseks teha reboot, seejärel paistab tulemus
# aa-status apparmor module is loaded. 34 profiles are loaded. 1 profiles are in enforce mode. /usr/sbin/mysqld 33 profiles are in complain mode. /usr/lib/dovecot/anvil /usr/lib/dovecot/auth ... /usr/sbin/smbd /usr/sbin/smbldap-useradd /usr/sbin/smbldap-useradd///etc/init.d/nscd /usr/{sbin/traceroute,bin/traceroute.db} klogd ping syslog-ng syslogd 1 processes have profiles defined. 1 processes are in enforce mode. /usr/sbin/mysqld (997) 0 processes are in complain mode. 0 processes are unconfined but have a profile defined.
kus
- mysqld serveri eest on süsteem turvisega kaitstud
Tõenäoliselt on mõttekas lülitada välja mittevajalikud profiilid
# aa-disable /etc/apparmor.d/usr.sbin.smbd .. # aa-disable /etc/apparmor.d/usr.lib.dovecot.* ...
Kõigi profiilide väljalülitamine
# cd /etc/apparmor.d # find . -maxdepth 1 -type f -exec aa-disable {} \;
Lisaks taustal hakkab kogunema faili /var/log/audit/audit.log mõningate sündmuste kohta logi, nt PAM moodulite kaudu. Ju on kuhugi mingid seosed tekkinud. Tundub, et kui auditd pole paigaldatud või deemon ei tööta, siis kasutatakse /var/log/syslog logi kogumisel.
Debian v. 8 Jessie
Debian v. 8 Jessie keskkonnas töötamisel võib olla vajalik aa-genprof käivitamisel näidata logifail
# aa-genprof -f /var/log/audit/audit.log /usr/sbin/nginx
Kui tarkvara paigaldada enne lsm moodulite laadimist, öeldakse
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults Job for apparmor.service failed. See 'systemctl status apparmor.service' and 'journalctl -xn' for details. invoke-rc.d: initscript apparmor, action "start" failed.
Millegipärast Debian v. 8 puhul öeldakse profiili moodustamisel selliseid teateid (kuna nad esinevad ka Debiani käsiraamatus https://debian-handbook.info/browse/stable/sect.apparmor.html siis ilmselt võib neid ignoreerida)
WARN: unknown capability: CAP_chown Profile: /usr/sbin/unbound Capability: chown Severity: unknown [(A)llow] / (D)eny / (I)gnore / Audi(t) / Abo(r)t / (F)inish
Debian v. 7 Wheezy
TODO
Ubuntu v. 16.04
Kuna Ubuntu tuumas on AppArmor vaikimisi sisselülitatud, ei ole vaja tuumale mingeid parameetreid lisada
# grep ^CONFIG_DEFAULT_SECURITY_ /boot/config-3.13.0-110-generic CONFIG_DEFAULT_SECURITY_APPARMOR=y
St Ubuntu puhul lihtsalt piisab apparmori kasutama hakkamisest userspace utiliite abil.
Profiili moodustamine ja juurutamine (aa-genprof)
NB! võib olla esialgu on harjutamiseks sobivam allpool kirjeldatud viisil töötada mõne lihtsama programmi, nt tekstieditor /usr/bin/joe või ftp kliendi apparmordamisega.
Kui tegeldakse reaalselt teenust pakkuva süsteemiga või muul põhjusel käib läbi palju liiklust, maksab üle vaadata /etc/auditd/auditd.conf seadistused selleks, et enne õiget aega /var/log/audit/audit.log faili sisu eest ära ei roteerita. Aitab nt rida
# cat /etc/audit/auditd.conf | grep "max_log_file =" max_log_file = 600
Nt NginX veebiserveri ja AppArmori juurutamine toimub selliselt, eeldusel, et veebiserver on juba olemas ja töötab
- lõpetada veebiserveri protsessid
# systemctl stop nginx
- käivitada aa-genprof nginx, ta jääb tööle interaktiivselt (edasi töötada teises aknas), nb! see ei käivita nginx protsesse; taustal moodutatakse automaatselt nö profiili põhi ja lülitatakse tuumas käima complain režiimis
# cd /etc/apparmor.d # aa-genprof /usr/sbin/nginx Writing updated profile for /usr/sbin/nginx. Setting /usr/sbin/unbound to complain mode. Before you begin, you may wish to check if a profile already exists for the application you wish to confine. See the following wiki page for more information: http://wiki.apparmor.net/index.php/Profiles Please start the application to be profiled in another window and exercise its functionality now. Once completed, select the "Scan" option below in order to scan the system logs for AppArmor events. For each AppArmor event, you will be given the opportunity to choose whether the access should be allowed or denied. Profiling: /usr/sbin/nginx [(S)can system log for AppArmor events] / (F)inish ...
- käivitada teises aknas veebiserveri protsessid
# systemctl start nginx
- lasta töötada sõltuvalt veebikoha iseloomust 5 min kuni mõni päev
- jälgida logi, /var/log/audit/audit.log, sinna on oodada taolisi sissekandeid (kõik sissekanded on ALLOWED)
Mar 18 19:29:32 nginx kernel: [ 439.918661] audit: type=1400 audit(1489858172.468:37): apparmor="ALLOWED" operation="capable" profile="/usr/sbin/nginx" pid=1455 comm="nginx" capability=1 capname="dac_override" Mar 18 19:29:32 nginx kernel: [ 439.925364] audit: type=1400 audit(1489858172.476:38): apparmor="ALLOWED" operation="open" profile="/usr/sbin/nginx" name="/var/log/nginx/error.log" pid=1455 comm="nginx" requested_mask="ac" denied_mask="ac" fsuid=0 ouid=33 Mar 18 19:29:32 nginx kernel: [ 439.931158] audit: type=1400 audit(1489858172.480:39): apparmor="ALLOWED" operation="open" profile="/usr/sbin/nginx" name="/etc/ssl/openssl.cnf" pid=1455 comm="nginx" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:29:32 nginx kernel: [ 439.935764] audit: type=1400 audit(1489858172.488:40): apparmor="ALLOWED" operation="open" profile="/usr/sbin/nginx" name="/etc/nginx/nginx.conf" pid=1455 comm="nginx" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:29:32 nginx kernel: [ 439.940264] audit: type=1400 audit(1489858172.492:41): apparmor="ALLOWED" operation="open" profile="/usr/sbin/nginx" name="/etc/nsswitch.conf" pid=1455 comm="nginx" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:29:32 nginx kernel: [ 439.944966] audit: type=1400 audit(1489858172.496:42): apparmor="ALLOWED" operation="open" profile="/usr/sbin/nginx" name="/etc/passwd" pid=1455 comm="nginx" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:29:32 nginx kernel: [ 439.949305] audit: type=1400 audit(1489858172.500:43): apparmor="ALLOWED" operation="open" profile="/usr/sbin/nginx" name="/etc/group" pid=1455 comm="nginx" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 ...
- öelda aa-genprof aknas 'S(can)' ja hakata vastama mõttega küsimustele, https://debian-handbook.info/browse/stable/sect.apparmor.html ja https://doc.opensuse.org/documentation/leap/security/html/book.security/part.apparmor.html peal on väga head kommenteeritud näited
- konsooli aknas tuleb seejärel töötada nö vaese-mehe-interaktiivses liideses kus saab valida erinevate valikute vahel, valikuga antud sisu korrigeerida (nt Globbing osas) jms
- seejärel salvestada uus profiil 'S(ave)' (peale salvestamist on profiil complain režiimis)
- lõpuks valida 'F(inish)' (peale finish on profiil enforced režiimis)
- tulemusana tekib fail /etc/apparmor.d/usr.sbin.nginx, nt
# cat /etc/apparmor.d/usr.sbin.nginx # Last Modified: Sat Mar 25 19:51:41 2017 #include <tunables/global> /usr/sbin/nginx { #include <abstractions/base> #include <abstractions/nameservice> #include <abstractions/openssl> capability dac_override, capability net_admin, capability setgid, capability setuid, /etc/letsencrypt/archive/auul.pri.ee/fullchain3.pem r, /etc/letsencrypt/archive/auul.pri.ee/privkey3.pem r, /etc/letsencrypt/archive/moraal.ee/fullchain3.pem r, /etc/letsencrypt/archive/moraal.ee/privkey3.pem r, /etc/nginx/conf.d/ r, /etc/nginx/mime.types r, /etc/nginx/modules-enabled/ r, /etc/nginx/nginx.conf r, /etc/nginx/serdid/dhparam.pem r, /etc/nginx/sites-available/* r, /etc/nginx/sites-enabled/ r, /lib/x86_64-linux-gnu/ld-*.so mr, /run/nginx.pid rw, /usr/lib/nginx/modules/* mr, /usr/sbin/nginx mr, /usr/share/nginx/modules-available/* r, /var/lib/nginx/proxy/** rw, /var/lib/nginx/body/** rw, /var/log/nginx/access-80.log w, /var/log/nginx/access-auul.pri.ee-443.log w, /var/log/nginx/access-moraal.ee-443.log w, /var/log/nginx/error.log w, }
kus
- # märgiga algavad kommentaarid, erandiks on #include abil teise faili sisu kasutamine
- vaikimisi profiil ei luba midagi
- mida ei lubata, seda vaikimisi logitakse
- profiilis kirjeldatud asju lubatakse ja sellisel viisil nagu kirjas
- kui ei soovita logida seda mida ei lubata tuleb esitada see ilmutataud kujul keelates, nt 'deny /var/tmp/kata rw,'
- reeglid ei loeta mitte järjekorras, aga kehtestatakse kõige täpsem
- /var/lib/nginx/proxy/** - kõik sellest kataloogist allapoole jääv (failid, alamakataloogid; alamkataloogide sisu jne)
- /var/lib/nginx/proxy/ - täpselt üks kataloog
- r - lugemine
- w - kirjutamine
- mr - mällu lugemine (reeglina kasutatakse teekide jms juures)
- capability - man capabilities mõttes mingi privileeg (nt setuid ja setgid lubavad root kasutajal muutuda tavakasutajaks)
Peale aa-genpro töö lõpetamist uus profiil on lülitatud käima enforced režiims, veel tuleb rakenduse protsessid stop-startida, et NginX jaoks profiil toimiks
# systemctl restart nginx
Tulemust saab kontrollida
# aa-status apparmor module is loaded. 6 profiles are loaded. 1 profiles are in enforce mode. /usr/sbin/nginx .. 2 processes are in enforce mode. /usr/sbin/nginx (1863) /usr/sbin/nginx (1864) ...
Edasi on tõenäoliselt oodata logisse taolisi sissekandeid, peab sõltuvalt oludest hindama, kas nii ongi hea või tuleks profiili kohendada, nt kui oleks jäänud välja /var/lib/nginx/proxy kataloog
# grep "DENIED" /var/log/audit/audit.log Mar 18 19:38:42 nginx kernel: [ 989.863796] audit: type=1400 audit(1489858722.416:399): apparmor="DENIED" operation="mknod" profile="/usr/sbin/nginx" name="/var/lib/nginx/proxy/3/00/0000000003" pid=1584 comm="nginx" requested_mask="c" denied_mask="c" fsuid=33 ouid=33 Mar 18 19:38:44 nginx kernel: [ 991.785381] audit: type=1400 audit(1489858724.336:400): apparmor="DENIED" operation="mknod" profile="/usr/sbin/nginx" name="/var/lib/nginx/proxy/4/00/0000000004" pid=1584 comm="nginx" requested_mask="c" denied_mask="c" fsuid=33 ouid=33 Mar 18 19:38:47 nginx kernel: [ 995.158533] audit: type=1400 audit(1489858727.708:401): apparmor="DENIED" operation="mknod" profile="/usr/sbin/nginx" name="/var/lib/nginx/proxy/5/00/0000000005" pid=1584 comm="nginx" requested_mask="c" denied_mask="c" fsuid=33 ouid=33 Mar 18 19:42:22 nginx kernel: [ 1209.473232] audit: type=1400 audit(1489858942.024:438): apparmor="DENIED" operation="open" profile="/usr/sbin/nginx" name="/var/www/html/index.html" pid=1864 comm="nginx" requested_mask="r" denied_mask="r" fsuid=33 ouid=0 ... Mar 18 20:13:19 nginx kernel: [ 3067.009114] audit: type=1400 audit(1489860799.561:451): apparmor="DENIED" operation="mknod" profile="/usr/sbin/nginx" name="/var/lib/nginx/body/0000000009" pid=1864 comm="nginx" requested_mask="c" denied_mask="c" fsuid=33 ouid=33
Märkused
- kui /var/log/audit/audit.log faili on kogunenud varasemate katsete sodi, siis see ei loe, ta kasutab faili sisu alates käivitamise ajast
- aa-genprof otsib logist vaid argumendina näidatud programmiga seotud sissekandeid
AppArmor haldamine
AppArmori kasutamisel tuleb jälgida kahte momenti
- profiil on tuumas kehtestatud sobivas režiimis (complain või enforced)
- vastava programmi protsessid töötavad kehtestatud profiili tingimustes
seega tuleb sooritada tegevused järjekorras
- esmalt kehtestada profiil tuumas
- stop ja startida protsessid
Kui AppArmori seadistusfailides teha käsitsi muudatusi, siis kõige otsekohesemalt saab need kehtestada tuumas öeldes
# systemctl reload apparmor
või
# systemctl restart apparmor
systemctl olek paistab sedasi
# systemctl status apparmor ● apparmor.service - AppArmor initialization Loaded: loaded (/lib/systemd/system/apparmor.service; enabled; vendor preset: enabled) Active: active (exited) since Sun 2017-03-26 01:33:03 EET; 1h 1min ago Docs: man:apparmor(7) http://wiki.apparmor.net/ Main PID: 317 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 4915) CGroup: /system.slice/apparmor.service
Utiliidid
- aa-status - esitatakse ülevaade olemasolevatest profiilidest ja protsessidest ning millistes olekutes nad on
- aa-enforce - profiili lülitamine enforced režiimi (tavaline töötav olek)
- aa-unconfined -
- aa-disable - profiili väljalülitamine (nagu teda polekski)
- aa-complain - profiili lülitamine complain režiimi (nö õppiv olek)
- aa-logprof -
- autrace - strace laadne tulemus
Profiili väljalülitamine
Profiili väljalülitamiseks
# aa-disable usr.sbin.nginx # systemctl reload apparmor
tulemusena tekitatakse symlink kataloogi /etc/apparmor.d/disable ning aa-status väljundis profiili ei esitata, profiili ei kehtestata mingil viisil jne. Sellisest olekust on mugav profiil tagasi tuua kasutusse, nt
# aa-enforce usr.sbin.nginx # systemctl reload apparmor
Kõigi profiilide väljalülitamine
# cd /etc/apparmor.d # find . -maxdepth 1 -type f -exec aa-disable {} \;
Profiili kustutamine
# aa-disable usr.sbin.nginx # rm /etc/apparmor.d/usr.sbin.nginx /etc/apparmor.d/disable/usr.sbin.nginx # systemctl reload apparmor
Profiilis tehtud muudatuste kehtestamine
Peale profiilifailis muudatuste tegemist, kõik profiilid laaditakse uuesti
# systemctl reload apparmor
konkreetne profiil
# apparmor_parser -r /etc/apparmor.d/usr.sbin.nginx
Selleks, et muudatus rakenduse jaoks reaalselt kehtestuks, tuleb ka rakenduse protsessid uuesti käivitada.
apparmor_parser kasutamine
apparmor_parser ei tee muudatusi failisüsteemis, teeb muudatusi tuumas. cache puhastamine
# apparmor_parser --purge-cache
immutable režiim
TODO
Misc
Süsteemis parasjagu töötavad protsessid, millega AppArmor ei tegele üldse (rohkem väjundit näeb lisades --paranoid)
# aa-unconfined 1 /lib/systemd/systemd (/sbin/init) not confined 421 /sbin/rpcbind not confined 433 /sbin/rpc.statd not confined 480 /usr/sbin/sshd not confined 540 /usr/sbin/ntpd not confined 545 /usr/sbin/rsyslogd not confined 686 /usr/sbin/zabbix_agentd not confined 703 /usr/sbin/unbound not confined 721 /usr/sbin/opendmarc not confined 727 /usr/sbin/opendkim not confined 757 /usr/bin/perl (/usr/sbin/spamd -d --pidfile=/var/run/spamassassin.pid --create-prefs --max-children 5 --helper-home-dir) not confined 827 /usr/sbin/sshd (sshd: root@pts/0) not confined 851 /usr/sbin/sshd (sshd: root@pts/1) not confined 2246 /usr/lib/postfix/master not confined
Apparmori kontrolli all olevate protsesside nimekirja esitamine
# ps auxZ | grep -v ^unconf
Profiili genereerimisel võib mingitel hetkedel ilmuda aa-status nimekirja nn null-xx alamprofiile, nt Squid juures
.. /usr/sbin/squid3 /usr/sbin/squid3//null-25 /usr/sbin/squid3//null-25//null-26 /usr/sbin/squid3//null-25//null-27 ...
Nende tähenduseks on, et squid3 käivitab ise protsesse. Tundub, et praktiliselt ei pea nende pärast muretsema, kui profiil on ära koostatud logi alusel korrektselt, siis nad kaovad.
Võrku kuulavate server programmide kasutamine
Järgnevad näited on koostatud erinevate Debian ja Ubuntu operatsioonisüsteemi versioonides tarkvara kasutamise alusel. Üldiselt ei tohiks oluliselt profiil sellest sõltuda.
Samba
TODO
NginX
Testitud: 2017 kevad Debian v. 9 Stretch (testing)
NginX töötamisega kaasnevad nt sellised protsessid, üks kuulub root kasutajale
# ps aux | grep nginx root 26370 0.0 0.5 173808 2720 ? Ss 20:00 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on; www-data 26371 0.0 1.5 173808 7960 ? S 20:00 0:00 nginx: worker process
ja kuulatakse võrku, kusjuures kuulab root kasutajale kuuluv protsess
# netstat -lnpt | grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 26370/nginx: master tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 26370/nginx: master tcp6 0 0 :::80 :::* LISTEN 26370/nginx: master
nt võiks sobida kasutamiseks selline AppArmor profiil
# Last Modified: Sat Mar 25 19:51:41 2017 #include <tunables/global> /usr/sbin/nginx { #include <abstractions/base> #include <abstractions/nameservice> #include <abstractions/openssl> capability dac_override, capability net_admin, capability setgid, capability setuid, /etc/letsencrypt/archive/auul.pri.ee/fullchain3.pem r, /etc/letsencrypt/archive/auul.pri.ee/privkey3.pem r, /etc/letsencrypt/archive/moraal.ee/fullchain3.pem r, /etc/letsencrypt/archive/moraal.ee/privkey3.pem r, /etc/nginx/conf.d/ r, /etc/nginx/mime.types r, /etc/nginx/modules-enabled/ r, /etc/nginx/nginx.conf r, /etc/nginx/serdid/dhparam.pem r, /etc/nginx/sites-available/* r, /etc/nginx/sites-enabled/ r, /lib/x86_64-linux-gnu/ld-*.so mr, /run/nginx.pid rw, /usr/lib/nginx/modules/* mr, /usr/sbin/nginx mr, /usr/share/nginx/modules-available/* r, /var/lib/nginx/proxy/** rw, /var/lib/nginx/body/** rw, /var/log/nginx/access-80.log w, /var/log/nginx/access-auul.pri.ee-443.log w, /var/log/nginx/access-moraal.ee-443.log w, /var/log/nginx/error.log w, }
kus
- TODO
Unbound
Keskkond: Ubuntu v. 16.04
Unbound töötamisega kaasnevad nt sellised protsessid, kõik kuuluvad tavakasutajale
# ps auxf | grep unbound | grep -v grep unbound 34207 3.4 0.7 734976 114888 ? Ssl 23:17 0:18 /usr/sbin/unbound
ja kuulatakse võrku, kusjuures kuulab tavakasutajale kuuluv protsess
# netstat -lnpt | grep unbound tcp 0 0 10.80.103.200:53 0.0.0.0:* LISTEN 34207/unbound tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 34207/unbound tcp 0 0 127.0.0.1:8953 0.0.0.0:* LISTEN 34207/unbound .. tcp6 0 0 ::1:53 :::* LISTEN 34207/unbound tcp6 0 0 ::1:8953 :::* LISTEN 34207/unbound
nt võiks sobida kasutamiseks selline AppArmor profiil
# cat /etc/apparmor.d/usr.sbin.unbound # Last Modified: Fri Apr 14 23:15:26 2017 #include <tunables/global> /usr/sbin/unbound { #include <abstractions/base> #include <abstractions/nameservice> #include <abstractions/openssl> capability chown, capability dac_override, capability net_bind_service, capability setgid, capability setuid, capability sys_resource, /etc/unbound/master/unbound.gamblingzone r, /etc/unbound/master/unbound.sinkzone r, /etc/unbound/named.root r, /etc/unbound/unbound.conf r, /etc/unbound/unbound.conf.d/ r, /etc/unbound/unbound.conf.d/* r, /etc/unbound/unbound_server.key r, /etc/unbound/unbound_server.pem r, /run/unbound.pid rw, /usr/sbin/unbound mr, /var/lib/unbound/* rw, /var/log/unbound/queries.log w, }
NSD
Keskkond: Ubuntu v. 16.04
NSD töötamisega kaasnevad nt sellised protsessid, kõik kuuluvad tavakasutajale
# ps auxf | grep nsd | grep -v grep nsd 12659 0.0 2.9 52556 29812 ? Ss 03:05 0:00 /usr/sbin/nsd -d -c /etc/nsd/nsd.conf nsd 12661 0.0 3.4 59036 34924 ? S 03:05 0:00 \_ /usr/sbin/nsd -d -c /etc/nsd/nsd.conf nsd 12669 0.0 0.2 59504 2936 ? S 03:06 0:00 \_ /usr/sbin/nsd -d -c /etc/nsd/nsd.conf
ja kuulatakse võrku, kusjuures kuulab tavakasutajale kuuluv protsess
# netstat -lnpt | grep nsd tcp 0 0 192.168.10.216:53 0.0.0.0:* LISTEN 12659/nsd tcp 0 0 192.168.10.216:8952 0.0.0.0:* LISTEN 12659/nsd
nt võiks sobida kasutamiseks selline AppArmor profiil
# cat /etc/apparmor.d/usr.sbin.nsd # Last Modified: Sat Apr 15 00:32:16 2017 #include <tunables/global> /usr/sbin/nsd { #include <abstractions/base> #include <abstractions/nameservice> capability chown, capability dac_override, capability net_admin, capability net_bind_service, capability setgid, capability setuid, /etc/nsd/nsd.conf r, /etc/nsd/nsd_server.key r, /etc/nsd/nsd_server.pem r, /etc/nsd/zlf/zonelistfile.list rw, /etc/nsd/zones/* rw, /run/nsd/nsd.pid w, /tmp/** rw, /usr/sbin/nsd mr, /var/lib/nsd/* rw, }
kus
- setgid ja setuid on vajalikud root privileegidest tavakasutajaks liikumise jaoks
strongSwan
TODO
vsftpd
Anonüümse read-only ftp serveri teenuse kasutamiseks sobib nt sellise profiil
# Last Modified: Sat Mar 25 13:14:25 2017 #include <tunables/global> /usr/sbin/vsftpd { #include <abstractions/base> #include <abstractions/nameservice> capability net_bind_service, capability sys_admin, capability sys_chroot, /etc/vsftpd.conf r, /proc/sys/kernel/ngroups_max r, /srv/ftp/ r, /srv/ftp/* r, }
kus
- vsftpd kasutab töötamise ajal oma protsesside chrootimist
Squid v. 3
Squid v. 3 töötamisega kaasnevad nt sellised protsessid, üks protsess kuulub root kasutajale
# ps auxf | grep squid | grep -v grep root 7826 0.0 0.1 79612 5296 ? Ss 14:12 0:00 /usr/sbin/squid3 -YC -f /etc/squid3/squid.conf proxy 7828 0.0 0.6 120348 24680 ? S 14:12 0:00 \_ (squid-1) -YC -f /etc/squid3/squid.conf proxy 7829 0.0 0.0 33624 1808 ? S 14:12 0:00 \_ (logfile-daemon) /var/log/squid3/access.log
kus
- (squid-1) nimeline on tegelikult sama /usr/sbin/squid3
# readlink -f /proc/7828/exe /usr/sbin/squid3 # ls -ld /proc/7828/exe lrwxrwxrwx 1 proxy proxy 0 Mar 25 14:39 /proc/7828/exe -> /usr/sbin/squid3
ja kuulatase võrku, kusjuures kuulab tavakasutajale kuuluv protsess
# netstat -lnpt | grep squid tcp 0 0 127.0.0.1:3128 0.0.0.0:* LISTEN 7828/(squid-1) tcp 0 0 192.168.10.10:3128 0.0.0.0:* LISTEN 7828/(squid-1)
nt võiks sobida kasutamiseks selline AppArmor profiil
# Last Modified: Sat Mar 25 14:01:28 2017 #include <tunables/global> /usr/sbin/squid3 { #include <abstractions/base> #include <abstractions/nameservice> capability net_raw, capability setgid, capability setuid, /etc/squid3/errorpage.css r, /etc/squid3/squid.conf r, /proc/sys/kernel/ngroups_max r, /run/squid3.pid w, /usr/sbin/squid3 mrix, /usr/share/squid-langpack/templates/** r, /var/log/squid3/** rw, /usr/lib/squid3/** ix, /var/spool/squid3/ rw, /var/spool/squid3/** rw, /usr/share/squid3/** r, }
MySQL server
Paistab, et reeglina on MySQL profiil kaasas ja vaikimisi lülitatakse ta enforced režiimi
# vim:syntax=apparmor # Last Modified: Tue Jun 19 17:37:30 2007 #include <tunables/global> /usr/sbin/mysqld { #include <abstractions/base> #include <abstractions/nameservice> #include <abstractions/user-tmp> #include <abstractions/mysql> #include <abstractions/winbind> capability dac_override, capability sys_resource, capability setgid, capability setuid, network tcp, /etc/hosts.allow r, /etc/hosts.deny r, /etc/mysql/** r, /usr/lib/mysql/plugin/ r, /usr/lib/mysql/plugin/*.so* mr, /usr/sbin/mysqld mr, /usr/share/mysql/** r, /var/log/mysql.log rw, /var/log/mysql.err rw, /var/lib/mysql/ r, /var/lib/mysql/** rwk, /var/log/mysql/ r, /var/log/mysql/* rw, /var/run/mysqld/mysqld.pid rw, /var/run/mysqld/mysqld.sock w, /run/mysqld/mysqld.pid rw, /run/mysqld/mysqld.sock w, /sys/devices/system/cpu/ r, # Site-specific additions and overrides. See local/README for details. #include <local/usr.sbin.mysqld> }
PostgreSQL server
Nt võiks sobida kasutamiseks selline AppArmor profiil
# Last Modified: Sun Mar 26 02:04:48 2017 #include <tunables/global> /usr/lib/postgresql/9.6/bin/postgres flags=(attach_disconnected) { #include <abstractions/base> #include <abstractions/nameservice> #include <abstractions/ssl_keys> /dev/shm/ rw, /dev/shm/** rw, /etc/postgresql/9.6/** r, /lib/x86_64-linux-gnu/ld-*.so mr, /proc/*/oom_score_adj w, /run/postgresql/** rw, /usr/lib/postgresql/9.6/bin/** mr, /usr/lib/postgresql/9.6/lib/** mr, /usr/share/postgresql/9.6/timezonesets/** r, /var/lib/postgresql/9.6/** rwl, }
kus
- tundub, et andmefailide kataloogis on l vajalik, vastasel korral on logis
2017-03-26 08:27:03 EEST [4467-1] LOG: could not link file "pg_xlog/0000000100000001000000DA" to "pg_xlog/0000000100000001000000DF": Permission denied
Profiili moodustamiseks sobib öelda
# aa-genprof /usr/lib/postgresql/9.6/bin/postgres
Dovecot proxy
Testitud: 2017 kevad Debian v. 8 Jessie
Dovecot tarkvara eripäraks on paljude erinevate protsesside kasutamine
# ps auxfZ | grep -v ^uncon | grep dovecot /usr/sbin/dovecot root 20297 0.0 0.1 17724 2544 ? Ss 15:17 0:00 /usr/sbin/dovecot -F /usr/lib/dovecot/anvil dovecot 20298 0.0 0.0 9244 1948 ? S 15:17 0:00 \_ dovecot/anvil /usr/lib/dovecot/log root 20299 0.0 0.0 9372 2028 ? S 15:17 0:00 \_ dovecot/log /usr/lib/dovecot/config root 20301 0.0 0.1 18464 3120 ? S 15:17 0:00 \_ dovecot/config /usr/lib/dovecot/auth dovecot 20312 0.0 0.2 50332 4880 ? S 15:17 0:00 \_ dovecot/auth /usr/lib/dovecot/ssl-params root 20313 0.0 0.0 13328 1528 ? S 15:17 0:00 \_ dovecot/ssl-params /usr/sbin/dovecot dovecot 20314 0.0 0.0 9240 1880 ? S 15:17 0:00 \_ dovecot/ipc
võrku kuulab kasutajale root kuuluv protsess
# netstat -lnpt | grep dovecot tcp 0 0 0.0.0.0:993 0.0.0.0:* LISTEN 20297/dovecot tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 20297/dovecot tcp6 0 0 :::993 :::* LISTEN 20297/dovecot tcp6 0 0 :::143 :::* LISTEN 20297/dovecot
Tundub, et vajalikud profiilid on paketis apparmor-profiles olemas, kuigi tõenäoliselt tuleks käivitada tarkvara esmalt complain režiimis, režiimide vahel on mõnus liikuda for kordusega, nt
# # systemctl stop dovecot dovecot.socket # cd /etc/apparmor.d # for i in usr.lib.dove* usr.sbin.dovecot; do aa-enforce $i; done # for i in usr.lib.dove* usr.sbin.dovecot; do aa-disable $i; done # for i in usr.lib.dove* usr.sbin.dovecot; do aa-complain $i; done
ja complain režiimis käivitada aa-logprof
# cp /dev/null /var/log/audit/audit.log # aa-logprof -f /var/log/audit/audit.log
Dovecot server
Sarnaselt Dovecot proxy, aga failis /etc/apparmor.d/tunables/dovecot näidata asjakohane väärtus
@{DOVECOT_MAILSTORE}=/srv/vmail/
Postfix
Paistab, et reeglina on Postfix AA profiilid olemas apparmor-profiles paketis, kopeerida paika
# cp usr.sbin.post* usr.lib.postfix.* usr.bin.procmail usr.sbin.sendmail /etc/apparmor.d
Lülitada enforced režiimi ja siis complain (tundub, et kõige paremini saab viia profiilid complain'i enforced'ist)
# cd /etc/apparmor.d # for i in usr.sbin.post* usr.bin.procmail usr.lib.postfix.* usr.sbin.sendmail ; do aa-enforce $i; done # for i in usr.sbin.post* usr.bin.procmail usr.lib.postfix.* usr.sbin.sendmail ; do aa-complain $i; done
Seejärel tuleb tõenäoliselt korduvalt vaadata audit.log ning öelda
# aa-logprof # systemctl reload apparmor # systemctl restart postfix
ning täiendada profiile. Kui logis vigu enam pole, siis lülitada enforced režiimi
# for i in usr.sbin.post* usr.bin.procmail usr.lib.postfix.* usr.sbin.sendmail ; do aa-enforce $i; done
ClamAV
Tundub, et clamav-daemon ja clamav-freshclam pakettidest tulevad AppArmor profiilid
/etc/apparmor.d/usr.sbin.clamd /etc/apparmor.d/usr.bin.freshclam
ja neid maksab kasutada. Võib olla midagi kohendada nii nagu logi räägib, nt usr.sbin.clamd juures kasutada lisaks rida
/var/tmp/clamd/** rw,
ntpd
Tundub, et apparmor-profiles-extra sisaldab töötavat /usr/sbin/ntpd jaoks töötavat profiili.
haproxy
TODO
Lokaalselt arvutis teenust pakkuvate server programmide kasutamine
rsyslogd
TODO
Klient programmide kasutamine
Klient programmide kitsendamise eesmärkideks on
- programm ei saa ligi ~/.ssh kataloogile
- TODO
Skype
Tundub, et Skype v. 5.0 beta puhul töötab selline profiil (kasutatakse Debian v. 8 Jessie ja XFCE keskkonnast)
# cat /etc/apparmor.d/usr.share.skypeforlinux.skypeforlinux # Last Modified: Sun Mar 19 13:18:15 2017 #include <tunables/global> /usr/share/skypeforlinux/skypeforlinux { #include <abstractions/base> #include <abstractions/lightdm> /home/priit/.config/skypeforlinux/** mrwk, /home/priit/.config/skypeforlinux/ rw, /home/priit/.local/share/mime/mime.cache mr, /home/priit/.pki/nssdb/** krw, /proc/*/oom_score_adj w, /proc/*/status r, /proc/*/task/*/status r, /tmp/** mrwlkix, /var/tmp/** mrwlkix, /home/priit/.Xauthority rw, /home/priit/.config/user-dirs.dirs rw, /home/priit/.config/pulse/ rw, /home/priit/.pulse-cookie rw, /home/priit/.config/pulse/** krw, /proc/driver/nvidia/params rw, /home/priit/.nv/** krw, /home/priit/.config/gtk-*/ rw, /home/priit/.config/gtk-*/** rw, /proc/sys/kernel/yama/ptrace_scope r, /home/priit/.local/share/ rw, /home/priit/.icons/ rw, /home/priit/.local/share/** rw, /home/priit/.icons/** rw, }
kus
- TODO
Tulemusena nt ei saa salvestada Skype faili ~/.ssh kataloogi
type=AVC msg=audit(1489924799.817:186509): apparmor="DENIED" operation="mknod" profile="/usr/share/skypeforlinux/skypeforlinux" name="/home/priit/.ssh/tere1" pid=10479 comm="Chrome_FileThre" requested_mask="c" denied_mask="c" fsuid=1000 ouid=1000
Chromium brauser
TODO
Pidgin
TODO
tcpdump
Tundub, et apparmor-profiles-extra sisaldab /usr/sbin/tcpdump jaoks töötavat profiili.
Debugimine
Üks apparmor mitte-sihipärane kasutusjuht on programmi debugimine, nt mis faile nad tööks kasutavad (sarnaselt kui saab teada strace abil)
- ühes aknas käivitada
# aa-genprof wget
- teises vaadata logi
# tail -f /var/log/audit/audit.log | grep open Mar 18 19:05:53 ubuntu-16-04 kernel: [23055.347809] audit: type=1400 audit(1489856753.875:560820): apparmor="ALLOWED" operation="open" profile="/usr/bin/wget" name="/etc/wgetrc" pid=15812 comm="wget" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:05:53 ubuntu-16-04 kernel: [23055.348931] audit: type=1400 audit(1489856753.879:560821): apparmor="ALLOWED" operation="open" profile="/usr/bin/wget" name="/root/.wget-hsts" pid=15812 comm="wget" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:05:53 ubuntu-16-04 kernel: [23055.349667] audit: type=1400 audit(1489856753.879:560822): apparmor="ALLOWED" operation="open" profile="/usr/bin/wget" name="/etc/nsswitch.conf" pid=15812 comm="wget" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:05:53 ubuntu-16-04 kernel: [23055.349797] audit: type=1400 audit(1489856753.879:560823): apparmor="ALLOWED" operation="open" profile="/usr/bin/wget" name="/etc/host.conf" pid=15812 comm="wget" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:05:53 ubuntu-16-04 kernel: [23055.349891] audit: type=1400 audit(1489856753.879:560824): apparmor="ALLOWED" operation="open" profile="/usr/bin/wget" name="/run/resolvconf/resolv.conf" pid=15812 comm="wget" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:05:53 ubuntu-16-04 kernel: [23055.350131] audit: type=1400 audit(1489856753.879:560825): apparmor="ALLOWED" operation="open" profile="/usr/bin/wget" name="/etc/hosts" pid=15812 comm="wget" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:05:53 ubuntu-16-04 kernel: [23055.350457] audit: type=1400 audit(1489856753.879:560826): apparmor="ALLOWED" operation="open" profile="/usr/bin/wget" name="/run/resolvconf/resolv.conf" pid=15812 comm="wget" requested_mask="r" denied_mask="r" fsuid=0 ouid=0 Mar 18 19:05:53 ubuntu-16-04 kernel: [23055.381221] audit: type=1400 audit(1489856753.911:560843): apparmor="ALLOWED" operation="open" profile="/usr/bin/wget" name="/tmp/README" pid=15812 comm="wget" requested_mask="wc" denied_mask="wc" fsuid=0 ouid=0 Mar 18 19:05:53 ubuntu-16-04 kernel: [23055.382246] audit: type=1400 audit(1489856753.911:560845): apparmor="ALLOWED" operation="open" profile="/usr/bin/wget" name="/root/.wget-hsts" pid=15812 comm="wget" requested_mask="rac" denied_mask="rac" fsuid=0 ouid=0
kusjuures aja loetavamale kujule teisendamiseks sobib nt
# cat /var/log/audit/audit.log | perl -pe 's/(\d+)/localtime($1)/e' | less
- kustutada profiil
# aa-disable user.bin.wget # rm /etc/apparmor.d/usr.bin.wget /etc/apparmor.d/disabled/usr.bin.wget
- apparmoriseeritud protsesside nimekirja esitamine
# ps auxZ | grep -v '^unconfined'
- kellaaja teisendamine
date -d @1489873113.928 Sat Mar 18 23:38:33 EET 2017
auditd
TODO
Apache veebiserveri kasutamine AppArmoriga
- 2017 kevadel ei tööta Debian v. 9 Strech keskkonnas /etc/apparmor.d/apache2 kataloogist seadistuste kasutamine täieliselt (aa-logprof ei oska kasutada)
Tööpõhimõte
Väited
- apparmoris kirjeldatakse profiil + alamprofiilid
- apache kontekstis nimetatakse alamprofiile hat'ideks (ingl. k. müts)
- apache konfis erinevates osades saab viidata hat kasutamisele (virtuaal host, Directory, Location)
- kui http päringule ei leidu sobivat hat'i, siis kasutatakse vaike-hat'i
- apache nö pea-profiil on kõikelubav, kitsendusi rakendatakse alam-profiilidega
Kasutajate http päringutega seotud tegevustele leitakse vastav alam-profiil selliselt
- esmalt tegeleb päringuga HANDLING_UNTRUSTED_INPUT alamprofiil (mis iseenesest on ka hat)
- seejärel leitakse selle virtual hosti, kuhu päring tavalise apache loogika järgi jõuab, konfist AADefaultHatName abil vastav müts
- päringule rakendatakse AADefaultHatName väärtusele vastava mütsi kitsendused
- kui ei leita AADefaultHatName, siis kasutatakse vaikimisi mütsi, DEFAULT_URI (vaikimisi praktiliselt on see väga lubav)
Tarkvara paigaldamine
Tarkvara paigaldamiseks
# apt-get install libapache2-mod-apparmor
tulemusena tekib failisüsteemi
- väljalülitatud olekus profiil usr.sbin.apache2; failis on väike kasutusjuhend
Seadistamine ja ettevalmistamine
Seadistamine toimib kahes osas, AppArmori poolel ja Apache veebiserveri poolel.
- Veebiserveri poolel aktiveerida apparmor moodul
# a2enmod apparmor # service apache2 restart
- Veebiserveri ettevalmistamiseks tuleb VirtualHostide juurde lisada rida direktiiviga AADefaultHatName
<VirtualHost 192.168.1.15:80> AADefaultHatName www.auul.pri.ee ServerName www.auul.pri.ee ...
- Apparmori poolel aktiveerida usr.sbin.apache2 profiil complain režiimis
# aa-complain usr.sbin.apache2
- Lisada virtuaalsete serveritele vastavad mütsid samasse profiili hästi kitsendavatena (nb! põhimõtteliselt tuleks need hat'id panna eraldi failidena kataloogi /etc/apparmor.d/apache2 aga millegipärast 2017 kevadel nii ei toimi)
^www.auul.pri.ee flags=(complain) { #include <abstractions/base> } ^www.moraal.ee flags=(complain) { #include <abstractions/base> } ..
- Kasutada audit.log salvestamise eesmärgil veebirakendusi
# cp /dev/null /var/log/audit/audit.log # systemctl restart apparmor # systemctl restart apache2
- Genereerida profiilid ja mütsid (esmalt võiks teha algsest usr.sbin.apache2 profiilist koopia)
# cp /etc/apparmor.d/usr.sbin/apache2 /var/tmp # aa-logprof
- Näiteks võiks profiili /etc/apparmor.d/usr.sbin.apache2 sisu olla selline
# cat /etc/apparmor.d/usr.sbin.apache2 #include <tunables/global> /usr/sbin/apache2 { #include <abstractions/base> #include <abstractions/nameservice> # Send signals to all hats. signal (send) peer=@{profile_name}//*, capability dac_override, capability kill, capability net_bind_service, capability setgid, capability setuid, capability sys_tty_config, / rw, /** mrwlkix, ^DEFAULT_URI { #include <abstractions/base> #include <abstractions/apache2-common> / rw, /** mrwlkix, } ^HANDLING_UNTRUSTED_INPUT { #include <abstractions/apache2-common> / rw, /** mrwlkix, } ^mx.tls.moraal.ee { #include <abstractions/base> #include <abstractions/nameservice> #include <abstractions/openssl> #include <abstractions/php> /proc/*/attr/current rw, /proc/filesystems r, /srv/www.auul.pri.ee/ r, /srv/www.auul.pri.ee/** rwk, /tmp/* rw, /var/log/apache2/*.log w, /bin/dash rix, /usr/bin/aspell rix, } # #include <apache2.d> # Site-specific additions and overrides. See local/README for details. #include <local/usr.sbin.apache2> }
- Lülitada apparmor apache2 jaoks enforced režiimi
# aa-enforce usr.sbin.apache2 # systemctl restart apparmor # systemctl restart apache2
- Töötav veebiserver paistab välja nii
# aa-status apparmor module is loaded. 11 profiles are loaded. 8 profiles are in enforce mode. /usr/sbin/apache2 /usr/sbin/apache2//DEFAULT_URI /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT /usr/sbin/apache2//www.auul.pri.ee /usr/sbin/apache2//www.idusnoukoda.ee /usr/sbin/apache2//www.moraal.ee /usr/sbin/apache2//www.napp-lm.ee /usr/sbin/tcpdump 3 profiles are in complain mode. /usr/{sbin/traceroute,bin/traceroute.db} klogd ping 8 processes have profiles defined. 8 processes are in enforce mode. /usr/sbin/apache2 (11983) /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (11984) /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (11985) /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (11986) /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (11987) /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (11988) /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (12031) /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (12032) 0 processes are in complain mode. 0 processes are unconfined but have a profile defined.
kus
- // abil on profiilist eraldatud sub-profiil, antud juhul nn 'hat'
Töötavad prosessid paistavad selliselt
# ps auxZ | grep -v ^unconf LABEL USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND /usr/sbin/apache2 (enforce) root 11983 0.0 7.1 444220 36192 ? Ss 02:18 0:01 /usr/sbin/apache2 -k start /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (enforce) www-data 19340 0.0 13.0 458772 65568 ? S 06:25 0:03 /usr/sbin/apache2 -k start /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (enforce) www-data 19341 0.0 13.2 458628 66688 ? S 06:25 0:03 /usr/sbin/apache2 -k start /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (enforce) www-data 19342 0.0 13.0 456788 65872 ? S 06:25 0:03 /usr/sbin/apache2 -k start /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (enforce) www-data 19343 0.0 13.3 458816 67568 ? S 06:25 0:03 /usr/sbin/apache2 -k start /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (enforce) www-data 19344 0.0 13.5 456988 68556 ? S 06:25 0:03 /usr/sbin/apache2 -k start /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (enforce) www-data 23964 0.0 13.4 458560 67920 ? S 09:03 0:03 /usr/sbin/apache2 -k start /usr/sbin/apache2//HANDLING_UNTRUSTED_INPUT (enforce) www-data 24019 0.0 13.1 457036 66236 ? S 09:05 0:03 /usr/sbin/apache2 -k start
kus
- nö tavalised protsessid on HANDLING_UNTRUSTED_INPUT nimelise hat all
Probleemid
- millegipärast on apache audit.log logis sarnased read
type=AVC msg=audit(1490313704.360:47938): apparmor="DENIED" operation="file_mmap" info="Failed name lookup - disconnected path" error=-13 \ profile="/usr/sbin/apache2" name="" pid=10306 comm="apache2" requested_mask="rw" denied_mask="rw" fsuid=0 ouid=0
paistab, et selle vastu aitab apache kõigis profiilides kasutada flags'i
flags=(attach_disconnected)
nt
# grep flags /etc/apparmor.d/usr.sbin.apache2 /usr/sbin/apache2 flags=(attach_disconnected) { ^DEFAULT_URI flags=(attach_disconnected) { ^HANDLING_UNTRUSTED_INPUT flags=(attach_disconnected) { ^www.auul.pri.ee flags=(attach_disconnected) { ... ^www.moraal.ee flags=(attach_disconnected) {
- kuna ilma hostname klappimiseta rakendatakse hästi lubav AA profiil, siis tuleks veebiserverisse konfida default virtual host, mille veebijuurikas on tühi kataloog ja mille kaudu midagi saa kasutada (arvestades seejuures, et /etc/apache2/conf-enabled kaudu võib kehtida mingi kõigi virtual hostide ülene seadistus).
Kasulikud lisamaterjalid
- man mod_apparmor
- http://wiki.apparmor.net/index.php/Mod_apparmor_example
- https://doc.opensuse.org/documentation/leap/security/html/book.security/cha.apparmor.hat.html
Profiili moodustamine - aa-logprof
aa-genprof kõrval on alternatiiv moodustada profiil aa-logprof abil. Tavaliselt kasutatakse seda olemasoleva profiili täiendamisel vahepeal kogunenud logi alusel. Kasutamiseks peab profiil olema olemas (nt aa-autodep abil tekitatud)
# aa-logprof
Märkused
- aa-logprof kasutab kogu audit.log faili sisu (võib olla kasutada -m suvandit lähtepositsiooni fikseerimiseks)
- aa-logprof kasutamisel ei saa öelda millised protsessi tegevusi kasutada, ta kasutab kõike
- aa-logprof töötab samasuguse interaktiivse kasutajaliidesega nagu aa-genprof
Profiili moodustamine - aa-easyprof
TODO
Profiili moodustamine - aa-autodep
# aa-autodep /usr/sbin/nginx
Salt integratsioon
TODO
Kasulikud lisamaterjalid
- https://www.digitalocean.com/community/tutorials/how-to-create-an-apparmor-profile-for-nginx-on-ubuntu-14-04
- https://wiki.debian.org/AppArmor/HowToUse
- https://debian-handbook.info/browse/stable/sect.apparmor.html
- https://wiki.debian.org/AppArmor/HowToUse
- https://www.youtube.com/watch?v=o2xa8JYcrmw
- https://doc.opensuse.org/documentation/leap/security/html/book.security/part.apparmor.html
- http://la-samhna.de/library/apparmor.html