AppArmor kasutamine operatsioonisüsteemiga Debian

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

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
...
# 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

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