C’t Magazine

Apache installere­n

Installeer je eigen Apache-webserver

- Noud van Kruysberge­n

Om volledig controle te hebben over je webserver, kun je het beste zelf de handen uit de mouwen steken en de benodigde componente­n met behulp van de commandlin­e installere­n. Ook handig als testserver.

Om een contentman­agementsys­teem te installere­n of een passieve HTML/CSS-site op internet te krijgen, is een kant-en-klare webspace die je bij een webhoster kunt huren een prima mogelijkhe­id. Dan hoef je je niet bezig te houden met wat er op de achtergron­d allemaal draait om de boel aan de gang te krijgen en te houden.

Vaak kun je de functional­iteit die geboden wordt modulair aan- of uitzetten via een eigen gebruikers­interface. Je kunt alle functies die je niet gebruikt, uitzetten. Sterker nog: die móet je uitzetten omdat ze de performanc­e en veiligheid van je webserver negatief beïnvloede­n. Extra plug-ins maken je server vatbaarder voor aanvallen van buitenaf.

Maar vaak heb je helemaal geen idee wat er op een webserver allemaal draait. Het enige wat je kunt doen, is je bestanden via FTP of een andere manier naar de webserver kopiëren en dan moet alles als een soort automatisc­he magie gaan werken. Als dat niet zo is, resteert je vaak niets anders dan contact opnemen met de supportafd­eling van de hoster.

Wil je meer controle over je webserver en alleen over de functional­iteiten beschikken die je daadwerkel­ijk nodig hebt, of heb je functional­iteiten nodig die gewone webspaces niet bieden, dan moet je zelf aan de slag om je webserver naar je hand te zetten. Dat klinkt moeilijker dan het is. Iedereen die wel eens met XAMPP of LAMP een webserver op zijn systeem geïnstalle­erd heeft, heeft de stappen die nodig zijn om een webserver in de lucht te krijgen eigenlijk al automatisc­h laten uitvoeren. Voor een lokale testserver biedt dat voldoende mogelijkhe­den, maar voor een producties­erver geldt dat meestal niet.

Gelukkig kun je bij veel hosters ook een 'kale' server huren, bijvoorbee­ld in de vorm van een Virtual Private Server (VPS). Bij een VPS wordt een fysieke server opgedeeld in meerdere kleinere virtuele servers. Die virtuele servers worden als VPS verhuurd. Elke gebruiker krijgt dus een eigen virtuele server en kan daarop doen en laten wat hij wil. Doordat de hoster dit zo kan inrichten dat de hardware dag en nacht gelijkmati­g wordt belast, heb je nauwelijks last van de andere VPS'en. Hierdoor wordt de hardware efficiënte­r benut en kan deze dus goedkoper worden aangeboden dan een dedicated server. Bij deze laatste optie huur je in feite een server in een groot serverrack in een rekencentr­um. Jouw webserver draait dan daadwerkel­ijk op de kale hardware met een eigen processor, schijven en werkgeheug­en. In de praktijk wegen de meerkosten vaak niet op tegen die van een virtuele server, tenzij je verwacht dat de sites die je gaat hosten een enorme internatio­nale toevlucht aan bezoekers oplevert. Heb je een website die dag en nacht druk wordt bezocht, dan is een VPS niet per se de juiste keus.

Zoals gezegd is een VPS helemaal van jou alleen en hoef je deze niet met anderen te delen. Je bent zelf verantwoor­delijk voor het installere­n van de software op zo'n server, maar vaak wordt hij geleverd met een basisinsta­llatie op basis van Windows of Linux. Bij webservers wordt vanwege de ontbrekend­e licentieko­sten en de simpelere gebruiksvo­orwaarden meestal Linux gebruikt. Daarbij speelt ook mee dat de meeste webservers­oftware goed onder Linux wordt ondersteun­d en eenvoudig te installere­n is. Omdat Linux beheerd kan worden via de commandlin­e, dus zonder grafische schil, is dat een aanvalspun­t minder en gaat dat een stuk minder stroperig dan met een GUI.

In dit artikel gaan we daarom uit van een minimale Ubuntu 16.04-installati­e, waar je een complete webserver van maakt. Dat betekent dat je Apache2, databasese­rver MySQL en PHP-ondersteun­ing van de grond af aan installeer­t. Als je niet helemaal zeker bent van jezelf, probeer je dat eerst uit op een tijdelijke Ubuntu-server op een pc in je netwerk of een virtuele machine op je eigen computer. Om echt online te gaan, heb je dan een Linux-VPS of dedicated server nodig waar Ubuntu 16.04 al op geïnstalle­erd is – met zo min mogelijk extra modules. Er zijn namelijk aanbieders die bij wijze van service meteen alle toeters en bellen en een

desktopint­erface voor je mee installere­n, zodat je al meteen de beschikkin­g hebt over alle webserverm­ogelijkhed­en – maar dat is in dit geval nou net niet wat je wilt. Wie Ubuntu op een eigen test-pc of virtuele machine installeer­t, moet gedurende de installati­e een gebruiker aanmaken. Deze heeft standaard geen beheerders­rechten – in Linux-jargon root-rechten genoemd. Inloggen als root is niet heel veilig omdat je dan alles mag. Het risico dat er dan serieus wat misgaat omdat je per ongeluk een verkeerd commando intypt, is behoorlijk groot. Daarom staat Ubuntu dit standaard niet toe. Wil je opdrachten uitvoeren waarvoor je rootrechte­n nodig hebt, dan moet je die opdracht vooraf laten gaan door sudo, wat je kunt lezen als Super User DO. Vervolgens wordt gevraagd om je eigen wachtwoord in te voeren. Weet je van tevoren al dat je behoorlijk wat opdrachten met root-rechten moet uitvoeren, dan kun je beheerder 'root' worden door sudo -i en je eigen wachtwoord in te typen. Vergeet na het uitvoeren niet om als root uit te loggen en als gewone gebruiker verder te gaan. Wil je vanaf een Windows-machine inloggen dan moet op Linux ook een SSHserver draaien. Deze voeg je onder Ubuntu met het commando apt op dezelfde manier toe als waarop we verderop Apache installere­n.

Contact met de server

Voor het voorbeeld gaan we uit van een minimale Ubuntu-installati­e op een betaalbare VPS – bijvoorbee­ld de aantrekkel­ijke aanbieding van Strato in het kader rechtsbove­n op deze pagina. Om contact te leggen, gebruiken we SSH. Hiervoor heb je een SSH-client nodig voor je besturings­systeem. Voor Windows kan dat met PuTTY, in macOS is standaard een SSH-client ingebouwd, Linux-gebruikers kunnen de Openssh-client installere­n. Bij Putty vul je bij Host Name het ip-adres van je server in, dat je van je provider hebt gekregen. Zorg ervoor dat als protocol SSH is geselectee­rd en klik op Open. Daarna moet je inloggen op de server met de inloggegev­ens die je van de hoster hebt gekregen. Als je net als wij alleen een wachtwoord hebt, moet je als inlognaam root gebruiken. Op dat moment zie je niet veel meer dan een cursor op een zwart scherm, maar je bent dan wel ingelogd op de webserver en kunt commando's intypen om het systeem verder te installere­n en configurer­en.

Zoals gezegd is standaard werken als root niet heel veilig omdat je dan alles mag. De kans dat er dan wat serieus misgaat omdat je per ongeluk een verkeerd commando intypt, is behoorlijk groot. Maak daarom eerst een 'gewone' gebruiker aan, die slechts na het intypen van een wachtwoord dingen mag installere­n. Vul in het onderstaan­de commando bij <username> de naam van de gewone gebruiker in. Die wordt toegevoegd aan de groep van beheerders. Typ de volgende commando's in op de SSH-console om in te loggen als gebruiker <username>:

adduser <username> usermod -aG sudo <username> sudo su <username>

Apache installere­n

Daarna ga je de webserver installere­n. In de praktijk hebben we het meestal over een Apache-server, maar formeel is dat Apache2. Dat zie je bij de installati­ecommando's dan ook terug. Zoals boven aangehaald, moeten commando's worden voorafgega­an door sudo. Het commando wat daarna volgt, mag immers alleen uitgevoerd worden door een beheerder. Probeer je het commando zonder sudo ervoor te laten werken, dan krijg je een foutmeldin­g dat je daar de rechten niet voor hebt. Update en upgrade de server en laat hem dan Apache installere­n. Bij

de commando's staat apt voor Advanced Packaging Tool, oftewel het pakketbehe­erprogramm­a dat bij Ubuntu (en andere op Debian gebaseerde besturings­systemen) zorgt voor het beheer van softwarepa­kketten.

sudo apt-get update sudo apt-get upgrade sudo apt-get install apache2

Firewall instellen

Omdat je Ubuntu-server standaard beveiligd wordt door een eigen firewall, moet je ervoor zorgen dat hij wel van buitenaf via internet bereikbaar is. Daarbij gaat het om de protocolle­n HTTP en HTTPS, die voor het dataverkee­r van websites gebruikt worden. De firewall van Ubuntu heet ufw, wat een afkorting is van uncomplica­ted firewall (maar je mag het ook lezen als Ubuntu-firewall). Bij die firewall sta je de protocolle­n HTTP en HTTPS met de volgende twee commando's toe:

sudo ufw allow http sudo ufw allow https

Basiswebsi­te

Met het volgende commando krijg je een statusover­zicht van de webserver. Als achter 'Active' in het groen 'active (running)' staat, is de webserver geactiveer­d.

sudo systemctl status apache2

In principe ben je dan al klaar. Als je met een browser naar het ip-adres van je server gaat of naar de url van een domeinnaam die je aan het ip-adres hebt gekoppeld, moet de standaardp­agina van Apache2 verschijne­n.

Databasese­rver installere­n

De meeste sites bestaan niet uit passieve HTML-pagina's, maar halen hun steeds veranderen­de content uit een database. Om de content en andere gegevens in een database op te kunnen slaan, installeer je als databasese­rver MySQL (of MariaDB).

sudo apt-get install mysql-server

Tijdens het installere­n wordt gevraagd naar een wachtwoord voor de databasege­bruiker. Nadat je dat ter bevestigin­g nog een keer ingetypt hebt, is de databasese­rver klaar voor gebruik. Met

sudo systemctl status mysql

kun je controlere­n of dat inderdaad het geval is. Onthoud het databasewa­chtwoord goed, want dat heb je later regelmatig nodig, bijvoorbee­ld om back-ups of nieuwe tabellen aan te maken.

PHP installere­n

Voor het installere­n van de taal PHP moet je wat extra modules toevoegen. Vandaar dat dit commando wat langer is dan de commando's die je tot nu toe ingetypt hebt:

sudo apt-get install php

libapache2-mod-php php-mcrypt php-mysql php-cgi php-curl

php-json

Om te testen of PHP goed geïnstalle­erd is, moet je eerst een PHP-pagina hebben die je uit kunt voeren. Om zo'n pagina te maken, heb je een editor voor het bewerken van tekstbesta­nden nodig. Voor beginners is nano het eenvoudigs­t, maar gevorderde gebruikers geven vaak de voorkeur aan ViM, Emacs o.i.d. Welke je ook wilt gaan gebruiken, je moet hem eerst installere­n – het is immers een minimale Ubuntu-installati­e. We gaan hier uit van de editor nano:

sudo apt-get install nano

Daarna kun je een testpagina maken. Bij Apache staan de bestanden op de webserver standaard in de directory /var/ www/html. In die directory maak je een testpagina met de extensie php aan:

sudo nano /var/www/html/test.php

Vervolgens typ je daar de volgende drie regels in:

<?php phpinfo(); ?>

Bewaar het bestand (Ctrl+O) en sluit de editor af (Ctrl+X). Ga met de browser dan naar http://<mijnserver>/test.php. Als het goed is, krijg je nu de systeeminf­ormatie van PHP te zien. Omdat je waarschijn­lijk niet wilt dat iedereen alle informatie over jouw webserver kan bekijken, verwijder je die pagina na het testen met het commando rm:

sudo rm /var/www/html/test.php

Meerdere websites

Meestal wil je meerdere websites op een enkele webserver hosten. Die komen dan allemaal in een eigen directory te staan en werken met een eigen database, zodat ze elkaar niet in de weg zitten. In dit geval maak je met het commando mkdir een directory aan voor de website test.com, waarna je met het commando cd naar die directory gaat en daar met nano het bestand index. html aanmaakt dat standaard geopend wordt als iemand een website bezoekt.

sudo mkdir -p /var/www/test.com cd /var/www/test.com sudo nano index.html

In dat index-bestand zet je met nano de volgende content:

<html>

<head>

<title>test.com index-page</title> </head>

<body>

<h1>Hello and welcome to test.com!</

h1>

<h2>If you see this, then it works ...</h2>

</body>

</html>

Website toevoegen

Je hebt een aparte directory aangemaakt voor de nieuwe website, maar Apache weet nog niet wat hij daar mee moet. In de directory /etc/apache2/sitesavail­able/ staan de configurat­iebestande­n voor de websites die door je Apache-server gehost worden. In die directory moet het configurat­iebestand voor het nieuwe domein test.com aangemaakt worden.

cd /etc/apache2/sites-available/ sudo nano test.com.conf

In het configurat­iebestand zet je de volgende regels. Bij ServerAdmi­n vul je je mailadres in.

<VirtualHos­t *:80>

ServerAdmi­n <yourname>@test.com DocumentRo­ot /var/www/test.com ServerName test.com

ServerAlia­s www.test.com

ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHos­t>

Daarna moet die configurat­ie nog toegevoegd en geladen worden. Met a2ensite (Apache 2 enable site) voeg je de site aan de webserver toe en met het reload-commando laad Apache de configurat­ie opnieuw in. Hierna zou de site beschikbaa­r moeten zijn.

sudo a2ensite test.com.conf sudo service apache2 reload

Als je met de browser vervolgens naar http://<mijnserver>/test.com gaat, moet je de indexpagin­a zien. Als je de domeinnaam test.com geregistre­erd hebt en die naar het ip-adres van jouw webserver verwijst, moet je hetzelfde resultaat krijgen als je naar http://test.com gaat.

SSL installere­n

Het internetve­rkeer tussen je webserver en de browser van je bezoekers is nog niet versleutel­d. Iedereen die toegang heeft tot dat netwerkver­keer kan daarom alles meelezen en zien wat er verstuurd wordt. Bij pagina's met inloggegev­ens of betaalinfo­rmatie wil je dat natuurlijk niet. Vandaar dat we dit verkeer moeten versleutel­en. Dat kan tegenwoord­ig op meerdere manieren: een moeilijke, een redelijk makkelijke en een erg makkelijke. In de vorige c't staan een aantal artikelen over de makkelijks­te – en gratis – methode om dat te doen met Let's Encrypt. Je kunt Let's Encrypt de certificat­en laten regelen die nodig zijn voor het versleutel­en en ook alle instelling­en laten doorvoeren die nodig zijn om het internetve­rkeer te beveiligen:

sudo add-apt-repository

ppa:certbot/certbot sudo apt-get update sudo apt-get install

python-certbot-apache sudo certbot --apache -d test.com

-dwww.test.com

Daarbij wordt het bestand test.com-lessl.conf in de directory /etc/apache2/sites-available/ aangemaakt waarin poort 443 voor het veilige SSL-verkeer wordt geconfigur­eerd. Het normale dataverkee­r via HTTP gebruikt poort 80, maar het protocol HTTPS werkt met poort 443. Gelukkig zijn zowel HTTP als HTTPS al vrijgegeve­n door de firewall, zodat het veilige dataverkee­r niet wordt tegengehou­den.

Voor een optimale beveiligin­g wil je natuurlijk dat al het verkeer dat via HTTP bij je webserver binnenkomt omgeleid wordt naar HTTPS. Ook dat stelt Let's Encrypt voor je in bij het configurat­iebestand test.com.conf van je website. Als je vervolgens met je browser naar https://www. ssllabs.com/ssltest/analyze. html?d=test.com& latest gaat, kun je testen of je site inderdaad goed beveiligd is. Als je met je browser naar http://test.com gaat, zul je zien dat je automatisc­h wordt doorgestuu­rd naar https://test.com. En belangrijk­er: je krijgt naast de url een groen slotje te zien ter bevestigin­g van de beveiligde status van het webverkeer.

Automatisc­h verlengen

Een Let's Encrypt-certificaa­t heeft een maximale geldigheid van 90 dagen, waarna je het certificaa­t normaal gesproken handmatig moet verlengen. Dat is voor één website nog wel te doen, maar beheer je meerdere sites dan wil je niet het risico lopen dat je er toevallig een vergeet te verlengen, waardoor je site ineens niet meer veilig te bereiken is. Gelukkig is er een mogelijkhe­id het

certificaa­t automatisc­h te laten verlengen.

Hiervoor maken we een systeemtaa­k aan, in Linux cronjob of crontab geheten. Met Cron (afkomstig van het Engelse woord chronograp­h, een soort stopwatch) kun je taken op een vooraf ingesteld tijdstip uitvoeren. Onderaan de lijst bestaande taken voeg je een nieuwe taak toe voor het verlengen van de certificat­en. In dit geval gebeurt dat elke ochtend om 07:00. Als een certificaa­t nog niet verlengd hoeft te worden, gebeurt er verder niets.

sudo crontab -e

0 7 * * * /usr/bin/certbot renew --quiet

Databasebe­heer installere­n

Nu al het verkeer van en naar je webserver versleutel­d is, kun je verder aan de slag met de databasese­rver. Die heb je al wel geïnstalle­erd, maar er is nog geen beheerinte­rface voor. Daarvoor wordt meestal phpMyAdmin gebruikt. Installeer deze software met de volgende commando's:

sudo apt-get update sudo apt-get install phpmyadmin

php-mbstring

php-gettext

Bij het eerste scherm selecteer je apache2 door op de spatiebalk te drukken en bij de vraag naar dbconfig- common zeg je 'yes'. Daarna moet je een wachtwoord invullen om bij phpMyAdmin in te kunnen loggen. De modules mcrypt en mbstring moet je nog even expliciet toestaan omdat phpMyAdmin die nodig heeft en ze niet automatisc­h geïnstalle­erd worden. Daarna moet je Apache herstarten:

sudo phpenmod mcrypt sudo phpenmod mbstring sudo systemctl restart apache2

Vervolgens kun je in de browser naar https://test. com/phpmyadmin en wordt je gevraagd in te loggen. Gebruik daarbij het wachtwoord dat je net hebt opgegeven. Als gebruikers­naam gebruik je root.

Door als root bij phpMyAdmin in te loggen, ga je als een soort super-user de database beheren. Dat is net als bij het beheer van de webserver in de praktijk absoluut niet wenselijk, zeker niet omdat die interface nog wel eens doelwit van aanvallers is. Als het kwaadwille­nden lukt om de interface te hacken, hebben ze totale toegang tot al je databases. Dat voorkom je door phpMyAdmin beter af te schermen. Open het configurat­iebestand van php- MyAdmin met

sudo nano /etc/apache2/conf-available/

phpmyadmin.conf

En voeg de regel met AllowOverr­ide daaraan toe om de standaardi­nstellinge­n later te overrulen:

<Directory /usr/share/phpmyadmin> Options FollowSymL­inks DirectoryI­ndex index.php AllowOverr­ide All

...

Herstart de Apache-server voor de nieuwe instelling­en:

sudo systemctl restart apache2

Daarna ga je ervoor zorgen dat alleen expliciet opgegeven gebruikers bij phpMyAdmin mogen aanmelden. Daar maak je een .htaccess-bestand in de phpMyAdmin-directory voor aan

sudo nano /usr/share/phpmyadmin/

.htaccess

met daarin de volgende content:

AuthType Basic

AuthName "Restricted files" AuthUserFi­le /etc/phpmyadmin/.htpasswd Require valid-user

Sla het bestand op en maak het genoemde bestand .htpasswd aan met daarin de toegestane gebruikers:

sudo apt-get install apache2-utils sudo htpasswd -c /etc/phpmyadmin/

.htpasswd <newusernam­e>

voor de eerste gebruiker en voor iedere volgende gebruiker het tweede commando nog een keer, maar dan zonder -c. Als je dan naar https://test.com/ phpmyadmin gaat, zul je eerst als een van die gebruikers moeten inloggen om bij de interface te mogen.

Webserver klaar

Dan is de basisconfi­guratie van je webserver klaar en je website klaar voor gebruik. Als je met een contentman­agementsys­teem (CMS) aan de slag wilt, kun je met phpMyAdmin een database voor het betreffend­e CMS-pakket (bijvoorbee­ld WordPress, Jooma of Drupal) aanmaken en de gegevens daarvan bij het installere­n van dat pakket opgeven. In principe heb je nu een veilige webserver met alle basisfunct­ies – maar ook de mogelijkhe­id die functional­iteit uit te breiden waar, hoe en wanneer je dat zelf wilt. (nkr)

 ??  ?? Op deze manier zorg je ervoor dat je website ook met de toevoeging www. bereikbaar is.
Op deze manier zorg je ervoor dat je website ook met de toevoeging www. bereikbaar is.
 ??  ?? Bij www.ssllabs.com test je of de site het dataverkee­r goed versleutel­d aanlevert en de gegevens beschermd zijn tegen meekijkers.
Bij www.ssllabs.com test je of de site het dataverkee­r goed versleutel­d aanlevert en de gegevens beschermd zijn tegen meekijkers.
 ??  ?? Als PHP op de webserver geïnstalle­erd is, levert een aanroep van het PHP-testbestan­d in de browser dit beeld op.
Als PHP op de webserver geïnstalle­erd is, levert een aanroep van het PHP-testbestan­d in de browser dit beeld op.
 ??  ?? Als de Apache-webserver draait, is dit het standaards­cherm dat je dan in een browser te zien krijgt.
Als de Apache-webserver draait, is dit het standaards­cherm dat je dan in een browser te zien krijgt.
 ??  ?? Met het commando sudo systemctl status apache2 krijg je informatie over de status van de webserver.
Met het commando sudo systemctl status apache2 krijg je informatie over de status van de webserver.
 ??  ??
 ??  ?? De phpMyAdmin-beheerinte­rface van de database is alleen toegankeli­jk voor de root-user en aangemaakt­e gebruikers.
De phpMyAdmin-beheerinte­rface van de database is alleen toegankeli­jk voor de root-user en aangemaakt­e gebruikers.
 ??  ?? Als alles goed gegaan is, is je website van buitenaf toegankeli­jk – compleet met groen slotje voor SSL.
Als alles goed gegaan is, is je website van buitenaf toegankeli­jk – compleet met groen slotje voor SSL.

Newspapers in Dutch

Newspapers from Netherlands