Als er iets is waar Linux goed in is, dan is het als webserver. In dit artikel leer je hoe je Linux inzet als webserver. Niet zomaar als webserver, maar als webserver mét SELinux. We gebruiken CentOS 7.1, een vrij te verkrijgen Linux distributie waar SELinux standaard onderdeel van is.

 

 Om te beginnen, zorg je ervoor dat aan alle basisvoorwaarden voldaan is. Dat betekent dat je aangesloten bent op een netwerk en dat je met andere servers kunt communiceren. Daarbij is het vooral belangrijk dat je contact hebt met de CentOS repositories, want zonder repositories kun je immers geen software installeren.

 

 Als aan deze voorwaarden voldaan is, type je yum install httpd elinks. Alles wat nodig is voor een basis webserver zit in het httpd package en elinks is een handige tekstbrowser. Natuurlijk mag je ook met Firefox vanuit de grafische omgeving aan het werk, maar het voordeel van elinks is dat je er geen grafische omgeving voor nodig hebt. Dit is handig als je nog eens op een echte server moet werken.

 

 Als de installatie van packages voltooid is, type je systemctl start httpd, gevolgd door systemctl status httpd. Dit zorgt ervoor dat de webserver gestart wordt en dat hij daarnaast “enabled” wordt. Dat laatste bewerkstelligt dat hij na een herstart automatisch weer terugkomt. Type dan systemctl status httpd om te controleren dat de webserver operationeel is. Je ziet het resultaat van deze opdracht in listing 1.

 

 Listing 1: Controleren dat de webserver werkt

 

 ********************* start listing*********************

 

 [root@149-210-227-60 ~]# systemctl status httpd

 

httpd.service – The Apache HTTP Server

 

   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)

 

   Active: active (running) since Wed 2015-09-23 08:07:05 CEST; 4 days ago

 

  Process: 18278 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)

 

  Process: 10391 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS)

 

 Main PID: 18282 (httpd)

 

   Status: “Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec”

 

   CGroup: /system.slice/httpd.service

 

           ├─10405 /usr/sbin/httpd -DFOREGROUND

 

           ├─11868 /usr/sbin/httpd -DFOREGROUND

 

           ├─11915 /usr/sbin/httpd -DFOREGROUND

 

           ├─11916 /usr/sbin/httpd -DFOREGROUND

 

           ├─11935 /usr/sbin/httpd -DFOREGROUND

 

           ├─11964 /usr/sbin/httpd -DFOREGROUND

 

           ├─11966 /usr/sbin/httpd -DFOREGROUND

 

           ├─11987 /usr/sbin/httpd -DFOREGROUND

 

           ├─11988 /usr/sbin/httpd -DFOREGROUND

 

           ├─11989 /usr/sbin/httpd -DFOREGROUND

 

           ├─11996 /usr/sbin/httpd -DFOREGROUND

 

           └─18282 /usr/sbin/httpd -DFOREGROUND

 

 Sep 23 08:07:05 149-210-227-60.colo.transip.net httpd[18282]: AH00548: NameVirtualHost has no effect and…:5

 

Sep 23 08:07:05 149-210-227-60.colo.transip.net systemd[1]: Started The Apache HTTP Server.

 

Sep 27 03:31:02 149-210-227-60.colo.transip.net systemd[1]: Reloading The Apache HTTP Server.

 

Sep 27 03:31:02 149-210-227-60.colo.transip.net httpd[10391]: AH00548: NameVirtualHost has no effect and…:5

 

Sep 27 03:31:02 149-210-227-60.colo.transip.net systemd[1]: Reloaded The Apache HTTP Server.

 

Hint: Some lines were ellipsized, use -l to show in full.

 

 

********************* eind listing*********************

 

 

De documentroot

 

Je zou op dit moment al kunnen testen of de webserver content aanbiedt. Maar je hebt nog geen index.html aangemaakt, dus toont elinks de standaard webpagina waarop staat dat deze webserver nog verder ingericht moet worden. Kijk even goed naar deze pagina, je zult hem elke keer zien wanneer iets niet helemaal in orde is en je webserver verder ingericht moet worden.

 

 Voordat we verder gaan en een index.html aanmaken in de standaard documentroot, moeten we het even iets leuker maken. We gebruiken een niet-standaard documentroot. SELinux vindt eigenlijk alles goed, zolang het zich maar houdt aan de standaard instellingen. Dus als je documenten aan wilt maken in /var/www/html, dan gaat het gewoon standaard goed. Als je echter een documentroot aan wilt maken in een niet-standaard directory, dan moet je actie ondernemen. En dat is precies wat we in dit artikel gaan doen.

 

 Maak om te beginnen een directory /web aan met de opdracht mkdir /web. Maak nu in deze directory een bestand index.html met de inhoud “welkom in de /web document root”. Vertel vervolgens je Apache-server over deze niet-standaard documentroot door in /etc/httpd/conf/httpd.conf de volgende twee regels te wijzigen:

 

 

********************* start listing*********************

 

 

DocumentRoot “/web”

 

 

Further relax access to the default document root:

 

<Directory “/web”>

 

 

 ********************* eind listing*********************

 

 Start nu de webserver opnieuw op met de opdracht systemctl restart httpd. Als dat gebeurd is, gebruik dan elinks http://localhost. Je zult nu weer de standaard Apache welkomstpagina zien, wat niet goed is. Type dan setenforce 0. Hiermee zet je SELinux in Permissive mode. Daarin worden meldingen wel gelogd, maar wordt niets geblokkeerd. Herhaal de opdracht elinks http://localhost. Je zult nu toegang krijgen tot je webpagina, voldoende bewijs dat SELinux de reden is dat het hiervoor niet werkte.

 

 De reden dat SELinux de toegang tegenhoudt, is vanwege context labels. In SELinux heeft elke directory een context type dat definieert welk type gegevens voorkomt in de directory. Als je de opdracht ls -Z /var/www/html doet, zie je dat dit context type is ingesteld als system_u:object_r:httpd_sys_content_t:s0. Bekijk je hetzelfde voor /web, dan kom je unconfined_u:object_r:default_t:s0 tegen. In het context label is overigens alleen het derde onderdeel relevant. Dat wil zeggen: een web server document root moet het context label httpd_sys_content_t hebben.

 

 SELinux maakt gebruik van regels om te bepalen welk source context type toegang krijgt tot welk target context type. De bedoeling is dat Apache alleen toegang krijgt tot directories die door SELinux ook duidelijk als dusdanig gemarkeerd zijn – zo voorkom je dat door een foutje ineens de hele wereld toegang krijgt tot vertrouwelijke informatie. Dat betekent dat je niet-standaard omgevingen van het juiste context label moet voorzien.

 

 Om succesvol het juiste context label toe te passen, moet je eerst uitvinden wat dan dat juiste context label is. Een makkelijke manier daarvoor, is door gebruik te maken van de standaard omgeving. Zo weten we nu al wat de instelling is voor de standaard DocumentRoot. En die instelling moeten we op de niet-standaard DocumentRoot zetten. Daarvoor maken we gebruik van semanage fcontext.

 

 Om het nieuwe context label weg te schrijven naar de SELinux policy, typ je eerst semanage fcontext -a -t httpd_sys_content_t “/web(/.*)?”. Hiermee ben je er echter nog niet, vanuit de policy moet dit context type vervolgens ook toegepast worden op het bestandssysteem. Dat doe je met restorecon -Rv /web. Deze procedure lijkt omslachtig, maar juist het tegendeel is waar. In de SELinux policy zit alle informatie die nodig is om je bestandssysteem goed in te stellen. Door het eerst goed in de policy te zetten en van daaruit toe te passen op het bestandssysteem, wordt het heel gemakkelijk om de standaard instellingen opnieuw toe te passen.

 

 Als je de semanage en restorecon commando’s hebt toegepast, is je systeem in principe klaar en is de nieuwe DocumentRoot op de juiste wijze ingericht. Je hebt nu gezien hoe je een vrij algemeen SELinux probleem kunt oplossen en dat dit helemaal niet moeilijk hoeft te zijn. In het volgende artikel in deze serie bekijken we de Samba server en daarbij lees je ook hoe je Samba aanzet in een omgeving waar SELinux standaard onderdeel is.