Unifi Cloud controller beveiligen – Ubuntu 18.04

In het filmpje dat we op youtube hebben gepost kan je zien hoe je een cloud server kan op zetten waar de Unifi software op draait:

Update 23/03/2020: Dit artikel is aangepast aan de nieuwste versie en aanpassingen. Zo is het niet meer mogelijk om bij stap 7 nog Java te installeren van Oracle, maar zal er nu gebruikt worden van OpenJDK.

De Unifi controller kan nu gebruikt worden, maar er zijn toch enkele belangrijke stappen die we moeten ondernemen bij het gebruik van een externe server (cloud, vps of eigen server) die publiekelijk toegankelijk zijn vanaf het internet. Indien je een lokale controller installeert voor je eigen netwerk en deze niet opent naar het internet toe, is dit minder belangrijk.

Momenteel kan de root gebruiker van de server gewoon (proberen) aan te melden via ssh. Dit gaan we dus eerst aanpassen, daarna gaan we een ssh key instellen voor de nieuwe gebruiker, ssh op een andere poort instellen, de firewall activeren en SSL certificaten van Let’s Encrypt (gratis!) installeren

Omdat de meeste Linux servers een root gebruiker heeft en de ssh service gewoonlijk op poort 22 draait, zullen er altijd bots zijn die proberen op je server in te breken. Dit is op zich dus niet veilig, en het veroorzaakt ook een hele hoop verkeer naar je server.

Verschillende pogingen om als root aan te melden

In dit artikel gaan we de installatie uitvoeren op een nieuwe server, maar je kan deze stappen ook uitvoeren als je de Unifi controller reeds geïnstalleerd hebt. Je hoeft dan de installatie van Unifi niet meer te doen, enkel stap 1 tot 6. In deze tutorial werken we met een Vultr server met Ubuntu 18.04.

Als je nog geen server hebt, kan je altijd een account aanmaken bij Vultr via mijn referal link: https://www.vultr.com/?ref=7892425

1. Aanmaken server

In deze tutorial gaan we onze controller installeren op een Vultr server die draait op Ubuntu 18.04. In de uitleg in dit filmpje bovenaan deze pagina kan je zien hoe je een droplet aanmaakt op DigitalOcean, maar de werkwijze bij Vultr is ongeveer hetzelfde.

Je kan deze tutorial ook volgen indien je ergens anders je vps hebt gehuurd of zelf een server hebt staan, zolang hij maar op Ubuntu 18.04 draait.

2. Verbinden met de server

Als je server geïnstalleerd is, krijg je van DigitalOcean een mail met het wachtwoord voor de root gebruiker.

Je kan verbinding maken met je server via ssh. Op Windows kan je hier het gratis programma PuTTY voor installeren, op Linux en MacOS zit in de terminal een ingebouwde ssh tool.

Linux / MacOS

Dit doe je door het volgende commando te typen in de terminal

$ ssh root@x.x.x.x

Het gedeelte voor het @ symbool is dus de gebruiker waarmee je wil aanmelden en achter het @ symbool zet je het IP adres of de hostname/FQDN naam van de server.

Windows

In PuTTY geeft je het IP adres of de hostname op en klik je op de knop Open.

Van zodra je verbinding met ssh hebt gemaakt, vraagt men om eerst het root wachtwoord te wijzigen.

3. Gebruiker aanmaken

We gaan dus eerst een nieuwe gebruiker aanmaken met dezelfde rechten die we gaan gebruiken die we in de toekomst gaan gebruiken om aan te melden via SSH zodat we root toegang via SSH kunnen uitschakelen.

Maak de gebruiker aan met het volgende commando, in dit voorbeeld maken we de gebruiker unifiadmin:

$ adduser unifiadmin

Geef de gebruikersinfo op en stel een wachtwoord in voor de nieuwe gebruiker.
Daarna voegen we de nieuwe gebruiker toe aan de groep “sudo” zodat de nieuwe gebruiker root rechten heeft.

$ usermod -aG sudo unifiadmin

Onze nieuwe gebruiker kan nu ook opdrachten uitvoeren met het sudo commando. Probeer in een nieuw venster te verbinden met je server met het nieuwe account dat je net hebt aangemaakt. Als dit werkt kan je het venster met de root gebruiker afsluiten en dan gaan we verder vanaf deze nieuwe gebruiker.

4. SSH key’s aanmaken

Voor extra beveiliging gaan we onze SSH connectie beveiligen met een public en een private key. De public key staat op de server en de private key gebruiken we met onze ssh client, zoals PuTTY.

In dit voorbeeld maken we de keys aan op een Windows client met PuTTYgen. Als je het volledige pakket van PuTTY installeert, is PuTTYgen automatisch mee geïnstalleerd op je computer.

Open PuTTY Key Generator en klik op de knop “Generate” en beweeg met je muis in het bovenste veld tot de balk vol is. Daarna krijg je het volgende scherm te zien:

Bij Key comment geven we wat informatie mee over de key, zoals bvb Unifi controller, of de naam van de pc/gebruiker als je meerdere pc’s gaat gebruiken om te verbinden via SSH. Dit is niet verplicht, maar wel handig ter informatie.

Daaronder kunnen we een Key passphrase opgeven als extra wachtwoord voor de ssh key te kunnen gebruiken. Dit is ook niet verplicht, je hoeft dan zelfs geen wachtwoord meer in te geven bij het aanmelden via SSH, maar uiteraard is het iets veiliger met een extra wachtwoord

Als de gegevens zijn ingevuld kunnen we de private key opslaan op onze computer. Klik hiervoor op de knop “Save private key” en zet het bestand op een goed afgeschermde plaats, waar geen eventuele andere gebruikers van de computer bij kunnen.

De public key moet worden toegevoegd aan onze server. We kopiëren alvast heel de inhoud van het bovenste veld dat begint met ssh-rsa en gaan terug naar PuTTY.

We maken in de map van onze unifiadmin account een verborgen mapje aan waar we de keys plaatsen en openen een nieuw bestand waar de de public key in gaan plakken.

$ mkdir -p ~/.ssh
$ nano ~/.ssh/authorized_keys

Met PuTTY kan je heel eenvoudig klikken met de rechtermuisknop om de inhoud van je klembord te plakken. Sla het bestand op en sluit nano af.
Daarna moeten we de rechten en eigenaar van de map .ssh veranderen zodat deze public key ook veilig zit op de server.

$ chmod -R go= ~/.ssh
$ chown -R $USER:$USER ~/.ssh

Als we nu een nieuwe sessie van PuTTY openen (zonder de huidige te sluiten voor in het geval dat er iets fout gaat) zou dit werken via de SSH key de wie gegenereerd hebben.

We openen PuTTY en na het ingeven van het IP adres of FQDN gaan we eerst naar Connection -> SSH en klikken dan op Auth. Hier geven we onderaan het .ppk bestand op van de private key.

Geef hier het private key bestand op

5. SSH instellingen wijzigen

Nu we kunnen aanmelden met onze nieuwe gebruiker met de SSH key kunnen we de SSH server nog beter beveiligen door toegang voor root login en het aanmelden met wachtwoorden uit te schakelen. We gaan ook de poort waarop de SSH server luistert aanpassen naar poort 2222.

Open het bestand /etc/ssh/sshd_config en wijzig volgende lijnen:

$ sudo nano /etc/ssh/sshd_config

[…]

Port 2222
PermitRootLogin no
PasswordAuthentication no

Van zodra je de SSH server herstart, kan je niet meer aanmelden met een gewoon wachtwoord, enkel met de SSH key, dus zorg er voor dat je zeker bent dat je ssh key effectief werkt! Je huidige sessie zal voorlopig nog blijven werken met SSH op de oude poort. Herstart SSH met het volgende commando:

$ sudo systemctl restart sshd.service

6. Firewall inschakelen

Het SSH gedeelte is nu degelijk beveiligd. Maar met de firewall gaan we de server nog beter beveiligen en enkel de poorten openen die open moeten zijn.

Ubuntu komt met de UFW firewall, maar deze is standaard niet actief. Eerst gaan we de regels toevoegen die benodigd zijn voor de unifi controller en daarna de firewall zelf activeren.

Eerst gaan we de SSH poort toevoegen aan de firewall. We gebruiken in dit voorbeeld SSH op poort 2222 en niet meer op 22, dus let op dat je hier de juiste poort opgeeft, of je sluit jezelf uit om te verbinden met je server via SSH.

$ sudo ufw allow 2222

Verder gaan we de poorten van de Unifi Controller toevoegen. Poort 8443 wordt gebruikt voor de web interface. Deze moet op zich niet constant geopend worden als je werkt via de Ubiquiti Single Sign On via https://unifi.ubnt.com. Je moet dan enkel deze poort openen bij het koppelen met je cloud account, daarna kan je de regel terug verwijderen. 

$ sudo ufw allow 8443

De volgende poorten moet je wel open zetten. Dit zijn de inform poort waarmee de apparaten verbinding moeten maken om aan te melden op de controller en de STUN poort voor de communicatie tussen de controller en de apparaten te voorzien.

$ sudo ufw allow 3478/udp
$ sudo ufw allow 8080

Als je het portaal voor gasten wil gebruiken van de controller, moet je ook de volgende regels toevoegen;

$ sudo ufw allow 8880
$ sudo ufw allow 8843

Alle regels zijn nu toegevoegd en we kunnen de firewall activeren. Daarna kan je de status bekijken van welke regels er actief zijn:

$ sudo ufw enable
$ sudo ufw status

Verbreek de verbinding met SSH en probeer opnieuw verbinding te maken om te testen of je nog kan aanmelden via poort 2222.

7. Installatie Java 8

Unifi vereist Java 8 om te kunnen draaien. Standaard kan je Java 8 niet installeren uit de bronnen van Ubuntu. Om Java 8 te installeren, gaan we de repository toevoegen van Webupd8 Team. Dit team zorgt er voor dat we Java 8 en 9 nog kunnen installeren op Ubuntu 18.04. Voer de volgende comando’s uit om de repository toe te voegen:

Oracle Java 8 is niet meer gratis te verkrijgen, maar het alternatief is om OpenJDK 8 te installeren, wat trouwens ook eenvoudiger te installeren is:

$ sudo apt update
$ sudo apt install openjdk-8-jdk -y

Ter controle kan je het volgende commando ingeven om te controleren of de installatie gelukt is en je de juiste versie hebt:

$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (build 1.8.0_242-8u242-b08-0ubuntu3~18.04-b08)
OpenJDK 64-Bit Server VM (build 25.242-b08, mixed mode)

8. MongoDB repository

Unifi gebruikt MongoDB om alle gegevens op te slagen in een database. We gaan hier alvast de MongoDB repository toevoegen voor versie 3.4 aangezien Ubuntu 18.04 standaard komt met 3.6, maar Unifi zou beter werken met versie 3.4.De installatie van Unifi zal de installatie van MongoDB verder voor zijn rekening nemen:

$ wget -qO - https://www.mongodb.org/static/pgp/server-3.4.asc | sudo apt-key add -
$ echo "deb https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

9. Ubuntu repositories uitbreiden

Zoals in het begin van deze tutorial al vermeld is geweest, heeft Unifi ook jsvc nodig. Dit kan sinds ubuntu 18.04 niet meer automatisch geïnstalleerd worden en we moeten om dit probleem op te lossen, de repositories uitbreiden van Ubuntu. Open het /etc/apt/sources.list bestand en voeg universe toe zoals hieronder. We openen het bestand met nano, maar je mag je tekstverwerker gebruiken die je het liefst gebruikt.

$ sudo nano /etc/apt/sources.list


deb http://archive.ubuntu.com/ubuntu bionic main universe
deb http://archive.ubuntu.com/ubuntu bionic-security main universe
deb http://archive.ubuntu.com/ubuntu bionic-updates main universe

10. Unifi software installatie

Op het moment van het schrijven van deze tutorial is de laatste versie die je kan installeren via de Unifi repository, versie 5.12.66.

Je kan op de blog van unifi de laatste versie vinden: https://community.ubnt.com/t5/UniFi-Updates-Blog/bg-p/Blog_UniFi en kijk naar de post van Unifi Network Controller.

We gaan in deze stap de Unifi repository toevoegen aan onze server:

$ echo 'deb http://www.ui.com/downloads/unifi/debian stable ubiquiti' | sudo tee /etc/apt/sources.list.d/100-ubnt-unifi.list

En download de GPG key ter beveiliging van Unifi:

$ sudo wget -O /etc/apt/trusted.gpg.d/unifi-repo.gpg https://dl.ui.com/unifi/unifi-repo.gpg

Nu gaan we de pakketlijst updaten en daarna installeren we de Unifi software.

$ sudo apt update
$ sudo apt install apt-transport-https
$ sudo apt install unifi

De installatie van Unifi kan ook een tijdje duren. Als de installatie klaar is kan je de status opvragen van de Unifi service om te controleren of de service effectief goed gestart is.

$ sudo systemctl status unifi.service


● unifi.service – unifi
Loaded: loaded (/lib/systemd/system/unifi.service; enabled; vendor preset: en
Active: active (running) since Thu 2018-08-30 21:44:57 UTC; 14h ago
Main PID: 6110 (jsvc)
Tasks: 887 (limit: 1110)
CGroup: /system.slice/unifi.service
├─6110 unifi -cwd /usr/lib/unifi -home /usr/lib/jvm/java-8-oracle/jre
├─6112 unifi -cwd /usr/lib/unifi -home /usr/lib/jvm/java-8-oracle/jre
├─6113 unifi -cwd /usr/lib/unifi -home /usr/lib/jvm/java-8-oracle/jre
├─6129 /usr/lib/jvm/java-8-oracle/jre/bin/java -Dfile.encoding=UTF-8
└─6976 bin/mongod –dbpath /usr/lib/unifi/data/db –port 27117 –unix
Aug 30 21:44:39 unifi systemd[1]: Starting unifi…
Aug 30 21:44:39 unifi unifi.init[6014]: * Starting Ubiquiti UniFi Controller un
Aug 30 21:44:57 unifi unifi.init[6014]: …done.
Aug 30 21:44:57 unifi systemd[1]: Started unifi.

Als de status op active (running) staat en onderaan de regel “Started unifi” verschijnt, is de controller gestart. Je kan de interface openen via het IP adres of de hostname/FQDN van de server: https://[IP adres of FQDN]:8443. Je ziet dan de wizard om de controller in te stellen.

Na het doorlopen van de wizard, kunnen we verder gaan met de beveiliging. Het enige wat we nu nog moeten doen is een SSL certificaat aanmaken en installeren op de Unifi controller.

11. SSL certificaten

Voor Let’s Encrypt certificaten aan te maken en automatisch te laten vernieuwen, installeren we de certbot tool op onze server. Je mag de certbot gewoon downloaden in de home folder van je account.

$ wget https://dl.eff.org/certbot-auto
$ chmod a+x certbot-auto
$ ./certbot-auto

Het laatste commando hierboven installeert certbot en de benodigde pakketten. In de volgende stap gaan we de wizard uitvoeren, maar eerst gaan we poort 80 openen in onze ufw firewall. De certbot gaat een tijdelijke webserver opzetten om controle uit te voeren voor de certificaten gemaakt worden. 

$ sudo ufw allow 80

En daarna starten we de wizard:

$ ./certbot-auto certonly

We starten de wizard met de optie “certonly”, aangezien we enkel het certificaat nodig hebben. De wizard kan ook automatisch het certificaat installeren bij webservers zoals Apache en Nginx, maar dit is voor ons niet van toepassing aangezien Unifi een eigen webserver opzet.

Kies optie 1 voor het opzetten van een tijdelijke webserver. Deze webserver draait op poort 80, dus je moet zeker zijn dat deze poort open staat op je firewall. Vul daarna de gegevens in die gevraagd worden zoals een email adres en de domeinnaam waarvoor het certificaat wordt aangevraagd.

Als het aanmaken van de certificaten gelukt is, kan je ze terug vinden in de volgende map:

/etc/letsencrypt/live/unifi.domein.be

We moeten het certificaat exporteren naar een PKCS #12 certificaat om dit te kunnen importeren naar de Java key store die unifi gebruikt.

$ sudo openssl pkcs12 -export -inkey /etc/letsencrypt/live/unifi.domein.be/privkey.pem -in /etc/letsencrypt/live/unifi.domein.be/fullchain.pem -out /home/unifiadmin/cert.p12 -name ubnt -password pass:tijdelijkwachtwoord

Vergeet in bovenstaand commando de domeinnaam en je gebruiksnaam aan te passen!

Daarna gaan we het bestand cert.p12 moeten importeren in de Java key store, dit doen we met het volgende commando, vergeet ook hier niet je gebruikersnaam aan te passen:

$ sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/keystore -srckeystore /home/unifiadmin/cert.p12 -srcstoretype PKCS12 -srcstorepass tijdelijkwachtwoord -alias ubnt -noprompt

We kunnen na het importeren het bestand cert.p12 verwijderen en de unifi service herstarten.

$ rm cert.p12
$ sudo systemctl restart unifi.service

Het herstarten van de unifi kan wel enkele minuten duren. Het zou kunnen dat je de browser even moet afsluiten voor je browser verwerkt heeft dat je certificaat veranderd is.

12. Certificaat automatisch updaten

Als laatste moeten we nog een taak toevoegen zodat het certificaat automatisch kan worden geupdate, aangezien een Let’s Encrypt certificaat maar 3 maanden geldig. 

We maken een bestand aan in onze home map waar we het script in zetten:

$ nano renew_le_cert.sh

We gaan er dan onderstaande tekst in zetten. Opgelet, ook hier moeten we de juiste domeinnaam opgeven en eventueel de gebruikersnaam aanpassen.

# Ontvang en verleng de LetsEncrypt certificaten
/home/unifiadmin/certbot-auto renew –quiet –no-self-upgrade
# Converteer het certificaat naar PKCS #12 formaat
openssl pkcs12 -export -inkey /etc/letsencrypt/live/unifi.domein.be/privkey.pem -in /etc/letsencrypt/live/unifi.domein.be/fullchain.pem -out /home/unifiadmin/cert.p12 -name ubnt -password pass:temppass
# Laad het certififaat in je Java Key store dat Unifi kan openen
keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/keystore -srckeystore /home/unifiadmin/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias ubnt -noprompt
# Opruimen bestanden en herstart Unifi
rm /home/unifiadmin/cert.p12
systemctl restart unifi.service

We moeten dit script nog uitvoerbaar maken.

$ chmod +x renew_le_cert.sh

Nu kunnen we dit script gaan plannen in de crontab. We gaan dit script elke maandag om 2 uur laten uitvoeren.

$ sudo crontab -e

De eerste keer dat we contab -e uitvoeren vraagt hij welke editor we willen gebruiken, standaard staat dit op nano, dus drukken op enter en het document opent in nano. We voegen onderstaande lijn toe onderaan in het document:

0 2 * * 1 /home/unifiadmin/renew_le_cert.sh

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.