Ubuntu-ServerEnige tijd geleden omschreef ik hoe je een Ubuntu 14.10 server moest inrichten in: Ubuntu server ipv Windows. Nu crasht mijn server steeds door brute force attacks, ddos aanvallen en dergelijk. Dus ik installeer maar weer een nieuwe server, dit keer veiliger om problemen te voorkomen. Daarnaast maakte ik wat configuratie problemen bij de vorige en wil ik het nu in één keer goed doen: Ubuntu veilig inrichten.

Het installeren blijft ingewikkeld en daarom maak ik voor mezelf een handleiding. Dus hier komt een stappenplan. Omdat ik een Mac heb ga ik uit van een installatie die ik bereik vanaf de Mac.

Ubuntu server inrichten voor Dummies, versie 2

LAMP, Linux, Apache, MySQL & PHP

1. Kies een goede hosting uit. Zelf ga ik de server niet hosten en onderhouden. Daarvoor moet je een bepaalde internetverbinding hebben en je hebt altijd een computer aanstaan. Ik host mijn server bij Tilaa.nl.

2. Maak op je computer verbinding via SSH naar de computer. Zo heb je een remote terminal waar je alle acties op uit kan voeren. In de Mac zit al een standaard SSH-client, voor Windows raad ik PuTTY aan.
Maak dan verbinding met de computer. In de terminal gaat dat als volgt:

ssh root@serverip

3. Update je installatie met de laatste pakketten voor Ubuntu met het volgende commando:

sudo apt-get update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade && sudo apt-get -y autoremove && sudo apt-get -y autoclean

4. Dan zet ik de locale van mijn server naar algemeen GB

sudo locale-gen "en_GB.UTF-8" && sudo dpkg-reconfigure locales

En daarna in de environment zet ik deze variabelen nog:

sudo nano /etc/environment

En ik plak het volgende onder ‘PATH’

LC_ALL="en_GB.UTF-8"
LC_CTYPE="en_GB.UTF-8"
LANGUAGE="en_GB.UTF-8"

Als je dan de server herstart kloppen de talen wel. Dan kunnen meteen de updates geactiveerd worden.

5. En dan installeren we Apache, de webserver van Ubuntu:

sudo apt-get install apache2

Je kan checken door: http://serverip in je browser in te typen of de installatie is geslaagd.

6a. Ik wil gebruik maken een database, in dit geval van MySQL. Dit installeer je als volgt:

sudo apt-get install mysql-server

Maar omdat ik een aantal andere modules er ook bij wil hebben zet ik die met een spatie er ook achter en dit commando heb ik hieronder gezet:

sudo apt-get install mysql-server php5-mysql

Zorg dat je het root wachtwoord wat je moet invullen voor de MySQL root gebruiker ergens opslaat.
b. Initialiseer de databases met:

sudo mysql_install_db

c. secure de MySQL installatie met het volgende commando, ik gebruikte de standaard opties;

sudo /usr/bin/mysql_secure_installation

Je moet meteen het zojuist ingevulde wachtwoord gebruiken.

7a. Dan installeren we PHP

sudo apt-get install php5 libapache2-mod-php5 php5-mcrypt

b. Dan is het handig om index.php op te nemen als default document. Dit doe je in een bepaald bestand;

sudo nano /etc/apache2/mods-enabled/dir.conf

Het staat al standaard bij mij zo:

DirectoryIndex index.html index.cgi index.pl index.php index.xhtml index.htm

c. Je kan PHP op je server testen door een info pagina aan te maken. Dit doe je als volgt:

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

In het lege veld vul je in:

< ?php phpinfo(); ?>

daarna kan je dit bestand benaderen via: http://serverip/info.php

Tja, en dan ben je in principe klaar 🙂 Maar zo simpel is het nog niet. Het is verstandig om wat extra modules van PHP te installeren. Zelf wil ik graag WordPress en phpBB kunnen draaien op deze server. Dan heb je het één en ander nodig. Een overzicht vraag je als volgt op:

apt-cache search php5-

8. Dan kan ik deze goed gebruiken: php5-xmlrpc, php5-gd, php5-imagick, php5-json. Dus installeer ik;

sudo apt-get install php5-xmlrpc php5-gd php5-imagick php5-json

Ubuntu hardening

In principe werkt de server nu zoals het moet. Er is alleen een klein probleem als je de server wilt aansluiten op internet. Er zijn namelijk aardig wat mensen die voor de lol in proberen te breken op je server. Ik zie regelmatig mensen die proberen in te loggen via SSH met mijn root-user of van alles proberen in WordPress en andere zaken. Hier kan je het één ander aan doen, ik ga hier wat stappen doorlopen.

1. Stap één, houdt je installatie up-to-date. via een update commando kan je allerlei updates installeren zodat de meest bekende zwakheden van Ubuntu server gedicht zijn.

2. De root gebruiker is de baas van je server, het is niet handig als men daar het wachtwoord van vindt. Daarom is het verstandig om een extra user aan te maken voor het gebruikelijke beheer. Mocht deze bekend worden kan je hem altijd weg gooien en opnieuw aanmaken.

Gebruiker aanmaken:

sudo useradd -d /home/[gebruikersnaam] -s /bin/bash -m [gebruikersnaam]

Geef de gebruiker sudo rechten

sudo usermod -a -G sudo [gebruikersnaam]

Stel een wachtwoord in:

sudo passwd [gebruikersnaam]

Als je nu iets wilt als administrator wilt uitvoeren dan moet je het commando met sudo uitvoeren. Ga je heel veel werk doen is het verstandig om “sudo su” uit te voeren, dan hoef je niet steeds het wachtwoord in te voeren.

3. Dan is het verstandig dat root niet meer in kan loggen. Men geeft nog wel eens de tip dat je root helemaal uit moet zetten, ik houd hem graag beschikbaar als ik wat via het console moet doen. Wel wil ik graag voorkomen dat je root kan gebruiken via SSH.

sudo nano /etc/ssh/sshd_config

Zoek dan “PermitRootLogin” op en zet deze op “no”.

Daarnaast geef root een onmogelijk (en lang) wachtwoord (inspiratie):

sudo passwd root

4. Inloggen met een certificaat voorkomt dat men aan de voordeur van je server met brute force wachtwoorden proberen te raden. Immers heb je een certificaat nodig om in te kunnen loggen via SSH. Hiervoor moet je wel wat stappen doorlopen:

Eerst een key aanmaken op je Mac, deze opslaan in .ssh folder en rechten zo zetten dat alleen jijzelf de folder in kan zien.

mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t rsa

Als je de keygen opstart vraagt hij om een locatie en filename, de standaard van id_rsa is prima. Een passphrase is een versleuteling van de key. Zonder deze versleuteling kan iedereen hem gebruiken. Door een wachtwoord op te geven kan je de key alleen gebruiken als het wachtwoord bekend is, aanrader dus.

Nu moet je de public key verhuizen naar de server waarvoor je hem wilt gebruiken. Persoonlijk heb ik het via SFTP overgezet naar de server. De public key heet: id_rsa.pub. De private key, privé dus enkel voor jou, is opgeslagen in het bestand id_rsa. Allebei te vinden in je homefolder/.ssh

Eenmaal op de server kan je de public key opslaan in een lijstje van keys die de server vertrouwt voor SSH verbindingen. Ik log weer in met mijn useraccount die ik eerder heb aangemaakt en voer het volgende uit. Hierbij ga ik er vanuit dat via SFTP de public key in de home folder staat:

mkdir ~/.ssh
sudo chown -R [gebruikersnaam]:[gebruikersnaam] ~/.ssh
sudo chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub

We hebben een folder aangemaakt voor SSH, ook hier de rechten goed gezet. Het bestand authorized_keys aangemaakt en de public key hier in gezet. Daarna hebben we de public key niet meer nodig en gooien we hem weg. Als je nu een verbinding maakt kan je met je keys inloggen. Let wel dat je nu bij het inloggen je passphrase moet gebruiken.

Om te voorkomen dat men alsnog via de ssh-prompt allerlei wachtwoorden uitprobeert is het verstandig om inloggen met wachtwoorden nu uit te zetten. Immers log je in met een certificaat. Eenmaal ingelogd moet je nog wel het wachtwoord van de user invullen als je admin taken gaat doen door sudo te gebruiken.

sudo nano /etc/ssh/sshd_config

Vind “#PasswordAuthentication yes”. Verander dit naar “PasswordAuthentication no” en sla het bestand op.
Daarna moet de SSH service nog herstart worden:

sudo service sshd restart

en men kan alleen nog met certificaten inloggen. Ik gebruik op de iPhone/iPad Prompt van Panic. Deze kan prima met certificaten ipv inloggen met een wachtwoord omgaan.

5. Secure shared memory, zorg dat gedeeld geheugen niet gebruikt kan worden om onderdelen van je server te ‘besmetten’. Via gedeeld geheugen kan je code van Apache wellicht uitvoeren in het geheugen van MySQL o.i.d.
Ik heb dit aangepast in fstab:

sudo nano /etc/fstab

En daar heb ik de volgende regel toegevoegd:

#secure shared memory
tmpfs     /run/shm    tmpfs	defaults,noexec,nosuid	0	0

Hierna is het verstandig de server even te herstarten.

6. Check je server af en toe op rootkits. Wie weet heeft men het één en ander geïnstalleerd en houd hij/zij zo het één en ander in de gaten bij je.
Installeer de rootkit hunter

sudo apt-get install rkhunter

En voer deze af en toe uit:

sudo rkhunter --update
sudo rkhunter --propupd
sudo rkhunter --check

7. Harden PHP voor de veiligheid
Open de config file:

sudo nano /etc/php5/apache2/php.ini

En dan de volgende instellingen als volgt neerzetten:

expose_php = Off
display_errors = Off
track_errors = Off
html_errors = Off

8. Harden Apache security file

sudo nano /etc/apache2/conf-enabled/security.conf

En let dat de volgende zaken zijn ingesteld:

ServerTokens Prod
ServerSignature Off
TraceEnable Off

9. Zet de firewall aan, ufw was bij mij standaard geïnstalleerd, maar het is een eenvoudige firewall-tool.
Installeren:

sudo apt-get install ufw

En configureren & checken:

sudo ufw allow ssh
sudo ufw allow http
sudo ufw enable
sudo ufw status verbose

PHPMyAdmin installeren

Om het voor mezelf wat beter beheersbaar te houden heb ik nog wat uitbreidingen geïnstalleerd. Eentje daarvan is PHPMyAdmin. Dit is een web-based MySQL beheer tool. Het maakt het werken met MySQL een stuk eenvoudiger, alhoewel het via de command-line ook goed te doen is. PHPMyAdmin installeer je als volgt:

1. Ik neem aan dat je nog verbinding hebt via SSH en dat het niet zo lang is geleden dat je;

sudo apt-get update

gedaan. Dus alles is nog up-to-date.

2a. Dan installeren we PHPMyAdmin met nog wat overige Apache tools.

sudo apt-get install phpmyadmin apache2-utils

b. kies voor Apache2 uiteraard, daarna YES en vul je MySQL root ww in en tot slot het wachtwoord wat je wilt gebruiken om op PHPMyAdmin in te loggen.

3. Dan moeten we PHPMyAdmin nog toevoegen aan Apache, dat doe je als volgt;
a. Open de Apache Configuratie

sudo nano /etc/apache2/apache2.conf

b. En helemaal onderaan het bestand include dan PHPMyAdmin

Include /etc/phpmyadmin/apache.conf

4. Herstart Apache.

sudo service apache2 restart

5. Test de installatie door naar: http://serverip/phpmyadmin te gaan.

Security wat aanschroeven
PHPMyAdmin is best veilig, maar het kan geen kwaad om het nog iets veiliger te maken. Je kan de bestanden zelf ook nog beveiligen zodat alleen geautoriseerde mensen gebruik kunnen maken van PHPMyAdmin. Dan heb je met een bestandsbeveiliging en database beveiliging twee lagen van autoriseren.

1a. Eerst moeten we Apache vatbaar maken voor .htaccess bestanden. Daarin kan je per folder instellingen doen. Dus we openen de config file van Apache.

sudo nano /etc/phpmyadmin/apache.conf

1b. Voeg onder de regel:

AllowOverride All

toe, ik heb het gewoon onder DirectoryIndex index.php gezet.

2a. Nu moeten we het .htaccess bestand maken dat de autorisatie regelt om bij de files te komen. Maak/open de pagina met:

sudo nano /usr/share/phpmyadmin/.htaccess

2b. Plak hier de volgende tekst in:

AuthType Basic
AuthName "Restricted Files"
AuthUserFile /etc/apache2/.phpmyadmin.htpasswd
Require valid-user

AuthType is het type van authenticatie. AuthName is de tekst die je ziet als om het wachtwoord wordt gevraagd. AuthUserFile is de plek waar het wachtwoord bestand zit. Require valid-user houdt in dat je echt het wachtwoord moet opgeven om verder te kunnen.

3. Dan maken we het wachtwoorden bestand aan:

sudo htpasswd -c /etc/apache2/.phpmyadmin.htpasswd username

Vul dan het gewenste wachtwoord in.

4. Test de installatie door naar: http://serverip/phpmyadmin te gaan. Als het goed is wordt je nu om je gegevens gevraagd alvorens je de pagina ziet.

Nu heb je een volledige functionerende server waar je WordPress, phpBB en nog vele andere zaken op kan draaien. Via SFTP kan je er bestanden naar uploaden. Let op dat je dan wel het volgende pad aanhoudt, want hier staat je website:

/var/www/html

Bronnen:

Deze post is tot stand gekomen met de volgende bronnen waar ik hevig op ‘geleund’ heb;
Digital Ocean – How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu
Digital Ocean – How To Install and Secure phpMyAdmin on Ubuntu 12.04
Harden Ubuntu
How to secure an Ubuntu 12.04 LTS server