De RPi beveiligen

Doel 

De RPi op zo'n manier beveiligen dat hij veilig toegankelijk is vanaf internet.

Benodigdheden 
Tutorial 

De RPi die we hebben opgezet in de Beginners tutorial werkt maar om hem veilig via internet te benaderen moeten we nog wat dingen veranderen. De onderstaande lijst geeft wat punten die op dit moment niet veilig zijn.

  • Mogelijk is je root wachtwoord nog het standaard wachtwoord, zeker als je nog niets hebt veranderd en je hebt een image van de image pagina gebruikt.
  • Je gebruikt root voor dagelijkse bezigheden, als root kun je per ongeluk je hardschijf wissen met 1 commando in fractie van een seconde. Het is veiliger om een normale gebruiker aan te maken
  • Root mag inloggen via SSH, mensen die proberen in te loggen weten in ieder geval al een gebruikersnaam en kunnen rustig duizenden wachtwoorden uitproberen.
  • Om toch toch af en toe administratieve taken als normale gebruiker, en dus tijdelijk de rechten van root te lenen, kunnen we beter "sudo" gebruiken dan "su".
  • SSH werkt nog over de standaard poort, op poort 22 proberen scripts constant in te loggen, als dat lukt hebben ze volledige controle over je Pi en toegang tot je persoonlijke netwerk
  • Er is geen firewall, iedereen kan proberen in te loggen en van alles aan informatie uitlezen over je RPi
  • Dit heeft niet echt iets met veiligheid te maken maar het is handig als je RPi een naam heeft en een syslogger heeft om de log files wat logischer in te delen. En tot slot is zoeken in je command geschiedenis is ook erg handig.

Het root wachtwoord veranderen

Log in op RPi via SSH (als root). We veranderen meteen ons wachtwoord, typ:
passwd
en geef 2 keer je nieuwe wachtwoord op.

Een normale gebruiker aanmaken

Ik ga de gebruiker "freek" aanmaken, dat mag je ook doen maar ik raadt je aan je eigen naam te gebruiken, typ (en verander mijn naam):
useradd -m -g users -G wheel -s /bin/bash freek
(-m maakt automatisch /home/freek aan en maakt dat mijn home directory, -g geeft mijn primaire groep aan, hier users, -G geeft additionele groepen aan, hier "wheel" wat mij wat meer rechten geeft dan een standaard gebruiker, deze groep kunnen we later gebruiken om de mensen die "sudo" mogen gebruiken te beperken, -s laat me een shell kiezen, bash is de standaard shell.)
typ nu:
passwd freek
en geef een wachtwoord voor freek op. Nice, je kunt nu ipv als root ook als freek inloggen, test dit maar meteen door uit te loggen (ctrl-d) en weer in te loggen (via SSH) als freek ipv root.

Root niet meer laten inloggen via SSH

Iedereen weet dat jij root als gebruiker op je RPi hebt en als jij dus je RPi zo een tijdje online laat staan zul je zien dat er veel mensen gaan proberen in te loggen door middel van "woordenlijst aanvallen". Als root niet kan inloggen loop je dus minder risico. Je moet wel root zijn om de volgende instellingen te wijzigen, je kunt namelijk altijd nog root worden door te typen:
su
geen je root wachtwoord en de sshd config file met nano:
nano /etc/ssh/sshd_config
en haal het hekje weg voor:
#PermitRootLogin yes (dit wordt dus #PermitRootLogin yes)
Sluit de file, ctrl-x, Y, enter. Herstart de SSH daemon:
systemctl restart sshd

sudo installeren

Het is veiliger om voor een taak even wat rechten te lenen van root dan helemaal root te worden en per ongeluk bijvoorbeeld al je configuratie bestanden weg te gooien. Bovendien is het heel handig voor het gebruik van Yaourt (zie: Yaourt installeren ). Installeer eerst het programma sudo:
pacman -Sy sudo
Open nu visudo, dit gaat normaal met de erg gebruiksonvriendelijke (meer op de 1337 hacker gerichte) editor "vi" maar het kan ook gewoon met nano middels het volgende commando:
EDITOR=nano visudo
Wij willen dat leden van de groep "wheel" sudo kunnen gebruiken dus halen we de "#" weg voor:
# %wheel ALL=(ALL) ALL
Sluit de file, ctrl-x, Y, enter.
Test je nieuwe krachten door uit te loggen als root en weer gewoon gebruiker te worden (ctrl-d) en te typen:
sudo pacman -Syu
Je krijgt een wijze les die Spiderman ook ooit van Uncle Ben kreeg waarna je je eigen wachtwoord mag opgeven... en het commando wordt uitgevoerd met tijdelijke root privileges. Wordt nu maar weer root (su) want dat moet je weer zijn voor de volgende stappen al kun je ook alle volgende commando's als jezelf uitvoeren door er steeds sudo voor te zetten.

De standaard SSH poort veranderen

Zo, men kan niet meer als root inloggen maar men zal het proberen, men zal elke seconde proberen om in te loggen op je RPi. Ik geloofde zelf mijn ogen niet toen ik de log bestanden zag van netje op alfabet geordende inlog pogingen die dag en nacht doorgaan. Het internet is een jungle, wees blij dat je achter de firewall van je router zit. Tenminste, ooit wil je van buiten je RPi in SSH-en en dan zul je gaten moeten maken in je firewall en je RPi blootstellen aan het brute, harde internet. Gelukkig kunnen we de ellende al een stuk minder erg maken door de SSH daemon niet meer op de standaard poort (22) te laten luisteren maar bijvoorbeeld op 2222. We open weer de sshd config file:
nano /etc/ssh/sshd_config
We halen de # weg voor:
#Port 22
en veranderen he nummer naar 2222, dan staat er dus:
Port 2222
Sluit de file, ctrl-x, Y, enter. Herstart de SSH daemon:
systemctl restart sshd Let op, als je nu uitlogd kun je niet meer op dezelfde manier inloggen, je zult het poort nummer moeten aangeven, in putty (Windows) of in een terminal (osX en Linux), bijvoorbeeld:
ssh -l freek -p 2222 192.168.1.3
(-l geeft de gebruiker aan die je wilt inloggen, -p het poortnummer wat we net hebben gewijzigd.)

Een firewall installeren

Ook al staat je RPi achter de firewall van je router, het is toch fijn als mensen niet zomaar van alles aan informatie aan je besturingssysteem kunnen onttrekken, bijvoorbeeld om te kijken of je software met bekende exploits draait. Ook wil je soms bepaalde service alleen bereikbaar hebben vanaf je eigen netwerk of vanaf een bepaalde computer. Dit soort dingen doe je met een firewall. Nu was vroeger een firewall draaien erg complex (met iptables bijvoorbeeld) maar tegenwoordig hebben de "Uncomplicated Firewall", UFW. Installeer UFW:
pacman -S ufw
(er worden wat dependencies geïnstalleerd, het kan even duren.)
Nu komen we bij een vreemde fout, ufw kan niet draaien als ipv6 niet is geactiveerd, je krijgt de volgende foutmeldingen als je probeert firewall regels toe te voegen:
OSError: [Errno 2] ip6tables v1.4.21: can't initialize ip6tables table `filter': Address family not supported by protocol
Dus moeten we eerst ipv6 aanzetten. Gelukkig is dat heel makkelijk:
nano /boot/cmdline.txt
verander ipv6.disable=1 in ipv6.disable=0
De RPi moet nu opnieuw opstarten om de nieuwe kernel parameters te laden:
reboot
Als de RPi weer online is log je in als jezelf en wordt je weer root (su).
Start ufw:
systemctl start ufw
en zorg dat ufw ook na reboots opstart:
systemctl enable ufw
Voer de volgende regels in (1 voor 1):
ufw default deny
ufw limit 2222

We hebben ufw eerst verteld om niks toe te laten maar vervolgens maken we een uitzondering voor poort 2222, onze SSH poort, met limit geven we aan dat er maar een beperkt aan keer geprobeerd mag worden in te loggen, als er te vaak een poging wordt gedaan gaat de poort dicht. Als we deze uitzondering niet zouden maken zouden we straks niet meer kunnen inloggen via SSH. Zet ufw aan:
ufw enable (en kies "y")
Je kunt nu zien wat ufw precies blokkeert met:
ufw status
Stel dat je nu een webserver zou gaan draaien dan moet je poort 80 openen en zou je als je (als root) typen: ufw allow http of ufw allow 80, dat komt op hetzelfde neer.

De hostnaam wijzigen

Het is handig als je RPi zichzelf met een bepaalde naam identificeert die je zelf hebt verzonnen, dit doe door de file /etc/hostname te wijzigen:
nano /etc/hostname
vervang alarmpi door een leuke naam, zonder spaties of rare tekens. Sluit de file, ctrl-x, Y, enter. Na een reboot heeft je RPi die naam (de naam zul je bijvoorbeeld terug zijn in je router en op command line.)

Een syslogger installeren

pacman -S syslog-ng
systemctl start syslog-ng
systemctl enable syslog-ng

Met de pijltjes toetsen zoeken in de commando's die eerder heb ingevoerd

nano ~/.inputrc
Plak deze tekst in de file:
## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward

Bronnen