# đ SSH Key-based Authentication â Ăvelse
> [!info] Om denne Ăžvelse
> **Tid:** 45â60 minutter
> **Form:** Parvis â begge studerende genererer hver sit nĂžglepar og logger ind selvstĂŠndigt
> **MĂ„l:** Generere SSH-nĂžglepar, dele public keys med hans via Canvas grupperum, logge ind pĂ„ en fĂŠlles Ubuntu-server i [UpCloud](https://upcloud.com/) â og bagefter undersĂžge hvad der sker i logfilerne nĂ„r nogen forsĂžger at bryde ind.
---
> [!tip] LÊringsmÄl
> Hvad kan du nÄr du er fÊrdig med denne Þvelse?
> - Generere et SSH-nĂžglepar med `ssh-keygen` i terminal / PowerShell
> - Forklare forskellen pĂ„ **public key** og **private key** â og hvad der mĂ„ deles
> - Etablere en SSH-forbindelse til en remote server vha. key-based authentication
> - LĂŠse og fortolke systemlogfiler med `cat`, `tail`, `grep` og `tail -f`
> - Identificere et konkret logon-forsĂžg i `auth.log` ud fra en reel hĂŠndelse
---
> [!abstract] Baggrund
> I er ved at forbinde jer til en **Ubuntu 24.04 LTS**-server der kÞrer pÄ **UpCloud** i et europÊisk datacenter.
>
> UpCloud krĂŠver at en SSH public key uploades **inden** en maskine (VM) kan oprettes. Password-login til root er deaktiveret som standard. Det er et bevidst designvalg der fjerner den letteste angrebsvej: automatiserede brute force-angreb mod password-login.
>
> **Begge** i bodymakker teamet genererer deres eget nĂžglepar. Begge nĂžgler installeres pĂ„ den samme server â sĂ„ I kan logge ind uafhĂŠngigt af hinanden med jeres respektive nĂžgler.
---
## Del 1 â Begge genererer hvert sit SSH-nĂžglepar
> [!note] Begge udfĂžrer disse trin â uafhĂŠngigt og pĂ„ jeres egne maskiner
---
### Trin 1 â Ă
bn terminal
**macOS / Linux:** Ă
bn `Terminal`
**Windows:** Ă
bn `PowerShell` eller `Windows Terminal`
Verificér at SSH er tilgÊngeligt:
```powershell
ssh
```
Du bĂžr se noget i stil med:
```powershell
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address]
[-c cipher_spec] [-D [bind_address:]port] [-E log_file]
[-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file]
[-J destination] [-L address] [-l login_name] [-m mac_spec]
[-O ctl_cmd] [-o option] [-P tag] [-p port] [-Q query_option]
[-R address] [-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]]
destination [command [argument ...]]
```
> [!warning] Hvis ssh ikke findes pÄ Windows
>Vil du fÄ dette output
>```powershell
>PS C:\Users\hans> ssh
ssh: The term 'ssh' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
>```
>Du skal nu installere OpenSSH pÄ din maskine ser mere hos [MS learn](https://learn.microsoft.com/en-us/windows-server/administration/openssh/openssh_install_firstuse?tabs=powershell&pivots=windows-11)
>```powershell
>Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
>```
>```powershell
>Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
>```
---
### Trin 2 â Generer dit nĂžglepar
KĂžr fĂžlgende â erstat `dit-navn@skole` med din skolemail:
```bash
ssh-keygen -t ed25519 -C "dit-navn@skole"
```
Du vil blive spurgt om tre ting:
**1. Placering:**
```
Enter file in which to save the key (~/.ssh/id_ed25519):
```
Tryk **Enter** for standardplacering.
**2. Passphrase:**
```
Enter passphrase (empty for no passphrase):
```
VĂŠlg en passphrase du kan huske â eller tryk **Enter** for ingen (acceptabelt i ĂžvelsessammenhĂŠng).
Ta' en hurtig snak i makkerparret om hvad tilfĂžjelse af et password tilfĂžjer af sikkerhed.
**3. Gentag passphrase:** Tast igen og tryk **Enter**.
---
### Trin 3 â VerificĂ©r filerne
**macOS / Linux:**
```bash
ls -la ~/.ssh/
```
**Windows (PowerShell):**
```powershell
dir $env:USERPROFILE\.ssh\
```
Du bĂžr se to filer:
- `id_ed25519` â **din private nĂžgle** â forlader aldrig din maskine
- `id_ed25519.pub` â **din public key** â den du deler
---
### Trin 4 â Se din public key
**macOS / Linux:**
```bash
cat ~/.ssh/id_ed25519.pub
```
**Windows (PowerShell):**
```powershell
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub
```
Output ser nogenlunde sÄdan ud:
```
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... dit-navn@skole
```
> [!danger] Vigtigt
> Del **udelukkende** indholdet af `.pub`-filen.
> Del **aldrig** indholdet af `id_ed25519` (uden `.pub`) â med nogen, nogensinde. ever! punktum!
---
## Del 2 â Del jeres public keys med HH
> [!note] Begge uploader hver sin public key
> GĂ„ ind i jeres **Canvas-grupperum** og indsĂŠt indholdet af jeres `.pub`-fil.
> Skriv dit navn tydeligt over din nÞgle sÄ jeg ved hvem der ejer hvilken.
>
> Jeg opretter en Ubuntu-VM pÄ UpCloud med **begge nÞgler installeret**.
> **I fĂ„r en IP-adresse tilbage** â vent pĂ„ besked.
---
**Mens I venter â diskutĂ©r:**
Find link i Canvas til at indsende jeres svar
> [!question] Refleksion
> **SpÞrgsmÄl 1:** Hvad ville der ske, hvis I ved en fejl indsatte den private nÞgle i stedet for `.pub`-filen?
>
> **SpÞrgsmÄl 2:** Begge jeres public keys installeres pÄ samme server. Betyder det at I kan se hinandens private nÞgler? Forklar hvorfor eller hvorfor ikke.
---
## Del 3 â Log ind pĂ„ serveren
NĂ„r I har modtaget en IP-adresse, logger **begge** ind â fra jeres egen laptop:
```bash
ssh root@<IP-ADRESSE>
```
> [!warning] FĂžrste gang I forbinder
> SSH spÞrger om I stoler pÄ serveren:
> ```
> The authenticity of host '...' can't be established.
> ED25519 key fingerprint is SHA256:...
> Are you sure you want to continue connecting (yes/no)?
> ```
> Skriv `yes` og tryk **Enter**.
Verificér at I begge kan logge ind selvstÊndigt:
**Hvem er I logget ind som?**
```bash
whoami
```
**Er I begge pÄ serveren pÄ samme tid?**
```bash
who
```
Log ud fra serveren. ForsÞg hvor én af jer tilgÄr internettet via et hotspot via en mobil telefon. Gentag ovenstÄende inspektion af hvem som er logget ind og hvilke oplysninger i kan se. Hvad har Êndret sig?
---
## Del 4 â UndersĂžg logfilerne
> [!abstract] Baggrund
> Linux/ubuntu logger alle autentificeringshĂŠndelser i `/var/log/auth.log` â SSH-loginforsĂžg, vellykkede logins, fejlede forsĂžg og meget mere. I skal nu lĂŠre tre mĂ„der at lĂŠse denne fil pĂ„, fra overblik til live overvĂ„gning.
---
### 4a â Overblik med cat
`cat` udskriver hele filens indhold:
```bash
sudo cat /var/log/auth.log | less
```
Brug **pil op/ned** til at navigere, `q` for at afslutte.
Hvad ser I? Notér jeres fÞrste observationer:
Hvad sker der hvis du anvender `more` i stedet for `less`
---
### 4b â De seneste hĂŠndelser med tail
`tail` viser de **sidste linjer** af en fil:
```bash
sudo tail -10 /var/log/auth.log
```
**SpÞrgsmÄl:** Ser I mislykkede SSH-loginforsÞg? Fra hvilke IP-adresser, og hvad forsÞger de at logge ind med?
> [!info] Det I sandsynligvis ser
> Selv en splinterny server vil have modtaget automatiserede angrebsforsÞg inden for de fÞrste minutter efter opstart. Bots scanner kontinuerligt alle public IP-adresser pÄ port 22 og prÞver kendte brugernavne som `root`, `admin`, `test`, `ubuntu`.
> Dette er **path of least resistance** i praksis â og netop det key-based authentication beskytter imod.
---
### 4c â FiltrĂ©r med grep
`grep` finder kun de linjer der matcher et mĂžnster:
**Alle mislykkede forsĂžg:**
```bash
sudo grep "Failed password" /var/log/auth.log
```
**Alle vellykkede logins:**
```bash
sudo grep "Accepted publickey" /var/log/auth.log
```
**Ukendte brugernavne der er forsĂžgt:**
```bash
sudo grep "Invalid user" /var/log/auth.log
```
**Kombinér tail og grep:**
```bash
sudo tail -100 /var/log/auth.log | grep "Invalid user"
```
> Notér brugernavne der forsÞges, antal forsÞg og IP-adresser I finder:
---
### 4d â Live overvĂ„gning med tail -f
`tail -f` holder filen Äben og viser **nye linjer lÞbende i realtid**:
```bash
sudo tail -f /var/log/auth.log
```
Lad kommandoen kĂžre i baggrunden.
**Ăn person holder `tail -f` kĂžrende. Den anden Ă„bner en ny terminal** og logger ind pĂ„ serveren igen:
```bash
ssh root@<IP-ADRESSE>
```
**SpÞrgsmÄl:** Hvad ser den der overvÄger loggen? Find linjen der viser det vellykkede login og skriv den ned:
Tryk **Ctrl + C** for at stoppe `tail -f` nÄr I er klar til at gÄ videre.
---
## Del 5 â GruppeĂžvelse: Find brugernavnet i loggen
> [!note] Koordinering
> Find sammen med en nabo-gruppe og fortÊller hvem der starter som "angribere" og hvem der starter som "forsvarere". Nabo-gruppen forsÞger at logge ind pÄ **jeres** server, og I skal finde ud af hvad de kaldte sig.
---
### Forsvarer-rollen â jeres gruppe
Start live-overvÄgning af jeres log:
Jeres opgave er at **identificere det brugernavn** nabo-gruppen bruger nÄr de forsÞger at logge ind.
Hvilken kommando anvender du til ovenstÄende?
---
### Angriber-rollen â nabo-gruppen gĂžr dette mod jeres server
De vĂŠlger et vilkĂ„rligt brugernavn â **et tilfĂŠldigt ord, ikke et rigtigt brugernavn** â fx `pirat`, `ninja`, `hacker`, `kaffe`. De aftaler det internt og fortĂŠller det **ikke** til jer.
De forsÞger at logge ind pÄ jeres server:
```bash
ssh <valgt-brugernavn>@<JERES-IP-ADRESSE>
```
Login fejler â det er meningen. Det efterlader alligevel et spor i jeres log.
---
**Hvad var brugernavnet nabo-gruppen valgte?**
**Hvilken linje i loggen afslĂžrede det?**
Er der en mÄde at se linjenummer pÄ?
Hvordan henter i bedst en kopi af auth.log ned pÄ jeres egen maskine til "offline" analyse og efterforskning?
---
### Skift roller
Nu bytter I. I vÊlger et brugernavn og forsÞger at logge ind pÄ nabo-gruppens server. De overvÄger deres log og skal finde jer.
**Det brugernavn I valgte:**
**Fandt de det? Hvor hurtigt?**
---
## Del 6 â Afsluttende refleksion *(ca. 5 min)*
**SpÞrgsmÄl 1**
I sÄ at serveren allerede var under angreb fra bots kort efter opstart. Hvad fortÊller det jer om vigtigheden af at deaktivere password-login fra sekund ét?
**SpÞrgsmÄl 2**
Brugernavnet optrĂ„dte i klartekst i `auth.log`. Hvad er implikationen for en administrator â hvad bĂžr man gĂžre med den slags logfiler over tid?
**SpÞrgsmÄl 3**
Hvilken risikobehandlingsstrategi svarer det til at UpCloud tvinger key-based authentication frem som eneste mulighed? Og hvad er restrisikoen â hvad beskytter SSH-nĂžgler **ikke** imod?
---
> [!success] Tjekliste â er I i mĂ„l?
>
> - â Vi har begge genereret vores eget Ed25519-nĂžglepar
> - â Vi har begge uploadet vores public key via Canvas-grupperum
> - â Vi har begge logget ind selvstĂŠndigt pĂ„ serveren med vores egne nĂžgler
> - â Vi har undersĂžgt auth.log med `cat`, `tail` og `grep`
> - â Vi har brugt `tail -f` til live overvĂ„gning og set vores eget login dukke op
> - â Vi har identificeret nabo-gruppens valgte brugernavn fra loggen
> - â Vi kan forklare hvad en linje i auth.log betyder
---
> [!cite] Kilder og videre lĂŠsning
> - A. Sequeira, *CompTIA Network+ N10-009 Cert Guide*, Kap. 6 â Secure a Network in a Cloud Environment
> - OpenSSH dokumentation: https://www.openssh.com/manual.html
> - UpCloud â SSH key authentication guide: https://upcloud.com/docs/guides/use-ssh-keys-authentication/
> - Ubuntu â System logs reference: https://ubuntu.com/server/docs/about-system-logging