VPS med Debian Server 18.04 med UFW & Fail2Ban

05 Apr 2020

debian fail2ban server ssh

TL;DR (kom igång)

När jag började bryta mig loss och försöka minimalisera mitt avtryck på internet och hos tjänster som säljer min data, så kändes det väldigt naturligt och självklart att själv hosta det jag kan och behöver. Dels för att jag gillar att ha kontroll men jag gillar också att lära mig saker. Jag hade aldrig tidigare haft en egen server, bara något webbhotell förr i tiden. Jag hade ingen möjlighet att själv ha en fysisk server hemma, så jag bestämde mig för att skaffa en VPS. En VPS är, kort förklarat, en virtuell server i en fysisk server. Detta betyder att när du först skapar din VPS, får du en blank distribution som du installerar vad du vill ha på den. Priserna varierar beroende på hur mycket kraft du behöver. För privat bruk tror jag att man oftast klarar sig på dom billigare alternativen. Med det jag hostar har jag aldrig haft några problem med att CPU eller RAM-minnet inte räckt till, och jag kör den näst billigaste varianten hos Hetzner. Börjar utrymmet ta slut går det att köpa endast extra utrymme också.

Det finns många anledningar att hosta saker själv. För min egen del så vill jag inte att min och andras data ska flöda omkring överallt, hos oetiska företag som säljer och tjänar pengar på den, eller att dom inte tar säkerheten på allvar och att uppgifter läcker på det sättet. Man bestämmer självklart vad man gör med sin egen data, men dom flesta av oss har även information om andra i våra telefoner och andra enheter. Både bilder, kontakter och kanske annat. Där tycker jag att vi har en skyldighet att inte synka våra kontakter med t.ex. Google eller Apple.

Det jag hostar

  • Miniflux
    Ger mig möjlighet att följa nyheter, releaser och annat via RSS flöden. Minimalistisk, snabb och simpel. Funkar även som PWA, vilket jag uppskattar stort. Finns även möjlighet att med ett knapptryck spara artiklar direkt till min Wallabag-instans

  • Wallabag
    Spara artiklar för senare läsning, länkar och annat. Likt pocket, men med öppen källkod

  • Nextcloud
    Självhostad cloud. Jag använder sällan molnet för att synka filer, däremot använder jag många appar som finns till Nextcloud. Här synkar jag bland annat mina kontakter till telefonen, kalender, noteringar och tasks.

  • Prosody/XMPP/Jabber
    Jag har nyligen satt upp en XMPP-server. Finns många publika etiskt tillfredställande servrar, men då jag vill försöka få över folk i min närhet kände jag att det är bäst att hosta en egen.

  • Weechat
    IRC-klient. Hostar den på min VPS för att slippa ha en bouncer, men samtidigt hålla mig ansluten

Okej, men hur kommer vi igång?

Är man helt ny när det kommer till GNU/Linux, eller inte känner sig helt bekväm med att använda terminalen, så kan det vara lite knepigt att komma igång. Då detta är som en egen server, så måste den underhållas, uppdateras och se till att den är säker från utomstående hot. Jag är ingen expert, och det finns säkert massor med saker man kan och bör göra som jag inte tar upp här.

Det blev en mindre vägg av text, så nu sätter vi igång.

När vi är klara kommer vi att ha installerat Debian 18.04 Server med en användare med root-rättigheter, en SSH-nyckel att ansluta med, UFW och Fail2Ban.

Innan du skapar din VPS

En SSH-nyckel är viktig för din säkerhet. Är detta helt nytt för dig kan det vara bra att läsa lite om hur det funkar och vad det finns för alternativ till en standardnyckel med kommandot nedan. En källa för information är ssh.com

Om du inte redan har en SSH-nyckel så bör vi först skapa en. Vi kommer använda denna istället för ett lösenord för att logga in på vår VPS, för att höja säkerheten en aning. Se dock till att välja en starkt lösenord till din nyckel, MEN glöm inte bort det. Då kommer du inte komma åt din VPS igen.

Öppna din terminal och kör kommandot ssh-keygen. Körs den utan flaggor får vi denna output

$ ssh-keygen                       
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:BTX7[...]qa0Q user@host
The key's randomart image is:
+---[RSA 3072]----+
|*+ooo   ..o   .  |
|. o+ o o o + . + |
| +  + * o + + . o|
|oE   o o . o = + |
|o       S   = X o|
| o         . % * |
|. .         B =  |
| o         o     |
|.                |
+----[SHA256]-----+

Detta ger dig två filer i ~/.ssh

  • id_rsa.pub - detta är din publika nyckel, som du laddar upp på servern
  • id_rsa - detta är din privata nyckel. Denna jämförs med den publika nyckeln på servern, om den överensstämmer så kommer du kunna logga in, annars inte.

Detta betyder att om någon ska kunna ta sig in på din server, så måste dom ha denna fil först, plus ditt lösenord för nyckeln i sig. Detta är givetvis mycket säkrare än att bara ha ett lösenord för att komma åt din server.

Nu har du en SSH-nyckel. Jag rekommenderar att du lägger till denna direkt när du skapar din VPS. Kopiera HELA värdet på raden under ditt kommando och ange denna som nyckel.

$ cat .ssh/id_rsa.pub 
ssh-rsa AAAA[...]LI8= user@host

Logga in och uppdatera systemet

Nu kan vi logga in till vår VPS via SSH, har du inte anslutit till detta ip tidigare så kommer du få ett meddelande liknande detta

$ ssh root@<ip>
The authenticity of host '<ip> (<ip>)' can't be established.
ECDSA key fingerprint is SHA256:p5Ew[...]a/PQ.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '<ip>' (ECDSA) to the list of known hosts.
root@<ip>'s password: 

Notera att om din nyckel har ett annat namn än id_rsa eller ligger på en annan plats så måste du använda -i-flaggan med sökväg till din nyckel.

Det första vi måste göra är att se till att allt är uppdaterat

# apt update && apt upgrade

Skapa en användare

Nu kan vi skapa en användare och ge den root rättigheter. Så fort vi har nekat root-login (lite längre ner) så kommer vi behöva denna användare för att logga in på vår VPS nästa gång

# adduser <användare> && usermod -aG sudo <användare>

flaggan -aG (–append / –groups) innebär att vi lägger till vår användare i gruppen ‘sudo’

SSH

Först måste vi kopiera vår SSH-nyckel från root användaren till vår nya användare

# rsync --archive --chown=<användare>:<användare> /root/.ssh /home/<användare>/

Här är det viktigt att ‘.ssh’ inte avslutas med ‘/’ för då kommer filen att hamna i din användares root-dir istället för i mappen ‘.ssh/’

Nu vill vi neka åtkomst till root-användaren via SSH samt kräva din SSH-nyckel istället för lösenord vid anslutning

# vim /etc/ssh/sshd_config

Leta upp följande rader, ta bort eventuell # och ändra alla värden till no

PermitRootLogin
PasswordAuthentication
UsePAM
ChallengeResponseAuthentication

Spara och avsluta med :wq

Nu måste vi starta om SSH med

# systemctl reload ssh

Brandvägg

Som default blockerar UFW alla anslutningar, så vi måste tillåta ssh, http och https och aktivera brandväggen

# ufw default deny && ufw allow 22 && ufw allow 80 && ufw allow 443 && ufw enable

Avsluta med att svara ‘yes’. Nu tillåts trafik via SSH, HTTP och HTTPS.

Fail2Ban

Fail2Ban håller koll på vilka som försöker ansluta till din server via SSH. Med hjälp av detta program så kan vi banna ip’s som upprepade gånger försöker ansluta men misslyckas

Ladda ner fail2ban

# apt install fail2ban

Först måste vi kopiera konfigurationsfilen:

# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Efter det måste vi ändra i filen som slutar med .local:

# vim /etc/fail2ban/jail.local

Här ändrar vi några saker till valfria värden, nedan är mina

bantime = 60
findtime = 30
maxretry = 3

Referens för värdena:

bantime = Antal minuter som ban ska gälla
findtime = Inom vilken intervall inloggningsförsöken måste ske
maxretry = Hur många försök som får göras inom värdet för findtime innan ban

Och sen letar vi upp raden [sshd] och lägger till

enabled = true

Nu har vi:

  • Skapat en användare med root-rättigheter
  • Aktiverat brandvägg och tillåtit SSH, HTTP och HTTPS
  • Aktiverat Fail2Ban för att hitta och banna återkommande misslyckade anslutningar via SSH