Presentatie
Security Enhanced Linux (SELinux) 04-06-2013
Door: T.Duis Datum: 13-05-2013
Inhoud Security Enhanced Linux..........................................................................................................................1 Geschiedenis..............................................................................................................................................2 Maar waarom SELinux.............................................................................................................................3 Maar SELinux sucks.................................................................................................................................3 Linux beveiliging anno nu....................................................................................................................3 Beveiliging met SELinux..........................................................................................................................4 SELinux modes.....................................................................................................................................4 Maar hoe werkt SELinux dan?.............................................................................................................4 Type Enforcement (TE)...................................................................................................................4 Labelen van files..............................................................................................................................6 Zelf 'fcontext' definieren..................................................................................................................7 Relabelen tijdens reboot...................................................................................................................8 Role Based Access Control (RBAC).............................................................................................10 Multi-Level Security (MLS)..........................................................................................................10 Domains..............................................................................................................................................10 Booleans.........................................................................................................................................13 Lijst van booleans.....................................................................................................................13 Boolean status...........................................................................................................................13 Wijzigen Boolean status............................................................................................................13 Praktijk voorbeelden van Booleans:..........................................................................................13
Geschiedenis De Amerikaanse “National Security Agency” (NSA) wilde dat Linux nog veiliger werd en heeft daarom SELinux (laten) ontwikkelen. SELinux is een zogenaamde Mandatory Access Control mechanisme. Maar wat betekent dit? Mandatory Access Control = Op regels gebaseerde toegangscontrole, ook wel Rule Based Access Control (RBAC).
SELinux = Security Enhanced Linux De meeste besturingssystemen gebruiken Discretionary Access Control als beveiligingsmethoden. Bij deze vorm van beveiliging zijn de User,Group en World filesysteem rechten . Echter kan een gebruiker zijn home directory 'World readeable' maken. ls l rwrr 1 tduis users 1952878 Aug 5 2012 strip_janneke.jpg rwrr 1 tduis users 1612890 Aug 5 2012 strip_nel_en_gerrit.jpg
SELinux is in de kernel opgenomen en wordt door de onderstaande distributies ondersteund: • Hardened Gentoo: http://www.gentoo.org/proj/en/hardened/selinux/selinux-handbook.xml. • Debian: http://wiki.debian.org/SELinux. • Ubuntu: https://wiki.ubuntu.com/SELinux and https://help.ubuntu.com/community/SELinux. • Fedora: http://fedoraproject.org/wiki/SELinux and the Fedora SELinux FAQ .
Maar waarom SELinux De hoofdreden voor de ontwikkeling van SELinux was veiligheid. De doelstelling is: Alles staat dicht of is afgeschermd, tot het opengezet wordt. Eigenlijk zoals ook bij firewalls wordt toegepast.
Maar SELinux sucks... Vraag 10 (linux) beheerders naar hun mening over SELinux, en de kans is groot dat 90% zegt: “Dat is het eerste wat ik uitzet op een RHEL/CentOS systeem, na installatie” De reden hiervoor is dat het moeilijk en complex is. Andere distributies (Debian, SuSE) gebruiken een vergelijkbaar systeem genaamd 'AppArmor'. Echter het is niet zo dwingend en meer vergevingsgezind als SELinux, maar daarmee ook minder veilig.
Linux beveiliging anno nu In linux is alles een 'file' en de rechten zijn gebruiker gebaseerd. De 'linux beveiliging' maakt gebruik van: • Kernel • Processes (draaiende programma's) • Resources (bestanden, directories, sockets), • Cgroups (nieuw, maar meer om cpu load, memory te verdelen) Voorbeeld: De webserver lees webfiles (.html), maar het mag niet de /etc/passwd lezen! Maar wat/wie bepaalt dit? Dat is dus het beveiligingsmechanisme in de webserver, daar hoort het niet thuis. De configuratie file van apache en de rechten op de bestanden dus... de user/group!! De kernel regelt dit, maar kan geen onderscheid maken tussen een process en een gebruiker. Andere voorbeelden van zwakheden in Linux: • Je browser loopt onder je gebruikers account, maar deze kan je ssh-keys lezen..... • Mail files zijn alleen door gebruiker te lezen, maar mutt/evolution kan deze 'world readeable' maken.... • De webserver Apache, kan een bug bevatten waardoor deze /etc/passwd kan lezen.... of een root-shell kan starten. • Processen kunnen beveilings zaken omzeilen (denk aan sticky bit, sudo)...
Beveiliging met SELinux Het doel van SELinux is om Linux veiliger te maken, en dan op een dusdanige manier met policies dat de user/group/world rechten niet meer leidend zijn. Ook is de root user niet meer de 'alles heerser'.
De implementatie ziet er als volgt uit:
tduis:object_r:user_home_t:s0 user:role:type:level role = gebruikt voor RBAC Type = Type enforcement s0 = Multi Level Security SELinux slaat deze zaken op in de “extended file attributes” van een file. LET OP!! Als de DAC een permission denied geeft, maakt het niet meer uit wat SELinux goed vindt.
SELinux modes Er zijn 3 modes waarin SELinux kan werken: SELinux mode Uitleg enforcing
In deze modus worden de SELinux policies afgedwongen of opgelegd. Dit is de default mode in RHEL
permissive
In deze modus worden alleen waarschuvingen gegeven, applicaties werken normaal.
disabled
Dit is duidelijk de voorkeur van de meeste beheerders.
Deze instellingen worden gemaakt in de /etc/sysconfig/selinux configuratie file.
Daarnaast zijn er nog 2 SELinux types die ook in deze configuratie file vermeld worden: • targeted, dit is de standaard • MLS, multi level security, bespreken we verder niet.
Maar hoe werkt SELinux dan? SELinux heeft een extra laag in de kernel gedefinieert, met daarin de mechanismen om de beveiliging beter te kunnen regelen. Hierbij maakt men gebruik van de volgende zaken/termen: •
Type enforcement (primair mechanisme)
•
Role Based Access Control (RBAC)
•
Multi-Level Security (MLS)
Type Enforcement (TE) Door SELinux hebben hebben processen en files een security context gekregen. Deze bepalen of een process, of welk process deze files mogen raadplegen/wijzigen. Daarnaast zijn er booleans die ook zaken regelen. Voorbeeld: Je maakt een html bestand in je home directory en vervolgens verplaats je deze naar de /var/www/html directory. Commando “ls-lZ” in je home directory geeft onderstaand resultaat. rwr—r. tduis users unconfined_u:object_r:admin_home_t:s0 test2.html
Als je dit in de webroot hebt verplaatst, geeft een 'ls -lZ' het volgende resultaat: rwr—r. tduis users unconfined_u:object_r:admin_home_t:s0 test2.html
Dus Selinux instellingen worden meegenomen met verplaatsen. Bij kopieren worden de Selinux zaken van de doeldirectory overgenomen.
(commando: elinks http://localhost/test2.html) Als we met 'ls lZ /var/www/' de context (_t) van de directory bekijken en zien wat de context van de reeds aanwezige directories zijn. drwxr—xrx. root root system_u:object_r:http_sys_script_exec_t:s0 cgibin drwxr—xrx. root root system_u:object_r:http_sys_content_t:s0 error drwxr—xrx. root root system_u:object_r:http_sys_content_t:s0 html drwxr—xrx. root root system_u:object_r:http_sys_content_t:s0 icons
In de audit.log z zien we dat moment het volgende verschijnen..... type=AVC msg=audit(1369117468.703:643): avc: denied { getattr } for comm="httpd" path="/var/www/html/test2.html" dev=dm-0 ino=923866 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
pid=2078
type=SYSCALL msg=audit(1369117468.703:643): arch=40000003 syscall=195 success=no exit=-13 a0=13418d8 a1=bf888cc0 a2=888ff4 a3=8170 items=0 ppid=2075 pid=2078 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
Mocht je een grafische desktop hebben, dan kun je daar een meer leesbare foutmelding EN oplossing lezen.
Mocht je dit niet hebben, dan kun je met 'audit2why' ook een betere uitleg krijgen. We hebben /root/uitleg.log gegenereerd uit de audit.log. [root@rhel6 ~]# audit2why w i /root/uitleg.log
Labelen van files Het process van het instellen van het juiste type, noemt men in SELinux 'Labelen'. Nu kunnen we op 2 manieren de context, welke met _t aangeduid wordt aanpassen namelijk met: 1. chcon -t http_sys_content /var/ww/html/test2.html 2. 'restorecon /var/www/html/test2.html' of 'restorecon /var/www/html/ -R' De eerste optie stelt keihard de context in van de file zoals jij die aangeeft en het tweede commando kijkt in de SELinux database welke context de inhoud van deze directory moet hebben om te functioneren. Let op een restorecon zal de fcontext (met chcon gedaan) weer instellen zoals in de policy gedefinieerd. Vervolgens het resultaat:
(commando: elinks http://localhost/test2.html)
Zelf 'fcontext' definieren Stel je wilt in plaats van /var/ww/ een andere 'web-root' gebruiken (bv /srv/www), dan kunnen we dit met 'chcon -t httpd_sys_content_t /srv/www' instellen, maar na een relabel-actie zijn de wijzigingen weer teniet gedaan. In SELinux staan de filesystem fcontext types gedefinieerd in de file: “/etc/selinux/targeted/contexts/files/file_contexts”, maar als je zelf fcontext-en definieert, komen ze in de file: /etc/selinux/targeted/contexts/files/file_contexts.local te staan. Stel we willen de '/srv/www' aanmaken en als de webroot definieren. We tonen eerst dat de 'file_contect.local” niet aanwezig is, daarna stellen we voor /srv/www de fcontext in op “httpd_sys_content_t” : [root@rhel6 /]# ls l /srv/ total 0 [root@rhel6 /]# mkdir /srv/www [root@rhel6 /]# ls dZ /srv/ drwxrxrx. root root system_u:object_r:var_t:s0 /srv/
We zien dat de 'file_contexts.local' niet bestaat op schone machine...
[root@rhel6 /]# ls /etc/selinux/targeted/contexts/files/ file_contexts file_contexts.homedirs media
Nu stellen we de fcontext in... [root@rhel6 /]# semanage fcontext a t httpd_sys_content_t "/srv/www(/.*)?"
Nu tonen we de inhoud van de 'file_contexts.local'... [root@rhel6 /]# cat /etc/selinux/targeted/contexts/files/file_contexts.local # This file is autogenerated by libsemanage # Do not edit directly. /srv/www(/.*)? system_u:object_r:httpd_sys_content_t:s0
Nu kunnen we met onderstaand commando een file die we opzettelijk de verkeerde context gaven laten verwerken. [root@rhel6 /]# vi /root/index.html [root@rhel6 /]# mv /root/index.html /srv/www/ [root@rhel6 /]# ls /srv/www/ lZ rwrr. root root unconfined_u:object_r:admin_home_t:s0 index.html [root@rhel6 /]# restorecon R v /srv restorecon reset /srv/www context unconfined_u:object_r:var_t:s0>unconfined_u:object_r:httpd_sys_content_t: s0 restorecon reset /srv/www/index.html context unconfined_u:object_r:admin_home_t:s0>unconfined_u:object_r:httpd_sys_con tent_t:s0 [root@rhel6 /]#
Relabelen tijdens reboot We kunnen er ook voor kiezen om tijdens de herstart een complete systeem-relabel te laten uitvoeren. Dit doen we door in de root / een .autorelabel file te maken. touch /.autorelabel
Tijdens een reboot zien we:
Als het relabelen klaar is, volgt een tweede reboot.
Welke types er alle allemaal zijn, kunnen we opvragen met: [root@rhel6 ~]# seinfo t|less Types: 3609 bluetooth_conf_t cmirrord_exec_t samba_secrets_t snort_exec_t amavis_var_log_t audisp_var_run_t auditd_var_run_t etc...
Als we in de file: less /etc/selinux/targeted/contexts/files/file_contexts kijken zien we dat voor het gehele filesystem de contexts gedefinieerd zijn.
Role Based Access Control (RBAC) RBAC wordt alleen gebruikt voor processen, niet voor bestanden of gebuikers! Default hebben we diverse voorgedefinieerde 'roles' zoals: unconfined_r object_r (resources zoals devices) system_r (voor deamons) user_r (alleen gebruikt in strict en MLS policies)
Multi-Level Security (MLS) De titel spreek voor zich, maar aangezien SELinux van een militaire organisatie komt, moeten we hierbij denken aan: unclassified,confidential,secret,top secret. Omdat 'targeted' de default policy is (en we er te weinig van weten) behandelen we dit niet. Als je er meer van wil weten, de s0 kan meerdere niveau's hebben.
Om van MLS in RHEL6 gebruik te kunnen maken, dient de rpm “selinux-policy-mls.noarch” geinstalleerd te worden.
Domains Zoals bestanden toegekend worden aan gebruikers, geldt dit niet voor processen. Deze worden 'Domains' genoemd. In de 'targeted policy' zijn er 2 type domains gedefinieerd: •
unconfined
•
confined
Beide domains hebben betrekking op de executable context en beschrijfbaar geheugen controles. Maar processen in 'unconfined' domains kunnen geen beschrijfbaar geheugen aanspreken. Dat is handig om 'buffer overflow attacks' te voorkomen. Met het commando 'sestatus' kunnen we de huidig geconfigureerde status van SELinux opvragen. [root@rhel6 ~]# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 24 Policy from config file: targeted
Als we op één console het 'passwd' commando starten om een wachtwoord te wijzigen: [tduis@rhel6 ~]$ passwd Changing password for user tduis. Changing password for tduis. (current) UNIX password:
Vervolgens vragen we dit process op met SELinux context [root@rhel6 ~]# ps efZ|grep i passwd|grep v grep unconfined_u:unconfined_r:passwd_t:s0s0:c0.c1023 root 6248 6225 0 15:34 pts/2 00:00:00 passwd
zie ook: [root@rhel6 ~]# ls lZ /usr/bin/passwd rwsrxrx. root root system_u:object_r:passwd_exec_t:s0 /usr/bin/passwd
Hier zien we dat de executable /usr/bin/passwd van het type passwd_exec_t type is, terwijl het process het type passwd_t heeft, hieruit blijkt dat een process het domein van het type krijgt. Er vindt dus ergens een vertaling plaats. Daarnaast zien we dat de eerste 2 velden (system_u:object_r) ook anders zijn. Gebruikers zijn standaard 'unconfined' (zie id -Z <username>) en processen/deamons hebben meestal 'system_u'. Op deze wijze kan Ander voorbeeld Apache/httpd: [root@rhel6 ~]# ls lZ /usr/sbin/httpd rwxrxrx. root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd [root@rhel6 ~]# ps efZ |grep apache
system_u:system_r:httpd_t:s0 apache 2957 2087 0 11:18 ? 00:00:00 /usr/sbin/httpd system_u:system_r:httpd_t:s0 apache 2958 2087 0 11:18 ? 00:00:00 /usr/sbin/httpd system_u:system_r:httpd_t:s0 apache 2959 2087 0 11:18 ? 00:00:00 /usr/sbin/httpd system_u:system_r:httpd_t:s0 apache 2960 2087 0 11:18 ? 00:00:00 /usr/sbin/httpd system_u:system_r:httpd_t:s0 apache 2961 2087 0 11:18 ? 00:00:00 /usr/sbin/httpd system_u:system_r:httpd_t:s0 apache 2962 2087 0 11:18 ? 00:00:00 /usr/sbin/httpd system_u:system_r:httpd_t:s0 apache 2963 2087 0 11:18 ? 00:00:00 /usr/sbin/httpd system_u:system_r:httpd_t:s0 apache 2964 2087 0 11:18 ? 00:00:00 /usr/sbin/httpd
Een ander voorbeeld: Als een gebruiker een process start zoals bijvoorbeeld 'top'. We starten top in een console en in een andere console type we: [root@rhel6 ~]# ps efZ|grep i top|grep v grep unconfined_u:unconfined_r:unconfined_t:s0s0:c0.c1023 tduis 6727 6652 0 16:32 pts/2 00:00:00 top
NFS en SAMBA mounts Bij het gebruik van mounts, kan tijdens het mounten een “-o context=” ...” opgegeven worden, waardoor een nfs/samba filesysteem ook SELinux zaken gebruikt. Voorbeeld: mount t nfs server:/export /mountpoint o context=”system_u:object_r:httpd_sys_content_t:s0”
Extra Info: Lees meer info over defcontext=”...” om nieuw aangemaakte files deze context te laten krijgen... Lees meer info over “nosharecache” optie als je een nfs export op meerdere plaatsen gemount wilt hebben op een machine icm SELinux......
Booleans Deze maken het mogelijk om SELinux functionaliteiten in runtime te wijzigen. Normaal kan de ftp daemon geen files in de home-directories van gebruikers sharen. Maar door een in SELinux gedefinieerde 'boolean' in te stellen, mag ftp dit wel.
Lijst van booleans
Deze vraag je op met 'semanage boolean -l' SELinux boolean State Default Description ftp_home_dir (off , off) Allow ftp to read and write files in the user home directories smartmon_3ware (off , off) Enable additional permissions needed to support devices on 3ware controllers. xdm_sysadm_login (off , off) Allow xdm logins as sysadm xen_use_nfs (off , off) Allow xen to manage nfs files mozilla_read_content (off , off) Control mozilla content access ftp_home_dir (off , off) Allow ftp to read and write files in the user home directories etc...
Boolean status
Opvragen van boolean status als volgt: [root@rhel6 contexts]# getsebool ftp_home_dir ftp_home_dir > off
Wijzigen Boolean status
Tijdens runtime kunnen we een boolean wijzigen. [root@rhel6 contexts]# setsebool ftp_home_dir on [root@rhel6 contexts]# getsebool ftp_home_dir ftp_home_dir > on
LET OP!! Booleans op deze manier wijzigen is NIET persistent. Gebruik de -P (persistent) optie om de booleans een reboot te laten overleven.
Praktijk voorbeelden van Booleans:
Een LAMP server, de meest voorkomende toepassing. Hier dient Apache middels PHP een database (over het netwerk) aan te kunnen spreken.
[root@rhel6 contexts]# semanage boolean l|grep database httpd_can_network_connect_db (off , off) Allow HTTPD scripts and modules to connect to databases over the network. sepgsql_unconfined_dbadm (on , on) Allow database admins to execute DML statement exim_can_connect_db (off , off) Allow exim to connect to databases (postgres, mysql) puppetmaster_use_db (off , off) Allow Puppet master to use connect to mysql and postgresql database ftpd_connect_db (off , off) Allow ftp servers to use connect to mysql database
We vragen de status op:
[root@rhel6 contexts]# getsebool httpd_can_network_connect_db httpd_can_network_connect_db > off
Vervolgens stellen we de boolean in:
[root@rhel6 contexts]# setsebool httpd_can_network_connect_db
Nu kan http (dus ook php) over het netwerk een (mysql) database aanspreken.
Bijlagen en tabellen Afkortingen Afkortingen
Uitleg
NSA
National Security Agency
SELinux
Security Enhanced Linux
RBAC
Role Based Access Control
DAC
Discretionary Access Control (De normale rwx rechten)
MAC
Mandatory Access Control
MLS
Multi-Level Security
TE
Type Enforced
confined
Begrensd, beperkt, eindig
Aangepast commando's (letop -Z is goed om te kennen) ls ps id lsof netstat cp mv install Pam, login, passwd, useradd, groupadd, Sshd, xdm Tar, zip rsync rpm